5分钟!彻底搞懂MyBatis插件+PageHelper原理( 三 )


5分钟!彻底搞懂MyBatis插件+PageHelper原理

文章插图
 
经过上面的介绍这个类应该一眼就能看懂,我们关键要看看SqlUtil的intercept方法做了什么:
5分钟!彻底搞懂MyBatis插件+PageHelper原理

文章插图
 
【5分钟!彻底搞懂MyBatis插件+PageHelper原理】这个方法的逻辑比较多,因为要考虑到不同的数据库方言的问题,所以会有很多判断,我们主要是关注PageHelper在哪里改写了sql语句,上图中的红框就是改写了sql语句的地方:
5分钟!彻底搞懂MyBatis插件+PageHelper原理

文章插图
 
这里面会获取到一个Page对象,然后在爱写sql的时候也会将一些分页参数设置到Page对象,我们看看Page对象是从哪里获取的:
5分钟!彻底搞懂MyBatis插件+PageHelper原理

文章插图
 
我们看到对象是从LOCAL_PAGE对象中获取的,这个又是什么呢?
5分钟!彻底搞懂MyBatis插件+PageHelper原理

文章插图
 
这是一个本地线程池变量,那么这里面的Page又是什么时候存进去的呢?
这就要回到我们的示例上了,分页的开始必须要调用:
PageHelper.startPage(0,10);
5分钟!彻底搞懂MyBatis插件+PageHelper原理

文章插图
 
这里就会构建一个Page对象,并设置到ThreadLocal内 。
为什么PageHelper只对startPage后的第一条select语句有效这个其实也很简单哈,但是可能会有人有这个以为,我们还是要回到上面的intercept方法:
5分钟!彻底搞懂MyBatis插件+PageHelper原理

文章插图
 
在finally内把ThreadLocal中的分页数据给清除掉了,所以只要执行一次查询语句就会清除分页信息,故而后面的select语句自然就无效了 。
不通过插件能否改变MyBatis的核心行为上面我们介绍了通过插件来改变MyBatis的核心行为,那么不通过插件是否也可以实现呢?
答案是肯定的,官网中提到,我们可以通过覆盖配置类来实现改变MyBatis核心行为,也就是我们自己写一个类继承Configuration类,然后实现其中的方法,最后构建SqlSessionFactory对象的时候传入自定义的Configuration方法:
SqlSessionFactory build(MyConfiguration)当然,这种方法是非常不建议使用的,因为这种方式就相当于在建房子的时候把地基抽出来重新建了,稍有不慎,房子就要塌了 。
总结本文主要会介绍MyBatis插件的使用及MyBatis其实现原理,最后我们也大致介绍了PageHelper插件的主要实现原理,相信读完本文学会MyBatis插件原理之后,我们也可以写个简单的自己的PageHelper分页插件了 。
作者:双子孤狼
原文链接:https://blog.csdn.net/zwx900102/article/details/108941441




推荐阅读