电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Mybatis打印替換占位符后的完整Sql教程

瀏覽:2日期:2023-10-22 11:48:10

利用mybtis插件打印完整的sql,將占位符?替換成實際值

import org.apache.ibatis.cache.CacheKey;import org.apache.ibatis.executor.Executor;import org.apache.ibatis.mapping.BoundSql;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.mapping.ParameterMapping;import org.apache.ibatis.mapping.ParameterMode;import org.apache.ibatis.plugin.*;import org.apache.ibatis.reflection.MetaObject;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.session.ResultHandler;import org.apache.ibatis.session.RowBounds;import org.apache.ibatis.type.TypeHandlerRegistry;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.Profile;import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Properties;/** * 打印sql * * @date 2019/1/14 20:13 */@Component@Profile({'dev', 'test'})@Intercepts({ @Signature(type = Executor.class, method = 'query', args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}), @Signature(type = Executor.class, method = 'query', args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.class, BoundSql.class}), @Signature(type = Executor.class, method = 'update', args = {MappedStatement.class, Object.class})})public class SqlInterceptor implements Interceptor { private static ThreadLocal<SimpleDateFormat> dateTimeFormatter = new ThreadLocal<SimpleDateFormat>() { @Override protected SimpleDateFormat initialValue() { return new SimpleDateFormat('yyyy-MM-dd HH:mm:ss'); } }; @Override public Object intercept(Invocation invocation) throws Throwable { Object result = null; //捕獲掉異常,不要影響業務 try { MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; Object parameter = null; if (invocation.getArgs().length > 1) { parameter = invocation.getArgs()[1]; } String sqlId = mappedStatement.getId(); BoundSql boundSql = mappedStatement.getBoundSql(parameter); Configuration configuration = mappedStatement.getConfiguration(); long startTime = System.currentTimeMillis(); try { result = invocation.proceed(); } finally { long endTime = System.currentTimeMillis(); long sqlCostTime = endTime - startTime; String sql = this.getSql(configuration, boundSql); this.formatSqlLog(sqlId, sql, sqlCostTime, result); } return result; } catch (Exception e) { return result; } } @Override public Object plugin(Object target) { if (target instanceof Executor) { return Plugin.wrap(target, this); } return target; } @Override public void setProperties(Properties properties) { } /** * 獲取完整的sql語句 * * @param configuration * @param boundSql * @return */ private String getSql(Configuration configuration, BoundSql boundSql) { // 輸入sql字符串空判斷 String sql = boundSql.getSql(); if (StringUtil.isEmpty(sql)) { return ''; } return formatSql(sql, configuration, boundSql); } /** * 將占位符替換成參數值 * * @param sql * @param configuration * @param boundSql * @return */ private String formatSql(String sql, Configuration configuration, BoundSql boundSql) { //美化sql sql = beautifySql(sql); //填充占位符, 目前基本不用mybatis存儲過程調用,故此處不做考慮 Object parameterObject = boundSql.getParameterObject(); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); List<String> parameters = new ArrayList<>(); if (parameterMappings != null) { MetaObject metaObject = parameterObject == null ? null : configuration.newMetaObject(parameterObject); for (int i = 0; i < parameterMappings.size(); i++) { ParameterMapping parameterMapping = parameterMappings.get(i); if (parameterMapping.getMode() != ParameterMode.OUT) { // 參數值 Object value; String propertyName = parameterMapping.getProperty(); // 獲取參數名稱 if (boundSql.hasAdditionalParameter(propertyName)) { // 獲取參數值 value = boundSql.getAdditionalParameter(propertyName); } else if (parameterObject == null) { value = null; } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { // 如果是單個值則直接賦值 value = parameterObject; } else { value = metaObject == null ? null : metaObject.getValue(propertyName); } if (value instanceof Number) { parameters.add(String.valueOf(value)); } else { StringBuilder builder = new StringBuilder(); builder.append('’'); if (value instanceof Date) { builder.append(dateTimeFormatter.get().format((Date) value)); } else if (value instanceof String) { builder.append(value); } builder.append('’'); parameters.add(builder.toString()); } } } } for (String value : parameters) { sql = sql.replaceFirst('?', value); } return sql; } /** * 格式化sql日志 * * @param sqlId * @param sql * @param costTime * @return */ private void formatSqlLog(String sqlId, String sql, long costTime, Object obj) { String sqlLog = '==> ' + sql; StringBuffer result = new StringBuffer(); if (obj instanceof List) { List list = (List) obj; int count = list.size(); result.append('<== Total: ' + count); } else if (obj instanceof Integer) { result.append('<== Total: ' + obj); } result.append(' Spend Time ==> ' + costTime + ' ms'); Logger log = LoggerFactory.getLogger(sqlId); log.info(sqlLog); log.info(result.toString()); } public static String beautifySql(String sql) { sql = sql.replaceAll('[sn ]+', ' '); return sql; }}

補充知識:Mybatis配置控制臺輸出SQL語句填充占位符

我們使用spring整合mybatis時候,希望根據控制臺輸出的sql語句來復制到Navicat等工具去測試,配置如下

在mybatis的配置文件mybatis-config.xml中配置

<configuration><!-- | 全局配置設置 | | 可配置選項 默認值, 描述 | | aggressiveLazyLoading true, 當設置為‘true’的時候,懶加載的對象可能被任何懶屬性全部加載。否則,每個屬性都按需加載。 | multipleResultSetsEnabled true, 允許和不允許單條語句返回多個數據集(取決于驅動需求) | useColumnLabel true, 使用列標簽代替列名稱。不同的驅動器有不同的作法。參考一下驅動器文檔,或者用這兩個不同的選項進行測試一下。 | useGeneratedKeys false, 允許JDBC 生成主鍵。需要驅動器支持。如果設為了true,這個設置將強制使用被生成的主鍵,有一些驅動器不兼容不過仍然可以執行。 | autoMappingBehavior PARTIAL, 指定MyBatis 是否并且如何來自動映射數據表字段與對象的屬性。PARTIAL將只自動映射簡單的,沒有嵌套的結果。FULL 將自動映射所有復雜的結果。 | defaultExecutorType SIMPLE, 配置和設定執行器,SIMPLE 執行器執行其它語句。REUSE 執行器可能重復使用prepared statements 語句,BATCH執行器可以重復執行語句和批量更新。 | defaultStatementTimeout null, 設置一個時限,以決定讓驅動器等待數據庫回應的多長時間為超時 | --><settings> <!-- 這個配置使全局的映射器啟用或禁用緩存 --> <setting name='cacheEnabled' value='true'/> <!-- 全局啟用或禁用延遲加載。當禁用時,所有關聯對象都會即時加載 --> <setting name='lazyLoadingEnabled' value='false'/> <setting name='multipleResultSetsEnabled' value='true'/> <setting name='useColumnLabel' value='true'/> <setting name='logImpl' value='STDOUT_LOGGING' /> <setting name='defaultExecutorType' value='REUSE'/> <setting name='defaultStatementTimeout' value='25000'/> <setting name='aggressiveLazyLoading' value='true'/> </settings> </configuration>

配置上面后就可以在控制臺輸出sql語句了,但是語句與條件會分開輸出,我們想填充sql語句的占位符的話需要再spring整合mybatis中加配置

Mybatis打印替換占位符后的完整Sql教程

只要添加這個即可<!-- Mybatis配置控制臺輸出SQL語句填充占位符-->

<!-- 性能攔截器,兼打印sql,不生產環境配置 --><bean class='com.baomidou.mybatisplus.plugins.PerformanceInterceptor'> <!-- SQL 執行最大時長,超過自動停止運行,有助于發現問題。 --> <property name='maxTime' value='100'></property></bean>

以上這篇Mybatis打印替換占位符后的完整Sql教程就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Mybatis 數據庫
相關文章:
主站蜘蛛池模板: 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 北京成考网-北京成人高考网 | 打包钢带,铁皮打包带,烤蓝打包带-高密市金和金属制品厂 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 我爱古诗词_古诗词名句赏析学习平台 | 舞台木地板厂家_体育运动木地板_室内篮球馆木地板_实木运动地板厂家_欧氏篮球地板推荐 | 全温度恒温培养摇床-大容量-立式-远红外二氧化碳培养箱|南荣百科 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 电主轴,车床电磨头,变频制动电机-博山鸿达特种电机 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 无菌检查集菌仪,微生物限度仪器-苏州长留仪器百科 | 成人纸尿裤,成人尿不湿,成人护理垫-山东康舜日用品有限公司 | 陶氏道康宁消泡剂_瓦克消泡剂_蓝星_海明斯德谦_广百进口消泡剂 | 综合管廊模具_生态,阶梯护坡模具_检查井模具制造-致宏模具厂家 | 代写标书-专业代做标书-商业计划书代写「深圳卓越创兴公司」 | 浙江工业冷却塔-菱电冷却塔厂家 - 浙江菱电冷却设备有限公司 | 江苏远邦专注皮带秤,高精度皮带秤,电子皮带秤研发生产 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 急救箱-应急箱-急救包厂家-北京红立方医疗设备有限公司 | 北京办公室装修,办公室设计,写字楼装修-北京金视觉装饰工程公司 北京成考网-北京成人高考网 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | SEO网站优化,关键词排名优化,苏州网站推广-江苏森歌网络 | 软启动器-上海能曼电气有限公司| 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 档案密集柜_手动密集柜_智能密集柜_内蒙古档案密集柜-盛隆柜业内蒙古密集柜直销中心 | GEDORE扭力螺丝刀-GORDON防静电刷-CHEMTRONICS吸锡线-上海卓君电子有限公司 | 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 高低温万能试验机-复合材料万能试验机-馥勒仪器 | 红酒招商加盟-葡萄酒加盟-进口红酒代理-青岛枞木酒业有限公司 | 粘弹体防腐胶带,聚丙烯防腐胶带-全民塑胶| 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 沈阳缠绕包装机厂家直销-沈阳海鹞托盘缠绕包装机价格 | 成都中天自动化控制技术有限公司| 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 上海赞永|