这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战
昨天我们讲到若依系统中使用PageHelper来实现分页,从而实现了无需编写分页代码而实现了分页。
但是我们并没有阐述PageHelper的具体逻辑。今天我们来学习一下PageHelper是如何实现的?
PageHelper介绍
PageHelper是与Mybatis密不可分的。其网址为pagehelper.github.io/,在首页的大标题就是:MyBatis分页插件PageHelper。并且在Github与Gitee上均有源代码部署。
Github:github.com/pagehelper/…
Gitee:gitee.com/free/Mybati…
因为国内访问Github不稳定,我们通过Gitee来查看介绍内容与源码。
startPage()
我们最关心的仍然是startPage函数,下载PageHelper源码后,首先我们查找startPage函数的源码:
1 | java复制代码/** |
方法的前三行,构造了一个Page<E>
对象,对象page
中包含了分页相关参数,如pageSize与pageNum。
第5行代码Page<E> oldPage = getLocalPage();
,我们来看看做了什么?
1 | java复制代码/** |
pageHelper中使用ThreadLocal
来实现将分页数据保存在当前线程中。ThreadLocal
本篇暂时不展开讲述,大家可理解为一个线程本地变量。
如此,我们便知道PageHelper是通过ThreadLocal将分页变量保存在当前线程中,以便后续查询获取。
那么后续执行时又是如何通过PageHelper将分页sql插入原sql的呢?
题外话
TheadLocal
这个类我最初是在阿里巴巴的Java编码规范中看到的,当时是讲述Java中时间的格式化问题容易引发多线程并发问题导致时间格式化出错,从而引入说使用ThreadLocal可以规避这一问题。
DateFormat是线程非安全的, 一般在多线程环境下, 必须为每一次日期时间的转换创建一个DateFormat
另外在格式时间时,发现编辑器推荐了两种很“优雅”的日期格式化方式:
1 | java复制代码public static final ThreadLocal<DateFormat> df_Ch_yyyy_MM_dd_HH_mm = |
代码简洁漂亮!
本文转载自: 掘金