tj
2025-06-05 2d549a04870d1315868a7cf19952b64e8071e711
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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);
    }
}