Mybatis之插件开发

Mybatis之插件开发

一 概述

  1. MyBatis在四大对象的创建过程中,都会有插件进行介入。插件可以利用动态代理机制一层层的包装目标对象,而实现在目标对象执行目标方法之前进行拦截的效果
  2. MyBatis 允许在已映射语句执行过程中的某一点进行拦截调用。
  3. 默认情况下,MyBatis 允许使用插件来拦截的方法调 用包括:
    (1) Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
    (2)ParameterHandler (getParameterObject, setParameters)
    (3) ResultSetHandler (handleResultSets, handleOutputParameters)
    (4)StatementHandler (prepare, parameterize, batch, update, query)

二 插件开发

  1. 开发步骤
    (1)编写插件实现Interceptor接口,并使用 @Intercepts注解完成插件签名
    在这里插入图片描述
    (2)在全局配置文件中注册插件
    在这里插入图片描述

三 插件原理

  1. 按照插件注解声明,按照插件配置顺序调用插件plugin方 法,生成被拦截对象的动态代理
  2. 多个插件依次生成目标对象的代理对象,层层包裹,先声 明的先包裹;形成代理链
  3. 目标方法执行时依次从外到内执行插件的intercept方法
    在这里插入图片描述
  4. 多个插件情况下,我们往往需要在某个插件中分离出目标 对象。可以借助MyBatis提供的SystemMetaObject类来进行获 取最后一层的h以及target属性的值

四 Interceptor接口

在这里插入图片描述
(1) intercept方法:拦截目标方法
(2)plugin方法:生成动态代理对象,可以使用MyBatis提 供的Plugin类的wrap方法
(3)setProperties方法:注入插件配置时设置的属性
(4)常用代码

//1、分离代理对象
//由于会形成多次代理,所以需要通过一个 while 循环分离出最终被代理对象,从而方便提取信息 
MetaObject metaObject = SystemMetaObject. forObject(target); 
while (metaObject.hasGetter("h")) { 
	Object h = metaObject.getValue("h"); 
	metaObject = SystemMetaObject. forObject(h); 
} 
//2、获取到代理对象中包含的被代理的真实对象 
Object obj = metaObject.getValue("target"); 
//3、获取被代理对象的MetaObject方便进行信息提取 
MetaObject forObject = SystemMetaObject. forObject(obj);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值