首先拦截器可以拦截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. 【一起学源码-微服务】Ribbon源码五:Ribbon源码解读汇总篇~

    前言 想说的话 [一起学源码-微服务-Ribbon]专栏到这里就已经全部结束了,共更新四篇文章. Ribbon比较小巧,这里是直接 读的spring cloud 内嵌封装的版本,里面的各种config ...

  2. iOS-UITableView HeaderView随Cell一起移动

    我们在使用TableView的时候,有时会设置HeaderView,当我们滑动的时候,HeaderView不会随Cell滑出屏幕,而是会固定到导航栏下面.今天我们要实现HeaderView随滑动一起滑 ...

  3. hadoop配置环境变量

    hadoop安装包解压 tar -xvf hadoop-2.7.7.tar.gz 解压成功ll查看文件 配置环境变量 1. vi  /home/wj/hadoop-2.7.7/etc/hadoop/h ...

  4. java接入钉钉机器人(带源码)

    前言 登录钉钉网页: https://im.dingtalk.com 登录说明文档地址,以备随时查询: https://ding-doc.dingtalk.com/doc#/serverapi2/qf ...

  5. postman的测试,用对象接收所有的字符串

    1.post请求 Headers: Content-Type  application/json { "taskId":"1000001161", " ...

  6. Window初始化Git环境

    安装Git 去到官网下载地址,找到自己电脑的对应版本,下载安装就好啦,这里就不一一说明了 https://git-scm.com/download/win 初始化Git环境 第一步:打开git-bas ...

  7. 如何利用Serilog的RequestLogging来精简ASP.NET Core的日志输出

    这是该系列的第一篇文章:在ASP.NET Core 3.0中使用Serilog.AspNetCore. 第1部分-使用Serilog RequestLogging来简化ASP.NET Core的日志输 ...

  8. Git基础知识 —— 获取Git仓库

    前言 官方提供了两种获取Git仓库的方法,第一种是在本地现有项目目录下导入所有文件到Git中,第二种就是从Git仓库中clone项目到本地 这里就不说Git的安装了哈,有需要的小伙伴可以查看该博文:h ...

  9. 6.反编译 java---class (字节码文件)---反编译(IDEA):

  10. [bzoj4824][洛谷P3757][Cqoi2017]老C的键盘

    Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也 ...