mybatis打印完整sql语句

配置类:

package org.springblade.core.boot.config;
 
 
import com.baomidou.mybatisplus.core.toolkit.*;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.executor.statement.StatementHandler;
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.reflection.SystemMetaObject;
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 java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Statement;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
 
/**
 * 性能分析拦截器,用于输出每条 SQL 语句及其执行时间
 * 去除sql语句有问号
 * @author hu hongtao
 * @since 2019年12月16日23:51:14
 */
@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 PerformanceInterceptor  implements Interceptor {
 
   private static Log logger = LogFactory.getLog(PerformanceInterceptor.class);
 
   private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 
   @Override
   public Object intercept(Invocation invocation) throws Throwable {
      MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
      Object parameterObject = null;
      if (invocation.getArgs().length > 1) {
         parameterObject = invocation.getArgs()[1];
      }
      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();
      if (logger.isInfoEnabled()) {
         // 计算执行 SQL 耗时
         long start = SystemClock.now();
         long timing = SystemClock.now() - start;
         // 格式化 SQL 打印执行结果
         Object target = PluginUtils.realTarget(invocation.getTarget());
         MetaObject metaObject = SystemMetaObject.forObject(target);
         StringBuilder formatSql = new StringBuilder()
            .append(StringPool.NEWLINE)
            .append("Time:").append(timing)
            .append(" ms - ID:").append(statementId)
            .append(StringPool.NEWLINE).append("Execute SQL:")
            .append(SqlUtils.sqlFormat(sql, false)).append(StringPool.NEWLINE);
         logger.info(formatSql.toString());
      }
      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) {
   }
 
   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));
   }
}
 

然后查看效果:
————————————————
版权声明:本文为CSDN博主「龙虾大王」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35039748/article/details/103606807

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值