首先拦截器可以拦截mybatis四大核心对象:
StatementHandler,ParameterHandler,ResultSetHandler,Executor,具体拦截时根据需求拦截一部分方法

写拦截器分为三步:

1.定义拦截器实现拦截器接口,说明拦截什么

@Intercepts({
//说明拦截什么
@Signature(type= StatementHandler.class, method = "query",args = {Statement.class, ResultHandler.class})
})

2.编写拦截器方法

public class MyInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object proceed = invocation.proceed(); //放行方法,拿到返回值
System.out.println("拦截方法"+proceed);
return proceed;
} @Override
//将拦截器之中定义增强功能和原来的核心功能合并,
public Object plugin(Object target) {
Object wrap = Plugin.wrap(target, this); //合并
System.out.println(wrap);
return wrap;
}
@Override
public void setProperties(Properties properties) {
System.out.println("拿到的属性:"+properties);
}
}

3.进行配置

   <plugins>
<plugin interceptor="Interceptors.MyInterceptor">
<property name="name" value="张三"/>
<property name="loves" value="作画"/>
</plugin>
</plugins>

这样,当你运行指定方法时,他就会进行拦截,拦截分为两部分,一部分是setProperties和plugin方法,在发送请求的时候拦截,获取到值之后,返回的路上,用intercept拦截。

另外如果有多个拦截器,按照配置的顺序进行拦截。

下面是一个简单的拦截器实现:拦截查询时设置参数的方法,将参数改变为2:
注解:

//自定义拦截器
@Intercepts({
//说明拦截什么
// @Signature(type= StatementHandler.class, method = "query",args = {Statement.class, ResultHandler.class})
@Signature(type= StatementHandler.class, method = "parameterize",args = {Statement.class})
})

拦截方法:

public Object intercept(Invocation invocation) throws Throwable {

        Object target= invocation.getTarget();  //目标方法,具体执行的方法
System.out.println("目标对象"+target);
//将目标方法包装,获取之后的产物
MetaObject metaObject = SystemMetaObject.forObject(target); //内置方法 //拦截,将方法的参数变为2
metaObject.setValue("parameterHandler.parameterObject",); //获取参数值,验证
Object object = metaObject.getValue("parameterHandler.parameterObject");
System.out.println("拿到的参数值:"+object); Object proceed = invocation.proceed(); //放行,执行查询方法,拿到返回值
return proceed;
}

这里需要注意:

1.proceed()是放行方法,放行之后就会执行查询操作,所以拦截操作要在这个方法之前进行,注意拦截时机。

2.mybatis底层用parameterize设置参数,query只是查询

最新文章

  1. lucene和es总结
  2. [转] Android 4.4中播放HTML5视频&lt;video&gt;的Bug
  3. 如何限制input只能输入数字
  4. 前端编辑器 之 sublime-text3
  5. ipod nano 无法添加mp4视频 电影失败解决方法
  6. Lucene学习之CURD
  7. jmeter问题处理随笔1 - CSV取值数据异常处理(包含&quot;号,&quot;,&quot;号的情况)
  8. 原生的 django 分页
  9. MySQL 笔记整理(18) --为什么这些SQL语句逻辑相同,性能却差异巨大?
  10. 双目立体匹配——归一化互相关(NCC)
  11. xcode10对应的xcode command line tool编译的坑
  12. allegro画元件封装
  13. Nginx PRECONTENT try_files指令
  14. 开始使用Chronograf(官方说明)
  15. _杂谈_C语言历史
  16. OpenCV——轮廓面积及长度计算
  17. mysql主从数据库不同步的2种解决方法 (转载)
  18. 2018.10.15 bzoj4445: [Scoi2015]小凸想跑步(半平面交)
  19. 转 JS模块化简单实现
  20. 此文记录了我从研二下学期到研三上学期的找工历程,包括百度、腾讯、网易、移动、电信、华为、中兴、IBM八家企业的面试总结和心得--转

热门文章

  1. 利用SSH桥接访问服务器的Docker运行的MySql服务
  2. tomcat 介绍及环境搭建
  3. C# 调用R语言
  4. .NET Core学习笔记(3)——async/await中的Exception处理
  5. 逆元(inv)
  6. html包含html文件的方法
  7. 关于neo4j初入门(3)
  8. ajxa的TypeError: $.ajax is not a function的冲突问题
  9. 客户端TNSPING通 连接出现ORA-12514错误
  10. Python-logging模块简单使用