【basepro】mybatis实现sql拦截

mybatis实现sql拦截

pom文件

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.6</version>
        </dependency>

代码

@Component
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class SqlInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {

        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        //先拦截到RoutingStatementHandler,里面有个StatementHandler类型的delegate变量,其实现类是BaseStatementHandler,然后就到BaseStatementHandler的成员变量mappedStatement
        BoundSql boundSql = statementHandler.getBoundSql();
        //获取到原始sql语句
        String sql = statementHandler.getBoundSql().getSql();
        String mSql = sql;
        
		// 对sql进行处理
        try {
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
            String intercepFlag = StringUtil.isEmpty(request.getAttribute(ComCons.INTERCEP_FLAG + "_" + 
	            Thread.currentThread().getId())) ? "" : request.getAttribute(ComCons.INTERCEP_FLAG + "_" + 
	            Thread.currentThread().getId()).toString();
            if ("true".equals(intercepFlag)) {
                mSql = parseSql(sql);
            }
        } catch (Exception e) {
            //项目启动时,request获取不到,异常
        }

        //通过反射修改sql语句
        Field field = boundSql.getClass().getDeclaredField("sql");
        field.setAccessible(true);
        field.set(boundSql, mSql);
        return invocation.proceed();
    }
}
发布了38 篇原创文章 · 获赞 0 · 访问量 1152

猜你喜欢

转载自blog.csdn.net/qq_25046005/article/details/103863194
今日推荐