
文章插图
经过上面的介绍这个类应该一眼就能看懂,我们关键要看看SqlUtil的intercept方法做了什么:

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

文章插图
这里面会获取到一个Page对象,然后在爱写sql的时候也会将一些分页参数设置到Page对象,我们看看Page对象是从哪里获取的:

文章插图
我们看到对象是从LOCAL_PAGE对象中获取的,这个又是什么呢?

文章插图
这是一个本地线程池变量,那么这里面的Page又是什么时候存进去的呢?
这就要回到我们的示例上了,分页的开始必须要调用:
PageHelper.startPage(0,10);
文章插图
这里就会构建一个Page对象,并设置到ThreadLocal内 。
为什么PageHelper只对startPage后的第一条select语句有效这个其实也很简单哈,但是可能会有人有这个以为,我们还是要回到上面的intercept方法:

文章插图
在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
推荐阅读
- 彻底搞懂 Netty 线程模型
- 猫咪可以经常换猫砂吗 猫咪猫砂多久彻底换一次
- 如何彻底清理干净电脑里的垃圾?
- 一文搞懂分类算法中常用的评估指标
- 看了两天HashMap源码,终于把红黑树插入平衡规则搞懂了
- 三分钟搞懂SQL的Case函数
- 蒙古后来为什么不进攻明朝了 为什么明朝没有彻底消灭蒙古
- spring注入你真搞懂了吗?不会一直都是这样错误理解吧?
- MIPS|曾经的第三大CPU架构:彻底终结了
- 搞懂内存条颗粒频率时序,附DDR4内存条推荐
