Mybatis 实现SQL拦截并在控制台打印SQL和参数
生活随笔
收集整理的這篇文章主要介紹了
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和参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图数据库并非要取代区块链,而是让区块链如
- 下一篇: 数据产品通用复合指标查询计算的实践