需求:统计慢sql语句
// 监听StatementHandler的parameterize方法
@Intercepts(value = {@Signature(type = StatementHandler.class,
method = "parameterize", args = {Statement.class})})
public class MyInterceptor implements Interceptor {
private long time;
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("执行操作");
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
BoundSql boundSql = statementHandler.getBoundSql();
long before = System.currentTimeMillis();
// 执行语句
Object proceed = invocation.proceed();
long after = System.currentTimeMillis();
if ((after-before) > time) {
System.out.println("该{"+boundSql.getSql()+"}的执行时间为:"+(after - before));
}
System.out.println("sql执行时间:"+(after-before));
return proceed;
}
//获取到拦截的对象,底层也是通过代理实现的,实际上是拿到一个目标代理对象
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
this.time = Long.parseLong(String.valueOf(properties.get("time")));
}
}有两种方式:
xml注入
java代码注入
1、Bean注入
@Configuration
public class MyBatisConfig {
@Bean
public MyInterceptor myInterceptor() {
MyInterceptor myInterceptor = new MyInterceptor();
Properties properties = new Properties();
properties.setProperty("time", "1000");
myInterceptor.setProperties(properties);
return myInterceptor;
}
}2、拦截链注入
@org.springframework.context.annotation.Configuration
public class MapperConfig {
//将插件加入到mybatis插件拦截链中
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(Configuration configuration) {
//插件拦截链采用了责任链模式,执行顺序和加入连接链的顺序有关
MyInterceptor myInterceptor = new MyInterceptor();
//设置参数,比如阈值等,可以在配置文件中配置,这里直接写死便于测试
Properties properties = new Properties();
//这里设置慢查询阈值为1毫秒,便于测试
properties.setProperty("time", "1");
myInterceptor.setProperties(properties);
configuration.addInterceptor(myInterceptor);
}
};
}
}如有帮助,请点个赞,谢谢!
| 留言与评论(共有 0 条评论) “” |