mybatis 的進階使用攔截器

文章思路

學一個東西咱們首先要弄清楚它的使用場景 ,否則毫無心義。下面首先介紹 mybatis 插件的使用場景,而後再介紹如何使用,最後是它的原理 。java

使用場景

  1. 首先是網上都在說的分頁插件,這個已經有人實現了,可使用 PageHelper 插件,咱們能夠學習它怎麼作的,但不必重複造輪子,直接用就能夠了
  2. 使用 mybatis 的時候發現若是是 PrepareStatement 的時候 ,sql 語句和參數是分開的,查找問題時很是不方便,這時候能夠自定義插件把整合後的 sql 打印在控制檯上。固然生產上須要關閉這個功能,由於不可能把大量的 sql 打印在日誌文件中。
  3. 統計慢查詢,能夠用 mybatis 插件,設置一個慢查詢閾值,把慢的 select 查詢發送到消息中間件或存儲在 mongodb 等,而後在頁面作一個慢查詢可視化來監控慢查詢。
  4. 數據權限,這個我在項目中用過,可使用 jsqlParser 來增長 sql 根據當前登陸用戶來追加查詢條件,而不用硬編碼在 sql 語句中。

如何使用

實現 org.apache.ibatis.plugin.Interceptor 接口,並指明要攔截 Mybatis 哪一個類的哪一個方法,而後把其註冊到 mybatis 插件中就能夠了。git

Mybatis攔截器只能攔截Executor、ParameterHandler、StatementHandler、ResultSetHandler四個對象裏面的方法。sql

可攔截對象 解釋
Executor MyBatis執行器,是MyBatis 調度的核心,負責SQL語句的生成和查詢緩存的維護
ParameterHandler 負責對用戶傳遞的參數轉換成JDBC Statement 所須要的參數
StatementHandler 封裝了JDBC Statement操做,負責對JDBC statement 的操做,如設置參數、將Statement結果集轉換成List集合
ResultSetHandler 負責將JDBC返回的ResultSet結果集對象轉換成List類型的集合;

快速使用,打印查詢方法執行時間

  1. 定義攔截器
  2. 註冊到 plugins 中,能夠註冊多個
@Intercepts(
        // 攔截 Executor.query 方法,不是查緩存那個
        @Signature(type = Executor.class,method = "query",args = {MappedStatement.class,Object.class, RowBounds.class, ResultHandler.class})
)
@Slf4j
public class TimeSpendInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        StopWatch stopWatch = new StopWatch();stopWatch.start();
        // Invocation 的參數是看攔截的方法來的,這裏 query 方法第一個參數是語句對象
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
        String id = mappedStatement.getId();
        Object proceed = null;
        try {
            proceed =  invocation.proceed();
        }finally {
            stopWatch.stop();
            log.info("sqlId:"+id+" 執行時間爲:"+stopWatch.getTime()+" ms");
        }
        return proceed;
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target,this);
    }
}
@Configuration
public class MybatisConfig {
    @Bean("timeSpendInterceptor")
    public Interceptor interceptor2(){
        return new TimeSpendInterceptor();
    }
}

最後成果:
[ sqlId:com.sanri.test.testmybatis.mapper.BatchMapper.selectAll 執行時間爲:548 ms ]mongodb

完整項目地址

https://gitee.com/sanri/example/tree/master/test-mybatis數據庫

一些小推廣

Excel 通用導入導出,支持 Excel 公式
https://blog.csdn.net/sanri1993/article/details/100601578apache

使用模板代碼 ,從數據庫生成代碼 ,及一些項目中常常能夠用到的小工具
https://blog.csdn.net/sanri1993/article/details/98664034緩存

相關文章
相關標籤/搜索