MyBatis自身提供了接口,支持在映射语句的某一点进行拦截做一些处理。所以在我们使用mybatis这个框架来做一些数据的持久化方面的操作的时候,有时候可能根据业务需要,在执行一次操作的过程中,做一些定制化操作。
Mybatis自定义插件针对Mybatis四大对象(Executor、StatementHandler 、ParameterHandler 、ResultSetHandler )进行拦截。
- Executor是 Mybatis的内部执行器,它负责调用StatementHandler操作数据库,并把结果集通过 ResultSetHandler进行自动映射,另外,他还处理了二级缓存的操作。从这里可以看出,我们也是可以通过插件来实现自定义的二级缓存的。
- StatementHandler是Mybatis直接和数据库执行sql脚本的对象。另外它也实现了Mybatis的一级缓存。这里,我们可以使用插件来实现对一级缓存的操作(禁用等等)。
- ParameterHandler是Mybatis实现Sql入参设置的对象。插件可以改变我们Sql的参数默认设置。
- ResultSetHandler是Mybatis把ResultSet集合映射成POJO的接口对象。我们可以定义插件对Mybatis的结果集自动映射进行修改。
config .xml中的配置
<!--拦截器 -->
<plugins>
<plugin interceptor="org.my.interceptors.MyInterceptor">
<property name="name" value="zs"/>
</plugin>
</plugins>
拦截器
package org.my.interceptors;
import java.sql.Statement;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
@Intercepts({
@Signature(type = StatementHandler.class,method = "query", args = { Statement.class,ResultHandler.class })
})
public class MyInterceptor implements Interceptor{
//拦截
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("拦截方法 intercept....");
Object proceed = invocation.proceed();//放行
System.out.println(proceed+"。。。。。");
return proceed;
}
@Override
public Object plugin(Object target) {//增强 功能 和 核心对象包裹起来
Object wrap = Plugin.wrap(target, this);
return wrap;
}
}
拦截器执行顺序:与其他拦截器 作区别:它是 拦截器3 拦截器2 拦截器1 倒着执行的。。。
下面是拦截器 修改值的实例