当前位置:Gxlcms > 数据库问题 > MyBatis打印SQL执行时间

MyBatis打印SQL执行时间

时间:2021-07-01 10:21:17 帮助过:25人阅读

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,
  method = "update",
  args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
  public Object intercept(Invocation invocation) throws Throwable {
    return invocation.proceed();
  }
  public Object plugin(Object target) {
    return Plugin.wrap(target, this);
  }
  public void setProperties(Properties properties) {
  }
}
技术图片 技术图片
<!-- mybatis-config.xml -->
<plugins>
  <plugin interceptor="org.mybatis.example.ExamplePlugin">
    <property name="someProperty" value="100"/>
  </plugin>
</plugins>
技术图片

The plug-in above will intercept all calls to the "update" method on the Executor instance, which is an internal object responsible for the low level execution of mapped statements.

NOTE Overriding the Configuration Class

In addition to modifying core MyBatis behaviour with plugins, you can also override the Configuration class entirely. Simply extend it and override any methods inside, and pass it into the call to the SqlSessionFactoryBuilder.build(myConfig) method. Again though, this could have a severe impact on the behaviour of MyBatis, so use caution.

 

2、定义一个Interceptor

技术图片
 1 package com.cjs.boot.interceptor;
 2 
 3 import lombok.extern.slf4j.Slf4j;
 4 import org.apache.ibatis.executor.statement.StatementHandler;
 5 import org.apache.ibatis.mapping.BoundSql;
 6 import org.apache.ibatis.plugin.*;
 7 import org.apache.ibatis.session.ResultHandler;
 8 
 9 import java.sql.Statement;
10 import java.util.Properties;
11 
12 @Slf4j
13 @Intercepts({@Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class})})
14 public class SqlStatementInterceptor implements Interceptor {
15     @Override
16     public Object intercept(Invocation invocation) throws Throwable {
17         long startTime = System.currentTimeMillis();
18         try {
19             return invocation.proceed();
20         } finally {
21             long endTime = System.currentTimeMillis();
22 
23             StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
24             BoundSql boundSql = statementHandler.getBoundSql();
25             String sql = boundSql.getSql();
26             sql = sql.replace("\n", "").replace("\t", "").replaceAll("\\s+", " ");
27 
28             log.info("执行SQL: [{}]花费{}ms", sql, (endTime - startTime));
29 
30         }
31     }
32 
33     @Override
34     public Object plugin(Object target) {
35         return Plugin.wrap(target, this);
36     }
37 
38     @Override
39     public void setProperties(Properties properties) {
40 
41     }
42 }
技术图片

2、配置SqlSessionFactory

技术图片
 1 package com.cjs.boot.config;
 2 
 3 import com.cjs.boot.interceptor.SqlStatementInterceptor;
 4 import org.apache.ibatis.plugin.Interceptor;
 5 import org.apache.ibatis.session.SqlSessionFactory;
 6 import org.mybatis.spring.SqlSessionFactoryBean;
 7 import org.springframework.context.annotation.Bean;
 8 import org.springframework.context.annotation.Configuration;
 9 import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
10 
11 import javax.annotation.Resource;
12 import javax.sql.DataSource;
13 
14 @Configuration
15 public class MyBatisConfig {
16 
17     @Resource
18     private DataSource dataSource;
19 
20     @Bean
21     public SqlSessionFactory sqlSessionFactory() throws Exception {
22         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
23         sqlSessionFactoryBean.setDataSource(dataSource);
24         sqlSessionFactoryBean.setPlugins(new Interceptor[]{new SqlStatementInterceptor()});
25         PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver = new PathMatchingResourcePatternResolver();
26         sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources("classpath:mapper/*Mapper.xml"));
27         sqlSessionFactoryBean.setTypeAliasesPackage("com.cjs.boot.domain.entity");
28         return sqlSessionFactoryBean.getObject();
29     }
30 
31 }
技术图片

3、运行效果

技术图片
2018-05-09 13:53:55.589 DEBUG 10988 --- [nio-8080-exec-2] c.c.b.m.C.selectByMerchantId             : ==>  Preparing: SELECT id, merchant_id, coupon_name, coupon_type, par_value, quantity, release_start_time, release_end_time, limit_type, limit_num, remark, create_time, update_time, yn FROM coupon_info WHERE merchant_id = ? 
2018-05-09 13:53:55.605 DEBUG 10988 --- [nio-8080-exec-2] c.c.b.m.C.selectByMerchantId             : ==> Parameters: 10009(Integer)
2018-05-09 13:53:55.619 DEBUG 10988 --- [nio-8080-exec-2] c.c.b.m.C.selectByMerchantId             : <==      Total: 0
2018-05-09 13:53:55.620  INFO 10988 --- [nio-8080-exec-2] c.c.b.i.SqlStatementInterceptor          : 执行SQL: [SELECT id, merchant_id, coupon_name, coupon_type, par_value, quantity, release_start_time, release_end_time, limit_type, limit_num, remark, create_time, update_time, yn FROM coupon_info WHERE merchant_id = ?]花费15ms
技术图片

4、补充

4.1、@Signature注解的那几个参数该怎么写

前面文档中说了,可以拦截那四个接口。本例中,我只想拦截查询的SQL,所以我选择拦截StatementHandler的query方法

技术图片
package org.apache.ibatis.executor.statement;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.session.ResultHandler;

public interface StatementHandler {
    Statement prepare(Connection var1, Integer var2) throws SQLException;

    void parameterize(Statement var1) throws SQLException;

    void batch(Statement var1) throws SQLException;

    int update(Statement var1) throws SQLException;

    <E> List<E> query(Statement var1, ResultHandler var2) throws SQLException;

    <E> Cursor<E> queryCursor(Statement var1) throws SQLException;

    BoundSql getBoundSql();

    ParameterHandler getParameterHandler();
}
技术图片

所以,@Signature注解中,type表示拦截的接口,method表示接口中的方法,而参数就是该方法的参数

4.2、截图

技术图片

MyBatis打印SQL执行时间

标签:llb   plugin   rgs   bre   ndt   signature   data   hand   cti   

人气教程排行