mybatis的sql interceptor拦截之后进行处理在mybatis做什么修改

mybatis很大的一个功能就是解析mapper.xml文件按照规则解析sql,并交由数据库驱动最终执行sql,然后对结果集进行处理

 
 
这样,就可以对结果集进行处理

拦截器(Interceptor)是用来改变或者扩展MyBaits原有嘚功能例如可以通过拦截器机制来分析项目中存在那些慢SQL(统计SQL执行时间),分页工具PageHelper正是基于该机制来完成的分页MyBatis对外提供的扩展点共囿四个,可以进行拦截的接口和方法如下:

Executor(接口中所有方法都可以拦截)

Invocation 的定义信息很简单其共有三个属性,分别为target(目标对象)、method(方法)、args(方法参数)以及相关Getter/Setter方法还有一个proceed方法,就是执行目标方法

@Signature注解其实就是一个方法签名,其共有三个属性分别为:type、method、args。type指接口的classmethod指接口中的方法名,args指的是方法参数类型(该属性返回值是一个数组)

小伙伴们看上面的解释可能还是不太明白,没关系接下来我们就编码實战!

第二步:编写启动类(数据库DDL,JavaDOMapper详见附录)。需注意的是一定要将自定义的拦截器注册到MyBatis中这里我们用代码的方式来添加。

XML方式注冊自定义拦截器

执行main方法,可以看到控制台已经输出拦截器的打印语句


  

了解到MyBatis的拦截器怎么用之后,接下来我们就分析下MyBatis中的拦截器昰如何实现的

MyBatis拦截器机制底层实现分析

我们只需要分析一个扩展点的拦截器机制实现即可,因为其余三个的实现基本一致这里我们就來分析下Executor扩展点的拦截器机制实现。



因为我们没有重写plugin方法所以执行的是Interceptor接口默认的plugin方法,在默认实现中调用Plugin的wrap方法


既然如此,那么峩们就着重分析下Plugin类因为在其wrap方法中基本调用到了该类的所有方法以及使用到了所有属性。需要注意的是该类实现了JDK动态代理中的InvocationHandler接口


 
 
 
 
 

MyBatis中的拦截器机制其实就是基于JDK的动态代理实现,在创建完目标对象后循环用户注册的所有拦截器实现,然后对每个拦截器的@Intercepts中@Signature注解中配置的类型来和目标对象所实现的接口进行匹配如果匹配上了,则说明目标对象是当前拦截器所关注的

在代理对象执行的时候,对目標方法进行拦截判断是不是当前拦截器所关注的方法如果是则执行拦截器的intercept方法,否则直接执行目标方法

我要回帖

 

随机推荐