package com.qianwen.core.mp.plugins; 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.ResultSetProxy; import com.alibaba.druid.proxy.jdbc.StatementProxy; import com.alibaba.druid.sql.SQLUtils; import java.time.temporal.TemporalAccessor; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.qianwen.core.mp.props.MybatisPlusProperties; import com.qianwen.core.tool.utils.StringUtil; /* loaded from: blade-starter-mybatis-9.3.0.0-SNAPSHOT.jar:org/springblade/core/mp/plugins/SqlLogInterceptor.class */ public class SqlLogInterceptor extends FilterEventAdapter { private static final Logger log = LoggerFactory.getLogger(SqlLogInterceptor.class); private static final SQLUtils.FormatOption FORMAT_OPTION = new SQLUtils.FormatOption(false, false); //private static final List SQL_LOG_EXCLUDE = new ArrayList(Arrays.asList("new_param_json", "ACT_RU_JOB", "ACT_RU_TIMER_JOB")); private static final List SQL_LOG_EXCLUDE = new ArrayList<>(Arrays.asList(new String[] { "new_param_json", "ACT_RU_JOB", "ACT_RU_TIMER_JOB" })); private final MybatisPlusProperties properties; public SqlLogInterceptor(MybatisPlusProperties properties) { this.properties = properties; if (properties.getSqlLogExclude().size() > 0) { SQL_LOG_EXCLUDE.addAll(properties.getSqlLogExclude()); } } protected void statementExecuteBefore(StatementProxy statement, String sql) { statement.setLastExecuteStartNano(); } protected void statementExecuteBatchBefore(StatementProxy statement) { statement.setLastExecuteStartNano(); } protected void statementExecuteUpdateBefore(StatementProxy statement, String sql) { statement.setLastExecuteStartNano(); } protected void statementExecuteQueryBefore(StatementProxy statement, String sql) { statement.setLastExecuteStartNano(); } protected void statementExecuteAfter(StatementProxy statement, String sql, boolean firstResult) { statement.setLastExecuteTimeNano(); } protected void statementExecuteBatchAfter(StatementProxy statement, int[] result) { statement.setLastExecuteTimeNano(); } protected void statementExecuteQueryAfter(StatementProxy statement, String sql, ResultSetProxy resultSet) { statement.setLastExecuteTimeNano(); } protected void statementExecuteUpdateAfter(StatementProxy statement, String sql, int updateCount) { statement.setLastExecuteTimeNano(); } public void statement_close(FilterChain chain, StatementProxy statement) { try { if (!this.properties.getSqlLog().booleanValue()) { chain.statement_close(statement); return; } if (!log.isInfoEnabled()) { chain.statement_close(statement); return; } String sql = statement.getBatchSql(); if (StringUtil.isEmpty(sql)) { chain.statement_close(statement); return; } if (excludeSql(sql)) { chain.statement_close(statement); return; } int parametersSize = statement.getParametersSize(); List parameters = new ArrayList<>(parametersSize); for (int i = 0; i < parametersSize; i++) 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); chain.statement_close(statement); } catch (Throwable ex) { throw new RuntimeException(ex); } } private static Object getJdbcParameter(JdbcParameter jdbcParam) { if (jdbcParam == null) { return null; } Object value = jdbcParam.getValue(); if (value instanceof TemporalAccessor) { return value.toString(); } return value; } private static void printSql(String sql, StatementProxy statement) { log.info("\n\n============== Sql Start ==============\nExecute SQL : {}\nExecute Time: {}\n============== Sql End ==============\n", sql.trim(), StringUtil.format(statement.getLastExecuteTimeNano())); } private static boolean excludeSql(String sql) { for (String exclude : SQL_LOG_EXCLUDE) { if (sql.contains(exclude)) { return true; } } return false; } }