日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mybatis 实现SQL拦截并在控制台打印SQL和参数

發布時間:2025/3/20 数据库 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis 实现SQL拦截并在控制台打印SQL和参数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

注:可以攔截sql 執行時間,優化sql。并打印sql 以及參數

第一步:創建類:

SqlPrintInterceptor 并實現 Interceptor

該類如下:

package com.ra.common.plugin;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 java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Properties; import java.util.regex.Matcher; /** MyBatis 將mybatis要執行的sql攔截打印出來*/ @Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})}) public class SqlPrintInterceptor implements Interceptor{private static final Logger log = LoggerFactory.getLogger(SqlPrintInterceptor.class);private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Overridepublic Object intercept(Invocation invocation) throws Throwable {MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];Object parameterObject = null;if (invocation.getArgs().length > 1) {parameterObject = invocation.getArgs()[1];}long start = System.currentTimeMillis();Object result = invocation.proceed();String statementId = mappedStatement.getId();BoundSql boundSql = mappedStatement.getBoundSql(parameterObject);Configuration configuration = mappedStatement.getConfiguration();String sql = getSql(boundSql, parameterObject, configuration);long end = System.currentTimeMillis();long timing = end - start;//根據個人喜好看需要打印怎么sql,本人是打印打印??1s的if(log.isInfoEnabled() && timing>1000){log.info("執行sql耗時:" + timing + " ms" + " - id:" + statementId + " - Sql:" );log.info(" "+sql);}return result;}@Overridepublic Object plugin(Object target) {if (target instanceof Executor) {return Plugin.wrap(target, this);}return target;}@Overridepublic void setProperties(Properties properties) {}private String getSql(BoundSql boundSql, Object parameterObject, Configuration configuration) {String sql = boundSql.getSql().replaceAll("[\\s]+", " ");List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();if (parameterMappings != null) {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 {MetaObject metaObject = configuration.newMetaObject(parameterObject);value = metaObject.getValue(propertyName);}sql = replacePlaceholder(sql, value);}}}return sql;}private String replacePlaceholder(String sql, Object propertyValue) {String result;if (propertyValue != null) {if (propertyValue instanceof String) {result = "'" + propertyValue + "'";} else if (propertyValue instanceof Date) {result = "'" + DATE_FORMAT.format(propertyValue) + "'";} else {result = propertyValue.toString();}} else {result = "null";}return sql.replaceFirst("\\?", Matcher.quoteReplacement(result));} }

?

第二步:在mybatis-config.xml 文件加上

<plugins><!--監控 sql 埋點 分頁--><plugin interceptor="com.ra.common.plugin.SqlPrintInterceptor"></plugin> </plugins>

轉載于:https://my.oschina.net/huangguangsheng/blog/2987847

總結

以上是生活随笔為你收集整理的Mybatis 实现SQL拦截并在控制台打印SQL和参数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。