springboot+mybatis-plus拦截所有的SQL执行,将SQL保存到SQL执行历史表中。
时间: 2023-06-24 18:07:15 浏览: 141
可以通过实现 Mybatis 的 `Interceptor` 接口来拦截所有的 SQL 执行,然后在拦截器中将 SQL 保存到历史表中。
下面是一个基于 Spring Boot 和 Mybatis-Plus 的示例代码:
1. 创建拦截器类 `SqlHistoryInterceptor`
```java
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;
import java.util.Properties;
@Intercepts({
@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),
@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, org.apache.ibatis.session.RowBounds.class, org.apache.ibatis.session.ResultHandler.class})
})
public class SqlHistoryInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
Object parameter = null;
if (invocation.getArgs().length > 1) {
parameter = invocation.getArgs()[1];
}
BoundSql boundSql = mappedStatement.getBoundSql(parameter);
String sql = boundSql.getSql();
// 将 sql 保存到历史表中
// ...
return PluginUtils.realTarget(invocation.getTarget()).execute(invocation.getMethod(), invocation.getArgs());
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// do nothing
}
}
```
2. 配置拦截器
在 `application.properties` 中配置拦截器:
```
mybatis-plus.configuration.interceptors=cn.example.SqlHistoryInterceptor
```
这样就可以在 Mybatis-Plus 中使用自定义的拦截器了。当应用执行 SQL 时,`SqlHistoryInterceptor` 就会拦截并将 SQL 保存到历史表中。
阅读全文