mybatis插件原理(自己总结)

前期需要了解的是:

1. mybatis对哪四种对象进行拦截?

1.1:ParameterHandler:对sql参数进行处理

1.2:ResultSetHandler:对结果对象进行处理

1.3:StatementHandler:对sql语句进行处理

1.4:Executor:执行器,执行增删改查

2.接下来就可以自定义插件了:

给一个场景:分页查询时的动态sql。limit是如何拼接到sql语句的?

答:拼接sql语句,就是选择拦截Executor的query方法。好了,基于这样的思想,可以自定义自己的插件了:

2.1:使用@Interceptts和@Signature指定需要拦截哪个类的哪个方法;

2.2:mybatis的插件类需要实现Interceptor接口,重写其中的intercept()方法和plugin()方法,其中intercept()里写你的拦截逻辑,plugin()方法返回代理对象

2.3:在全局配置文件中配置自定义的插件对象。

明白以下几个问题:

1.插件是什么时候加载的?

答:解析XML的时候,跟mapper接口,enviroment等信息解析在一块,在XMLConfigBuilder的parse()解析的时候加载的。里面有一个pluginElenment(root.evalNode("plugins")方法,这就是解析插件的方法。解析完后,创建一个拦截器,把插件配置的属性信息通过setProperties(pproperties)方法赋值给拦截器,然后将拦截器加入到Configuration中。

这里额外的说明一下:InterceptorChain类其实是一个interceptor集合,相当于一层层的包装,后一个插件就是对前一个插件的包装,并返回一个代理对象。

2.插件是在哪里发挥作用的?

答:以Excutor为例在newExecutor()的时候,调用了interceptorChain.pluginAll(executor)方法,将自身对象executor传入进去,实际上调用的是每一个interceptor的plugin()方法,plugin()就是对目标对象的一个代理,并且生成一个代理对象返回。

总结:当我们执行userMapper.getAllUser(null,null)方法的时候,会调用executor的query方法这个query方法会被拦机器拦截,生成executor的一个代理对象,所以执行query方法的时候就会执行代理对象的invoke()方法,而invoke()方法里面会调用插件的interceptor()方法,实现一些自定义业务逻辑拓展。

你可能感兴趣的:(mybatis,java,开发语言)