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();
}
}