加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长百科 > 正文

简单了解mybatis拦截器实现原理及实例

发布时间:2020-11-01 14:02:13 所属栏目:站长百科 来源:网络整理
导读:这篇文章主要介绍了简单了解mybatis拦截器实现原理及实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
三个核心方法都加了详细的注释,而且结合案例需求说明问题

那么多文字不想行看,没关系有概括

总结:

1.在mybatis中可被拦截的类型有四种(按照拦截顺序):

Executor:拦截执行器的方法。

ParameterHandler:拦截参数的处理。

ResultHandler:拦截结果集的处理。

StatementHandler:拦截Sql语法构建的处理。

2.各个参数的含义:

@Intercepts:标识该类是一个拦截器;

@Signature:指明自定义拦截器需要拦截哪一个类型,哪一个方法;

2.1 type:对应四种类型中的一种;

2.2 method:对应接口中的哪类方法(因为可能存在重载方法);

2.3 args:对应哪一个方法;

不知道能否帮助你理解,我的表达能力有限~~~

接下来我们看看 Plugin 类

package org.apache.ibatis.plugin;

* Plugin 类其实就是一个代理类,因为它实现了jdk动态代理接口 InvocationHandler

* 我们核心只需要关注两个方法

* wrap:

* 如果看懂了代码案例1的例子,那么这个方法很理解,这个方法就是 mybatis 提供给开发人员使用的一个工具类方法,

* 目的就是帮助开发人员省略掉 反射解析注解 Intercepts 和 Signature,有兴趣的可以去看看源码 Plugin#getSignatureMap 方法

* invoke:

* 这个方法就是根据 wrap 方法的解析结果,判断当前拦截器是否需要进行拦截,

* 如果需要拦截:将 目标对象+目标方法+目标参数 封装成一个 Invocation 对象,给我们自定义的拦截器 MyInterceptor 的 intercept 方法

* 这个时候就刚好对应上了上面案例1中对 intercept 方法的解释了,它就是我们要处理自己逻辑的方法,

* 处理好了之后是否需要调用目标对象的方法,比如上面说的 打印了sql语句,是否还要查询数据库呢?答案是肯定的

* 如果不需要拦截:则直接调用目标对象的方法

* 比如直接调用 Executor 的 update 方法进行更新数据库

class Plugin implements InvocationHandler {

public static Object wrap(Object target, Interceptor interceptor) {

// 省略

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

// 省略

}

贴一段网上的通用解释吧:

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读