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监控
mybatis 拦截器获取sql语句:blog.csdn.net/u011625492/…
对@Repository注解的mybatis接口中的方法进行AOP拦截无效:blog.csdn.net/woshiren123…
Mybatis的核心实现Plugin、Interceptor :blog.csdn.net/alex_xfboy/…
解决问题:SpringBoot集成Mybatis自定义拦截器,实现拼接sql和修改(一) :
问题定位
Spring Aop 拦截dao层接口
中间遇到问题拦截类断点失败 拦截类失效 搜索问题的能力,方案的快速尝试和试错
代码库
强大且易用的操作日志记录系统,支持对象属性的变化分析。 gitee.com/xuzhouhou/O…