Mybaties官方介绍允许开发人员在以下四种类的方法进行拦截见图1,我们就列举一个Executor的拦截流程:
首先大家对JDK的动态代理有一点了解。
测试的方法很简单,原生的sql是查询user2表的所有数据见图2
首先要添加拦截器见图2.1红色框内,也可配置在xml中使用添加。
楼主模拟的拦截器见图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,这样最后就进了我们的自己的拦截器中)
本次通过模拟一个粗糙的分页查询来分享了mybaties的拦截器源码的执行流程。如有错误还请指出。