|
@@ -0,0 +1,123 @@
|
|
|
+package com.fjhx.email.config.mybatis;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+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.Interceptor;
|
|
|
+import org.apache.ibatis.plugin.Intercepts;
|
|
|
+import org.apache.ibatis.plugin.Invocation;
|
|
|
+import org.apache.ibatis.plugin.Signature;
|
|
|
+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.type.TypeHandlerRegistry;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.sql.Statement;
|
|
|
+import java.text.DateFormat;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 打印执行的sql日志
|
|
|
+ */
|
|
|
+@Intercepts({
|
|
|
+ @Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}),
|
|
|
+ @Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),
|
|
|
+ @Signature(type = StatementHandler.class, method = "batch", args = {Statement.class})
|
|
|
+})
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+public class SqlLogInterceptor implements Interceptor {
|
|
|
+
|
|
|
+ @Value("${spring.profiles.active}")
|
|
|
+ private String active;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Object intercept(Invocation invocation) throws Throwable {
|
|
|
+ if (!"dev".equals(active)) {
|
|
|
+ return invocation.proceed();
|
|
|
+ }
|
|
|
+
|
|
|
+ long start = System.currentTimeMillis();
|
|
|
+ Object result = invocation.proceed();
|
|
|
+ long end = System.currentTimeMillis();
|
|
|
+
|
|
|
+ StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget());
|
|
|
+ MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
|
|
|
+ MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
|
|
|
+ BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql");
|
|
|
+ String sql = boundSql.getSql().replaceAll("\\s+", " ").toLowerCase();
|
|
|
+
|
|
|
+ List<ParameterMapping> parameterMappings = new ArrayList<>(boundSql.getParameterMappings());
|
|
|
+ Object parameterObject = boundSql.getParameterObject();
|
|
|
+ if (parameterMappings.isEmpty() && parameterObject == null) {
|
|
|
+ log.warn("parameterMappings is empty or parameterObject is null");
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ Configuration configuration = mappedStatement.getConfiguration();
|
|
|
+ TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
|
|
|
+
|
|
|
+ try {
|
|
|
+ String parameter = "";
|
|
|
+ MetaObject newMetaObject = configuration.newMetaObject(parameterObject);
|
|
|
+ for (ParameterMapping parameterMapping : parameterMappings) {
|
|
|
+ if (Objects.equals(parameterMapping.getMode(), ParameterMode.OUT)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String propertyName = parameterMapping.getProperty();
|
|
|
+ if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
|
|
|
+ parameter = getParameterValue(parameterObject);
|
|
|
+ } else if (newMetaObject.hasGetter(propertyName)) {
|
|
|
+ parameter = getParameterValue(newMetaObject.getValue(propertyName));
|
|
|
+ } else if (boundSql.hasAdditionalParameter(propertyName)) {
|
|
|
+ parameter = getParameterValue(boundSql.getAdditionalParameter(propertyName));
|
|
|
+ }
|
|
|
+
|
|
|
+ sql = sql.replaceFirst("\\?", parameter);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 打印 sql
|
|
|
+ log.info("\n==================== Sql Start ===================="
|
|
|
+ + "\n mapper : {}"
|
|
|
+ + "\n execute sql : {}"
|
|
|
+ + "\n execute time : {} ms"
|
|
|
+ + "\n==================== Sql End ====================\n",
|
|
|
+ mappedStatement.getId(), sql, end - start);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("intercept sql error: {}", sql, e);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取参数
|
|
|
+ *
|
|
|
+ * @param obj Object类型参数
|
|
|
+ * @return 转换之后的参数
|
|
|
+ */
|
|
|
+ private String getParameterValue(Object obj) {
|
|
|
+ String value;
|
|
|
+ if (obj instanceof String) {
|
|
|
+ value = "'" + obj + "'";
|
|
|
+ } else if (obj instanceof Date) {
|
|
|
+ DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA);
|
|
|
+ value = "'" + formatter.format(new Date()) + "'";
|
|
|
+ } else {
|
|
|
+ if (obj != null) {
|
|
|
+ value = obj.toString();
|
|
|
+ } else {
|
|
|
+ value = "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return value.replace("$", "\\$");
|
|
|
+ }
|
|
|
+
|
|
|
+}
|