拦截 数据_Mybaties源码之拦截器

Mybaties官方介绍允许开发人员在以下四种类的方法进行拦截见图1,我们就列举一个Executor的拦截流程:

首先大家对JDK的动态代理有一点了解。

9588b4138f40c1a8f8a80cedd6ca4041.png

图1

测试的方法很简单,原生的sql是查询user2表的所有数据见图2

f7aa7ac60847ea70673b79a2f3f62257.png

图2

首先要添加拦截器见图2.1红色框内,也可配置在xml中使用添加。

0d6e833d61a4f3b12e565a5eb4a23d33.png

图2.1

楼主模拟的拦截器见图3,实现了mybaties的Interceptor接口,拦截器上的注解中type表示要拦截的类(图一所示4中),method表示拦截的方法名,args表示方法中的参数;下来我们看拦截器中做了哪些事,在intercept方法中对可以对原方法进行增强(楼主是在执行原方法前执行了自己的增强逻辑,原本是查询user2表中所有数据,现在改为查询第一条数据,其实大家知道要想做分页查询肯定要将原有的sql后面加上limit条件,首先我的想法是找到原有的sql语句,然后将条件加入替换原有sql;如果了解mybaties可能就知道哪些对象封装了sql语句,不了解就只能一步步调试寻找,我是将拦截器传来的参数invocation用idea一层层展开果然发现sql的位置见图4红框内,想法就是将它替换掉,但是该对象并没有提供set方法且是私有变量,楼主只能用反射将其改变,最后运行完代码确实只返回一条数据);intercept接口的第二个方法plugin中是用JDK动态代理生成一个代理对象见图5,可以看到将我们的拦截器封装到一个Plugin中(由JDK动态代理可知Plugin类肯定实现了InvocationHandler接口,执行原方法肯定会走到代理对象的invoke方法见图6,这样最后就进了我们的自己的拦截器中)

8da3560703712c02b6d7e90e46091c5a.png

图3

c79abcf6977f6e5febe8d05e321f7bb4.png

图4

a660db6278342a165806b97e38db0e64.png

图5

9c8b68a5fa07f860e5d065b9b6f6ab2a.png

图6

本次通过模拟一个粗糙的分页查询来分享了mybaties的拦截器源码的执行流程。如有错误还请指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值