学一个东西我们首先要弄清楚它的使用场景 ,不然毫无意义。下面首先介绍 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