SpringBoot使用自定义Mybatis拦截器

3,381 阅读2分钟
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Locale;
import java.util.Properties;

@Component
@Intercepts({@Signature(type = Executor.class,method = "update",args = {MappedStatement.class,Object.class}),
        @Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class, ResultHandler.class})})
public class MybatisInterceptor implements Interceptor {

    /**
     * 正则匹配 insert、delete、update操作
     */
    private static final String REGEX = ".*insert\\\\u0020.*|.*delete\\\\u0020.*|.*update\\\\u0020.*";

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        //获取执行参数
        Object[] objects = invocation.getArgs();
        System.out.println("执行参数:" + objects);
        MappedStatement ms = (MappedStatement) objects[0];
        BoundSql boundSql = ms.getSqlSource().getBoundSql(objects[1]);
        System.out.println("00000000" + boundSql);
        String sql = boundSql.getSql().toLowerCase(Locale.CHINA).replace("[\\t\\n\\r]", " ");
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        Object parameterObject = boundSql.getParameterObject();
        System.out.println("打印SQL语句" + sql);
        System.out.println("999999999999"+ parameterMappings);
        System.out.println("8888888888888"+ parameterObject);

        //如果是insert、delete、update操作 使用主库
        if (sql.matches(REGEX)) {
            System.out.println("拦截执行数据库的请求:写请求");
        } else {
            //使用从库
            System.out.println("拦截执行数据库的请求:读请求");
        }
        //继续执行逻辑
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object o) {
        //获取代理权
        if (o instanceof Executor) {
            //如果是Executor(执行增删改查操作),则拦截下来
            return Plugin.wrap(o, this);
        } else {
            return o;
        }
    }

    @Override
    public void setProperties(Properties properties) {
        //读取mybatis配置文件中属性
    }
}

SpringBoot使用自定义Mybatis拦截器:www.pianshen.com/article/534…

SpringBoot拦截器中无法注入bean的解决方法:www.cnblogs.com/javafucker/…

SpringBoot使用自定义Mybatis拦截器:www.cnblogs.com/A-yes/p/106… 比较好

SpringBoot集成mybatis拦截器的实现 :blog.csdn.net/weixin_4222…

解决Spring Boot 拦截器注入service为空的问题: blog.csdn.net/weixin_4222…

SSM整合系列之 通过Mybatis拦截器获取SQL语句 实现SQL监控

blog.csdn.net/caiqing116/…

mybatis 拦截器获取sql语句:blog.csdn.net/u011625492/…

对@Repository注解的mybatis接口中的方法进行AOP拦截无效:blog.csdn.net/woshiren123…

Mybatis的核心实现Plugin、Interceptor :blog.csdn.net/alex_xfboy/…

解决问题:SpringBoot集成Mybatis自定义拦截器,实现拼接sql和修改(一) :

blog.csdn.net/qq_29653517…

问题定位

Spring Aop 拦截dao层接口

ask.csdn.net/questions/3…

代码:github.com/FoolishWall…

中间遇到问题拦截类断点失败 拦截类失效 搜索问题的能力,方案的快速尝试和试错

代码库

gitee.com/geekidea/up…

强大且易用的操作日志记录系统,支持对象属性的变化分析。 gitee.com/xuzhouhou/O…