學一個東西咱們首先要弄清楚它的使用場景 ,否則毫無心義。下面首先介紹 mybatis 插件的使用場景,而後再介紹如何使用,最後是它的原理 。java
實現 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類型的集合; |
@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緩存