首页>代码>Spring Boot简单而又强大的AOP异步日志注解系统>/logAnnotate/src/main/java/com/dai/config/SqlPrintInterceptor.java
package com.dai.config; import lombok.extern.slf4j.Slf4j; 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 java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import java.util.Properties; import java.util.regex.Matcher; /** * <p>配置拦截 SQL语句</p> * <p>2019-12-07 19:59</p> * * @author Dai Yuanchuan **/ @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}) }) @SuppressWarnings({"unchecked", "rawtypes"}) @Slf4j public class SqlPrintInterceptor implements Interceptor { private static final DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Override public Object intercept(Invocation invocation) throws Throwable { // 获取xml中的一个 select/update/insert/delete节点,主要描述的是一条SQL语句 MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; Object parameterObject = null; // 获取参数,if语句成立,表示sql语句有参数,参数格式是map形式 if (invocation.getArgs().length > 1) { parameterObject = invocation.getArgs()[1]; } long start = System.currentTimeMillis(); Object result = invocation.proceed(); // 获取到节点的id,即sql语句的id String statementId = mappedStatement.getId(); // BoundSql就是封装myBatis最终产生的sql类 BoundSql boundSql = mappedStatement.getBoundSql(parameterObject); // 获取节点的配置 Configuration configuration = mappedStatement.getConfiguration(); // 获取到最终的sql语句 String sql = getSql(boundSql, parameterObject, configuration); long end = System.currentTimeMillis(); long timing = end - start; if (log.isInfoEnabled()) { log.info("执行sql耗时:" + timing + " ms" + " - id:" + statementId + " - Sql:"); log.info("语句:" + sql); } 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)); } }
最近下载更多
finklcool
2022年6月6日
暂无贡献等级
crosa_Don LV18
2022年6月2日
1234mama LV19
2022年4月5日
黑手疯狂 LV5
2022年1月17日
huaua7676 LV30
2021年11月18日
zzzzzzzzhasdas LV13
2021年11月9日
尹恒yingying LV18
2021年10月22日
ma406805131 LV15
2021年3月11日
zlylongyue LV1
2021年2月1日
zhugc111 LV10
2020年12月31日
最近浏览更多
fengst
6月18日
暂无贡献等级
Aban-beautiful
5月13日
暂无贡献等级
3334004690 LV10
3月7日
1358849392 LV21
1月22日
fellowfun LV12
2023年11月15日
漫步的海星 LV4
2023年9月21日
cwb6357123 LV6
2023年9月21日
skook7 LV2
2023年8月31日
1761434639 LV1
2023年7月2日
呵呵哈哈哈 LV10
2022年9月8日