mybatis pageHelper插件研究
Jul 31, 2018
1. mybatis插件
在mybatis中使用插件,需要先实现接口Interceptor:
|
|
Interceptor中有三个方法:
- intercept方法:是插件的核心方法,它将直接覆盖你所拦截的对象原有的方法。intercept里有个参数Invocation对象,通过它可以反射调度原料对象的方法。
- plugin方法:target是被拦截对象,plugin方法的作用是给被拦截对象生成一个代理对象并返回。
- setProperties方法:允许在plugin中配置所需要的参数,该方法在插件初始化的时候就被调用一次,然后把插件对象存到配置中,以便后续取出。
2. PageHelper
PageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句,所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句。
startPage源码:
|
|
最终执行的代码:
|
|
其中SqlUtil.setLocalPage是:
|
|
LOCAL_PAGE是:
|
|
PageHelper就是使用ThreadLocal存储了Page对象,在这个对象中有我们设置的pageNum、pageSize,也会查询返回的pages、total。
3. PageHelper执行过程
|
|
配置好PageHelper后,在代码中使用PageHelper后,LOCAL_PAGE会存入分页信息。
在PageHelper下的第一个查询的方法会被PageHelper拦截住,然后重新组装sql语句。具体组装的源码为:
|
|
在实际查询中打印出sql为:
|
|
不加PageHelper打印出的sql为:
|
|
