我们简单阐述了若依系统中的分页架构,若依系统中的后端分页主要代码接口的三个特点:
- 返回值类型为
TableDataInfo
- 接口第一行代码
startPage()
- 接口最后一句:
getDataTable(list)
获取分页参数
我们已经看到了
TableDataInfo
的数据结构,就是一个分页的数据结构,有total
,有rows
数据。今天我们来看看
startPage()
时执行了什么逻辑。startPage
方法位于基类BaseController
中。
代码如下:
/** * 设置请求分页数据 */ protected void startPage() { PageDomain pageDomain = TableSupport.buildPageRequest(); Integer pageNum = pageDomain.getPageNum(); Integer pageSize = pageDomain.getPageSize(); if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) { String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); Boolean reasonable = pageDomain.getReasonable(); PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); } }
我们逐行来分析。
第一行
PageDomain pageDomain = TableSupport.buildPageRequest();
,引入了一个新的类PageDomain
,这个类又是干嘛的呢?
PageDomain
的详细结构如下述代码所示。
/** * 分页数据 * * @author ruoyi */ public class PageDomain { /** 当前记录起始索引 */ private Integer pageNum; /** 每页显示记录数 */ private Integer pageSize; /** 排序列 */ private String orderByColumn; /** 排序的方向desc或者asc */ private String isAsc = "asc"; /** 分页参数合理化 */ private Boolean reasonable = true;
其中包含了pageNum与pageSize分页参数,还有排序列以及排序方式。那么TableSupport.buildPageRequest()
是如何获取到这些参数的呢?
其详细代码如下所示。
public static PageDomain buildPageRequest() { return getPageDomain(); } } /** * 封装分页对象 */ public static PageDomain getPageDomain() { PageDomain pageDomain = new PageDomain(); pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM)); pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE)); pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); return pageDomain; }
在方法内部,调用了函数 getPageDomain()
,在getPageDomain()
中,获取请求参数时使用了一个工具类方法:ServletUtils.getParameterToInt
,我们再来看看这方法。
public class ServletUtils { /** * 获取String参数 */ public static String getParameter(String name) { return getRequest().getParameter(name); } // 其他方法.... }
如何便逐层将前端Request的分页参数获取到了对象pageDomain
中。
那么分页参数又是如何转换为sql执行的呢?
代码查找
接着研究startPage()
方法,后续一句代码为:
String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
我们来看看这个方法的内部。
/** * 检查字符,防止注入绕过 */ public static String escapeOrderBySql(String value) { if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { throw new UtilException("参数不符合规范,不能进行查询"); } return value; }
这个方法知识检查order_by sql语句是否合法的。
接着,我们来到了关键的:PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
,
其中的startPage
方法,我们来看看其执行代码:
/**抽象类:PageMethod中*/ public static <E> com.github.pagehelper.Page<E> startPage(int pageNum, int pageSize, java.lang.String orderBy) { return null; }
哦~经过询问度娘,我们知道,这个是一个与mybatis相关的分页工具,叫PageHelper,孤陋寡闻了。
<!-- pagehelper 分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> </dependency>
在配置文件application.yml中:
# PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql