MyBatis Plugin 拦截器

MyBatis自身提供了接口,支持在映射语句的某一点进行拦截做一些处理。所以在我们使用mybatis这个框架来做一些数据的持久化方面的操作的时候,有时候可能根据业务需要,在执行一次操作的过程中,做一些定制化操作。

Mybatis自定义插件针对Mybatis四大对象(Executor、StatementHandler 、ParameterHandler 、ResultSetHandler )进行拦截。

  1. Executor是 Mybatis的内部执行器,它负责调用StatementHandler操作数据库,并把结果集通过 ResultSetHandler进行自动映射,另外,他还处理了二级缓存的操作。从这里可以看出,我们也是可以通过插件来实现自定义的二级缓存的。
  2. StatementHandler是Mybatis直接和数据库执行sql脚本的对象。另外它也实现了Mybatis的一级缓存。这里,我们可以使用插件来实现对一级缓存的操作(禁用等等)。
  3. ParameterHandler是Mybatis实现Sql入参设置的对象。插件可以改变我们Sql的参数默认设置。
  4. 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  倒着执行的。。。

下面是拦截器 修改值的实例

发布了69 篇原创文章 · 获赞 5 · 访问量 2208

猜你喜欢

转载自blog.csdn.net/qq_42139889/article/details/103967442