学一个东西我们首先要弄清楚它的使用场景 ,不然毫无意义。下面首先介绍 mybatis 插件的使用场景,然后再介绍如何使用,最后是它的原理 。
实现 org.apache.ibatis.plugin.Interceptor
接口,并指明要拦截 Mybatis 哪个类的哪个方法,然后把其注册到 mybatis 插件中就可以了。
Mybatis拦截器只能拦截Executor、ParameterHandler、StatementHandler、ResultSetHandler四个对象里面的方法。
可拦截对象 | 解释 |
---|---|
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 ]
https://gitee.com/sanri/example/tree/master/test-mybatis
Excel 通用导入导出,支持 Excel 公式
https://blog.csdn.net/sanri1993/article/details/100601578使用模板代码 ,从数据库生成代码 ,及一些项目中经常可以用到的小工具
https://blog.csdn.net/sanri1993/article/details/98664034