国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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 數據庫
相關文章:
主站蜘蛛池模板: 亚洲精品欧美 | 美女视频永久黄网站免费观看国产 | 手机看成人片 | 亚洲精品高清国产一久久 | 中文字幕日韩精品亚洲七区 | 日韩欧美自拍 | 绝对真实偷拍盗摄高清在线视频 | 一级国产在线观看高清 | 国产成人在线视频免费观看 | 韩国免又爽又刺激激情视频 | 精品国产1区 | 精品国产一区二区三区不卡蜜臂 | 看美女毛片| 中文字幕在线观看日韩 | 亚洲精品免费在线观看 | 99久久99久久精品免费看子 | 亚洲精品久久99久久一区 | 免费观看a毛片一区二区不卡 | 日韩国产成人精品视频 | 国产精品18久久久久久久久久 | 一区二区三区四区视频在线观看 | 精品国产九九 | 特级aaaaaaaaa毛片免费视频 | 亚洲一区二区在线 | 久久精品高清 | 亚洲欧美专区精品久久 | 国产成人精品三级 | 亚洲jjzzjjzz在线播放 | 久久久99精品免费观看精品 | 日韩亚洲欧美一区 | 一级毛片无毒不卡直接观看 | 亚洲欧美日韩国产精品26u | aa级毛片毛片免费观看久 | 亚洲综合久久久久久888 | 精品自拍视频在线观看 | 国产欧美在线视频 | 中文字幕在线观看网址 | ffyybb免费福利视频 | 美女视频黄a视频美女大全 美女视频黄a视频免费全程 | 国产国产人免费视频成69堂 | 亚洲精品综合一区在线 |