网络知识 娱乐 MyBatis-自定义插件-统计慢sql语句

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

需求:统计慢sql语句

1、实现自己的插件类

// 监听StatementHandler的parameterize方法n@Intercepts(value = {@Signature(type = StatementHandler.class,n method = "parameterize", args = {Statement.class})})npublic class MyInterceptor implements Interceptor {n private long time;n @Overriden public Object intercept(Invocation invocation) throws Throwable {n System.out.println("执行操作");n StatementHandler statementHandler = (StatementHandler) invocation.getTarget();n BoundSql boundSql = statementHandler.getBoundSql();n long before = System.currentTimeMillis();n // 执行语句n Object proceed = invocation.proceed();n long after = System.currentTimeMillis();n if ((after-before) > time) {n System.out.println("该{"+boundSql.getSql()+"}的执行时间为:"+(after - before));n }n System.out.println("sql执行时间:"+(after-before));n return proceed;n }nn //获取到拦截的对象,底层也是通过代理实现的,实际上是拿到一个目标代理对象n @Overriden public Object plugin(Object target) {n return Plugin.wrap(target, this);n }nn @Overriden public void setProperties(Properties properties) {n this.time = Long.parseLong(String.valueOf(properties.get("time")));n }n}


2、将此插件注入到MyBatisConfig中

有两种方式:

  • xml注入
  • java代码注入


xml注入

<plugins>n <plugin interceptor="com.mybatis.mapper.MyInterceptor">n <property name="time" value="1000"/>n </plugin>n </plugins>


java代码注入

1、Bean注入

@Configurationnpublic class MyBatisConfig {nn @Beann public MyInterceptor myInterceptor() {n MyInterceptor myInterceptor = new MyInterceptor();n Properties properties = new Properties();n properties.setProperty("time", "1000");n myInterceptor.setProperties(properties);n return myInterceptor;n }n}

2、拦截链注入

@org.springframework.context.annotation.Configurationnpublic class MapperConfig {n //将插件加入到mybatis插件拦截链中n @Beann public ConfigurationCustomizer configurationCustomizer() {n return new ConfigurationCustomizer() {n @Overriden public void customize(Configuration configuration) {n //插件拦截链采用了责任链模式,执行顺序和加入连接链的顺序有关n MyInterceptor myInterceptor = new MyInterceptor();n //设置参数,比如阈值等,可以在配置文件中配置,这里直接写死便于测试n Properties properties = new Properties();n //这里设置慢查询阈值为1毫秒,便于测试n properties.setProperty("time", "1");n myInterceptor.setProperties(properties);n configuration.addInterceptor(myInterceptor);n }n };n }n}


如有帮助,请点个赞,谢谢!