日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

瀏覽:29日期: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 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲在线一区| 美女视频黄久久| 日韩和欧美一区二区| 999国产精品永久免费视频app| 成人午夜在线| 激情综合婷婷| 98精品久久久久久久| 色爱综合网欧美| 日韩欧美一区免费| www成人在线视频| 毛片在线网站| 久久uomeier| 国产一区二区三区四区| 国产成人精品999在线观看| 精品国产美女a久久9999| 高清一区二区三区av| 中文在线а√在线8| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 国产精品日本一区二区三区在线| 国产三级精品三级在线观看国产| 欧美激情一区| 欧美日韩免费观看视频| 伊人影院久久| 日本麻豆一区二区三区视频| 久久精品国产久精国产| 97精品一区二区| 日韩精品影视| 亚洲人成亚洲精品| 麻豆成人综合网| 亚洲h色精品| 免费人成在线不卡| 国产精品地址| se01亚洲视频| 免费在线观看视频一区| 国产美女久久| 久久高清免费| 日本在线一区二区三区| 成人污污视频| av不卡在线| 日韩av一区二区三区| 精品精品99| 精品1区2区3区4区| 国产日韩视频在线| 久久理论电影| 国产欧美日韩亚洲一区二区三区| 麻豆mv在线观看| 蜜臀久久99精品久久久久久9| 国产美女撒尿一区二区| www.51av欧美视频| 老牛影视一区二区三区| 久久精品福利| 国产亚洲一区在线| 美日韩一区二区三区| 黄色不卡一区| 国产精品v亚洲精品v日韩精品| 999久久久91| 国产乱码精品一区二区三区亚洲人| 99在线精品视频在线观看| 国产毛片久久| 亚洲精品人人| 国产亚洲一区二区手机在线观看| 亚洲精品无播放器在线播放| 亚洲深夜视频| 蜜臀av一区二区在线免费观看 | 亚洲乱码视频| 少妇久久久久| 国产精品a级| 视频精品一区二区| 黄毛片在线观看| 热久久久久久| 欧美日韩国产一区精品一区| 精品视频一区二区三区在线观看| 亚洲网址在线观看| 亚洲性图久久| 久久av偷拍| 中文字幕一区二区三区在线视频| 日韩在线短视频| 久久久久97| 日韩三级一区| 欧美专区一区二区三区| 欧美影院三区| 三上悠亚国产精品一区二区三区 | 一区二区三区四区日韩| 久久在线免费| 国产黄大片在线观看| 国产色99精品9i| 香蕉久久国产| 久久精品123| 国产一卡不卡| 亚洲一区二区日韩| 欧美日韩国产一区精品一区| 日韩欧美精品一区| 久久男人av| 国产精品一区2区3区| 亚洲免费影视| 蜜臀91精品国产高清在线观看| 97人人精品| 精品三区视频| 欧美片第1页综合| 日韩精品成人| 日韩欧美久久| 亚洲精选久久| 亚洲免费婷婷| 免费一二一二在线视频 | 国产福利一区二区三区在线播放| 综合欧美精品| 视频一区在线播放| 午夜在线视频观看日韩17c| 国产日韩一区二区三区在线| 91视频一区| 激情五月色综合国产精品| 国产高清精品二区| 精品国产三区在线| 国产精品二区影院| 国产精品一站二站| 国产日韩在线观看视频| 欧美日本三区| 综合视频一区| 日韩精品导航| 欧美日韩中文| 国产精品亚洲四区在线观看| 国产欧美日韩精品高清二区综合区 | 国产欧美日韩一区二区三区在线| 香蕉久久久久久| 亚洲一区二区小说| 日韩中文欧美在线| 欧美专区在线| 日本伊人午夜精品| 国产探花在线精品一区二区| 国产欧美一区二区三区米奇 | 日韩国产在线不卡视频| 日韩欧美高清一区二区三区| 日韩一二三区在线观看| 国产日韩免费| 国产精品精品| 久久婷婷亚洲| 中文欧美日韩| 亚洲深夜福利在线观看| 日韩一区中文| 日韩av资源网| 麻豆精品国产91久久久久久| 久久香蕉网站| 999国产精品| 蜜桃久久精品一区二区| 免费看日韩精品| 日韩免费精品| 国产精品黄网站| 国产不卡一区| 日韩精品一区二区三区免费观影 | 国产精品蜜芽在线观看| 日韩理论片av| 欧美在线亚洲| 99亚洲视频| 日韩一区二区三区精品| 国产精品成人一区二区网站软件| 国产一区二区三区不卡视频网站| 成人va天堂| 久久国产成人| 国产色噜噜噜91在线精品| 国内精品伊人| 欧美日韩黑人| 深夜福利亚洲| 国产精品成人**免费视频| 精品视频免费| 久久精品1区| 亚洲午夜免费| 精品成av人一区二区三区| 99久精品视频在线观看视频| 日韩亚洲精品在线| 日韩精品免费观看视频| 久久精品国产99| 激情五月综合网| 亚洲精品黄色| 精品中文在线| 99视频精品| 国产精品啊啊啊| 日韩亚洲一区在线| 丝瓜av网站精品一区二区 | 蜜桃精品视频| 99精品在线观看| 亚洲精品系列| 精品国产美女a久久9999| 不卡一区2区| 国产精品夜夜夜| 国模 一区 二区 三区| 亚洲免费成人av在线| 国产一区二区精品久| 国产亚洲一区在线| 欧美成人精品一级| 成人羞羞视频播放网站| 亚洲精品乱码久久久久久蜜桃麻豆 | 蜜桃视频免费观看一区| 国产精品久久久久久久久久妞妞| 高清不卡亚洲| 日韩av在线免费观看不卡| 精品成人免费一区二区在线播放| 中文字幕一区二区三区在线视频| 国产精品精品| 日本亚洲视频在线| 欧美三级网址|