MyBatis-自定义插件-统计慢sql语句

需求:统计慢sql语句

1、实现自己的插件类

//  监听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")));
    }
}


2、将此插件注入到MyBatisConfig中

有两种方式:

  • xml注入
  • java代码注入


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 条评论) “”
   
验证码:

相关文章

推荐文章