From b9939a1420913f6b49df76d9d928ba5a7d48226d Mon Sep 17 00:00:00 2001 From: lbw Date: Sat, 5 Aug 2023 22:24:04 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20dr?= =?UTF-8?q?uid=20log=20=E6=94=AF=E6=8C=81=E6=A0=B9=E6=8D=AE=E8=A1=A8?= =?UTF-8?q?=E5=90=8D=E8=B7=B3=E8=BF=87=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/mybatis/DruidSqlLogFilter.java | 46 ++++++++++++++++++- .../data/mybatis/PigxMybatisProperties.java | 8 ++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/DruidSqlLogFilter.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/DruidSqlLogFilter.java index 0919bcc3b..f1825b556 100644 --- a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/DruidSqlLogFilter.java +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/DruidSqlLogFilter.java @@ -16,23 +16,32 @@ package com.pig4cloud.pigx.common.data.mybatis; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.druid.DbType; import com.alibaba.druid.filter.FilterChain; import com.alibaba.druid.filter.FilterEventAdapter; import com.alibaba.druid.proxy.jdbc.JdbcParameter; +import com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl; import com.alibaba.druid.proxy.jdbc.ResultSetProxy; import com.alibaba.druid.proxy.jdbc.StatementProxy; import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure; import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; import com.alibaba.druid.util.StringUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Import; +import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.time.temporal.TemporalAccessor; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 打印可执行的 sql 日志 @@ -112,13 +121,27 @@ public class DruidSqlLogFilter extends FilterEventAdapter { if (StringUtils.isEmpty(sql)) { return; } + + String dbType = statement.getConnectionProxy().getDirectDataSource().getDbType(); + + // 判断表名是配置了匹配过滤 + if (CollUtil.isNotEmpty(properties.getSkipTable())) { + List skipTableList = properties.getSkipTable(); + + List tableNameList = getTablesBydruid(sql, dbType); + if (tableNameList.stream() + .anyMatch(tableName -> StrUtil.containsAnyIgnoreCase(tableName, + ArrayUtil.toArray(skipTableList, String.class)))) { + return; + } + } + int parametersSize = statement.getParametersSize(); List parameters = new ArrayList<>(parametersSize); for (int i = 0; i < parametersSize; ++i) { // 转换参数,处理 java8 时间 parameters.add(getJdbcParameter(statement.getParameter(i))); } - String dbType = statement.getConnectionProxy().getDirectDataSource().getDbType(); String formattedSql = SQLUtils.format(sql, DbType.of(dbType), parameters, FORMAT_OPTION); printSql(formattedSql, statement); } @@ -161,4 +184,25 @@ public class DruidSqlLogFilter extends FilterEventAdapter { } } + /** + * 从SQL中提取表名(sql中出现的所有表) + * @param sql sql语句 + * @param dbType dbType + * @return List + */ + public static List getTablesBydruid(String sql, String dbType) { + List result = new ArrayList(); + List stmtList = SQLUtils.parseStatements(sql, dbType); + for (SQLStatement stmt : stmtList) { + // 也可以用更精确的解析器,如MySqlSchemaStatVisitor + SchemaStatVisitor visitor = new SchemaStatVisitor(); + stmt.accept(visitor); + Map tables = visitor.getTables(); + for (TableStat.Name name : tables.keySet()) { + result.add(name.getName()); + } + } + return result; + } + } diff --git a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/PigxMybatisProperties.java b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/PigxMybatisProperties.java index 131871596..2ff06e0c1 100644 --- a/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/PigxMybatisProperties.java +++ b/pigx-common/pigx-common-data/src/main/java/com/pig4cloud/pigx/common/data/mybatis/PigxMybatisProperties.java @@ -4,6 +4,9 @@ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.context.config.annotation.RefreshScope; +import java.util.ArrayList; +import java.util.List; + /** * Mybatis 配置 * @@ -20,4 +23,9 @@ public class PigxMybatisProperties { */ private boolean showSql = true; + /** + * 跳过表 + */ + private List skipTable = new ArrayList<>(); + }