介绍
Mybatis提供插件(plugin)功能,在实际中一般称为拦截器。
可以拦截的方法如下:
- Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed):拦截执行器的方法
- ParameterHandler (getParameterObject, setParameters):拦截参数处理方法
- ResultSetHandler (handleResultSets, handleOutputParameters):拦截结果集处理方法
- StatementHandler (prepare, parameterize, batch, update, query)
:拦截SQL构建方法
目前已知的使用场景
- 分页
- 查看执行的SQL
接口源码
interceptor方法用于处理代理类的执行。
public interface Interceptor {
//实际调用需要拦截的方法的时候
Object intercept(Invocation invocation) throws Throwable;
//对于Executor是在获取SqlSession阶段,调用
plugin,plugin方法用于某些处理器(Handler)的构建过程
Object plugin(Object target);
void setProperties(Properties properties);//解析xml阶段(及构建SqlSessionFactory阶段)调用该方法,将在xml配置的属性通过这个方法设置进来。
}
这里只三个方法,Mybatis中没有具体实现。
官网示例介绍:
@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
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);
}
public void setProperties(Properties properties) {
}
}
xml配置:
<plugins>
<plugin interceptor="org.format.mybatis.cache.interceptor.ExamplePlugin"></plugin>
</plugins>
拦截器拦截Executor接口的update方法(其实也就是SqlSession的新增,删除,修改操作),所有执行executor的update方法都会被该拦截器拦截到
源码分析
解析插件
从xml开始解析
XMLConfigBuilder.java
private void pl