package com.cloudroam.common.interceptor; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import com.baomidou.mybatisplus.core.toolkit.PluginUtils; import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.executor.parameter.ParameterHandler; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; @Slf4j public class SqlInterceptor extends JsqlParserSupport implements InnerInterceptor { @Override public boolean willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { System.out.println("willDoQuery"); System.out.println(); System.out.println(ms.getBoundSql(parameter).getSql()); return InnerInterceptor.super.willDoQuery(executor, ms, parameter, rowBounds, resultHandler, boundSql); } @Override public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { System.out.println("beforeQuery"); InnerInterceptor.super.beforeQuery(executor, ms, parameter, rowBounds, resultHandler, boundSql); } @Override public boolean willDoUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException { System.out.println("willDoUpdate"); return InnerInterceptor.super.willDoUpdate(executor, ms, parameter); } @Override public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException { System.out.println("beforeUpdate"); InnerInterceptor.super.beforeUpdate(executor, ms, parameter); } @Override public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) { System.out.println("beforePrepare"); System.out.println(sh.getBoundSql().getSql()); // 获取 BoundSql BoundSql boundSql = sh.getBoundSql(); // 获取带参数的原始 SQL String originalSql = boundSql.getSql(); // 获取参数处理器 ParameterHandler parameterHandler = sh.getParameterHandler(); // 获取参数值,这里会包含所有的参数值 Object parameterObject = parameterHandler.getParameterObject(); // 在这里可以将参数值与 SQL 结合起来,生成带参数值的 SQL // 例如,你可以使用 MyBatis 的工具类将参数值替换到 SQL 中 // / 将参数值替换到 SQL 中 String sqlWithParameterValues = originalSql.replaceAll("\\?", parameterObject.toString()); // String sqlWithParameterValues = MyBatisUtils.resolveSqlWithParameterValues(originalSql, parameterObject); // 在这里可以保存带参数值的原始 SQL 或进行其他自定义操作 System.out.println("Original SQL with Parameter Values: " + sqlWithParameterValues); InnerInterceptor.super.beforePrepare(sh, connection, transactionTimeout); } @Override public void setProperties(Properties properties) { System.out.println("setProperties"); InnerInterceptor.super.setProperties(properties); } }