首先拦截器可以拦截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只是查询

(六)mybatis拦截器的更多相关文章

  1. Mybatis拦截器(六)

    拦截器的作用就是我们可以拦截某些方法的调用,在目标方法前后加上我们自己逻辑. Mybatis拦截器设计的一个初衷是为了供用户在某些时候可以实现自己的逻辑而不必去动Mybatis固有的逻辑. Mybat ...

  2. 详解Mybatis拦截器(从使用到源码)

    详解Mybatis拦截器(从使用到源码) MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能. 本文从配置到源码进行分析. 一.拦截器介绍 MyBatis 允许你在 ...

  3. Mybatis拦截器

    Mybatis拦截器

  4. Mybatis拦截器 mysql load data local 内存流处理

    Mybatis 拦截器不做解释了,用过的基本都知道,这里用load data local主要是应对大批量数据的处理,提高性能,也支持事务回滚,且不影响其他的DML操作,当然这个操作不要涉及到当前所lo ...

  5. MyBatis拦截器原理探究

    MyBatis拦截器介绍 MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能.那么拦截器拦截MyBatis中的哪些内容呢? 我们进入官网看一看: MyBatis 允 ...

  6. Mybatis拦截器介绍

    拦截器的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执行自己的逻辑而不再执行被拦截的方法.Mybatis拦截器设计的一个初 ...

  7. Mybatis拦截器实现分页

    本文介绍使用Mybatis拦截器,实现分页:并且在dao层,直接返回自定义的分页对象. 最终dao层结果: public interface ModelMapper { Page<Model&g ...

  8. 数据权限管理中心 - 基于mybatis拦截器实现

    数据权限管理中心 由于公司大部分项目都是使用mybatis,也是使用mybatis的拦截器进行分页处理,所以技术上也直接选择从拦截器入手 需求场景 第一种场景:行级数据处理 原sql: select ...

  9. 基于Spring和Mybatis拦截器实现数据库操作读写分离

    首先需要配置好数据库的主从同步: 上一篇文章中有写到:https://www.cnblogs.com/xuyiqing/p/10647133.html 为什么要进行读写分离呢? 通常的Web应用大多数 ...

  10. 通过spring抽象路由数据源+MyBatis拦截器实现数据库自动读写分离

    前言 之前使用的读写分离的方案是在mybatis中配置两个数据源,然后生成两个不同的SqlSessionTemplate然后手动去识别执行sql语句是操作主库还是从库.如下图所示: 好处是,你可以人为 ...

随机推荐

  1. ACWing 248. 窗内的星星|扫描线+懒惰标记

    传送门 题目描述 在一个天空中有很多星星(看作平面直角坐标系),已知每颗星星的坐标和亮度(都是整数). 求用宽为W.高为H的矩形窗户(W,H为正整数)能圈住的星星的亮度总和最大是多少.(矩形边界上的星 ...

  2. JavaSelenium 页面常用基本操作语法

    元素定位                 findElement() 方法返回一个元素, 如果没有找到,会抛出一个异常 NoElementFindException()              fi ...

  3. Netty快速入门(06)Netty介绍

    前面简单的介绍了Java I/O 和NIO,写了示例程序. Java I/O是阻塞的,为了让它支持多个并发,就要针对每个链接启动线程,这种方式的结果就是在海量链接的情况下,会创建海量的线程,就算用线程 ...

  4. Shell脚本实现DB2数据库表导出到文件

    该Shell脚本用于实现将DB2数据库表导出到文件,将在另一篇博文<Java代码调用Shell脚本并传入参数实现DB2数据库表导出到文件>中通过Java代码实现调用该脚本并传入参数. #! ...

  5. typescript学习笔记(一)---基础变量类型

    作为一个前端开发者,学习新技术跟紧大趋势是必不可少的.随着2019年TS的大火,我打算利用一个月的时间学习这门语言.接下来的几篇文章是我学习TS的学习笔记,其中也会掺杂一些学习心得.话不多说,先从基础 ...

  6. Linux.vim编辑器显示行号

    显示行号 :set number 取消显示行号:set nonumber

  7. objectarx 按比例分割封闭多段线

    测试结果:这个是按0.1,0.1,0.1,0.3,0.4的比例划分的. 插件描述:这个插件主要是选择一个多段线poly,设置poly的close属性为true,在poly任意一侧画一条长线line(l ...

  8. 从零开始ming的多人联机游戏--游戏客户端(1)六边形地图

    打算做的小游戏是一个多人联机的策略类游戏,类似于<文明>那种 游戏的玩法并不确定,开这个坑主要是为了入门后端开发,顺便熟悉下游戏开发 这篇文章使用unity,实现了六边形单元地图的创建.后 ...

  9. Dynamics email的subject标题出现 CRM:0000xxxx

    怎样移除email subject标题中出现的CRM:0000xxxx Settings->Administration->System Settings->Email->Un ...

  10. CSS-13-块级元素和行内元素

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...