加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

MyBatis打印SQL执行时间

发布时间:2020-12-14 18:05:05 所属栏目:大数据 来源:网络整理
导读:1、plugins MyBatis官网对于plugins的描述是这样的: MyBatis allows you to intercept calls to at certain points within the execution of a mapped statement. By default,MyBatis allows plug-ins to intercept method calls of: Executor (update,quer

1、plugins

MyBatis官网对于plugins的描述是这样的:

MyBatis allows you to intercept calls to at certain points within the execution of a mapped statement. By default,MyBatis allows plug-ins to intercept method calls of:

  • Executor (update,query,flushStatements,commit,rollback,getTransaction,close,isClosed)
  • ParameterHandler (getParameterObject,setParameters)
  • ResultSetHandler (handleResultSets,handleOutputParameters)
  • StatementHandler (prepare,parameterize,batch,update,query)

The details of these classes methods can be discovered by looking at the full method signature of each,and the source code which is available with each MyBatis release. You should understand the behaviour of the method you’re overriding,assuming you’re doing something more than just monitoring calls. If you attempt to modify or override the behaviour of a given method,you’re likely to break the core of MyBatis. These are low level classes and methods,so use plug-ins with caution.

Using plug-ins is pretty simple given the power they provide. Simply implement the Interceptor interface,being sure to specify the signatures you want to intercept.

// ExamplePlugin.java
@Intercepts({@Signature(
  type= Executor.class,method = "update"class,Object.})})
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);
  }
  void setProperties(Properties properties) {
  }
}
<!-- mybatis-config.xml -->
<plugins>
  plugin interceptor="org.mybatis.example.ExamplePlugin">
    property name="someProperty" value="100"/>
  </plugin>
>

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  org.apache.ibatis.executor.statement.StatementHandler;
 5  org.apache.ibatis.mapping.BoundSql;
 6 import org.apache.ibatis.plugin.*;
 7  org.apache.ibatis.session.ResultHandler;
 8 
 9  java.sql.Statement;
10  java.util.Properties;
11 
12 @Slf4j
13 @Intercepts({@Signature(type = StatementHandler.14 class SqlStatementInterceptor  Interceptor {
15     @Override
16      Throwable {
17         long startTime = System.currentTimeMillis();
18         try {
19              invocation.proceed();
20         } finally21             long endTime =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 34      Object plugin(Object target) {
35         36 37 
38 39      setProperties(Properties properties) {
40 
41 42 }

2、配置SqlSessionFactory

 com.cjs.boot.config;
 com.cjs.boot.interceptor.SqlStatementInterceptor;
 org.apache.ibatis.plugin.Interceptor;
 org.apache.ibatis.session.SqlSessionFactory;
 org.mybatis.spring.SqlSessionFactoryBean;
 org.springframework.context.annotation.Bean;
 8  org.springframework.context.annotation.Configuration;
 org.springframework.core.io.support.PathMatchingResourcePatternResolver;
10 
11  javax.annotation.Resource;
 javax.sql.DataSource;
13 
@Configuration
 MyBatisConfig {
16 
17     @Resource
18     private DataSource dataSource;
19 
20     @Bean
21     public SqlSessionFactory sqlSessionFactory()  Exception {
22         SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
23         sqlSessionFactoryBean.setDataSource(dataSource);
24         sqlSessionFactoryBean.setPlugins(new Interceptor[]{ SqlStatementInterceptor()});
25         PathMatchingResourcePatternResolver pathMatchingResourcePatternResolver =  PathMatchingResourcePatternResolver();
26         sqlSessionFactoryBean.setMapperLocations(pathMatchingResourcePatternResolver.getResources("classpath:mapper/*Mapper.xml"));
27         sqlSessionFactoryBean.setTypeAliasesPackage("com.cjs.boot.domain.entity"28          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,yn FROM coupon_info WHERE merchant_id = ?]花费15ms

4、补充

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

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

 org.apache.ibatis.executor.statement;

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

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

    void parameterize(Statement var1) void batch(Statement var1) int update(Statement var1)  SQLException;

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

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

    BoundSql getBoundSql();

    ParameterHandler getParameterHandler();
}

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

4.2、截图

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读