这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战
在昨天的文章《若依系统中的分页实现方式-数据结构篇》中,我们简单阐述了若依系统中的分页架构,若依系统中的后端分页主要代码接口的三个特点:
- 返回值类型为
TableDataInfo
- 接口第一行代码
startPage()
- 接口最后一句:
getDataTable(list)
获取分页参数
我们已经看到了TableDataInfo
的数据结构,就是一个分页的数据结构,有total
,有rows
数据。
今天我们来看看startPage()
时执行了什么逻辑。startPage
方法位于基类BaseController
中。代码如下:
1 | java复制代码/** |
我们逐行来分析。
第一行PageDomain pageDomain = TableSupport.buildPageRequest();
,引入了一个新的类PageDomain
,这个类又是干嘛的呢?
PageDomain
的详细结构如下述代码所示。
1 | java复制代码/** |
其中包含了pageNum与pageSize分页参数,还有排序列以及排序方式。那么TableSupport.buildPageRequest()
是如何获取到这些参数的呢?
其详细代码如下所示。
1 | java复制代码 public static PageDomain buildPageRequest() |
在方法内部,调用了函数getPageDomain()
,在getPageDomain()
中,获取请求参数时使用了一个工具类方法:ServletUtils.getParameterToInt
,我们再来看看这方法。
1 | java复制代码public class ServletUtils |
如何便逐层将前端Request的分页参数获取到了对象pageDomain
中。
那么分页参数又是如何转换为sql执行的呢?
代码查找
接着研究startPage()
方法,后续一句代码为:
1 | java复制代码String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); |
我们来看看这个方法的内部。
1 | java复制代码/** |
这个方法知识检查order_by sql语句是否合法的。
接着,我们来到了关键的:PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
,其中的startPage
方法,我们来看看其执行代码:
1 | java复制代码/**抽象类:PageMethod中*/ |
一脸懵逼!
哦~经过询问度娘,我们知道,这个是一个与mybatis相关的分页工具,叫PageHelper,孤陋寡闻了。
我们也在pom.xml中找到了配置:
1 | xml复制代码<!-- pagehelper 分页插件 --> |
在配置文件application.yml中:
1 | yaml复制代码# PageHelper分页插件 |
本文转载自: 掘金