若依系统中的分页实现方式-PageHelper

这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

在昨天的文章《若依系统中的分页实现方式-数据结构篇》中,我们简单阐述了若依系统中的分页架构,若依系统中的后端分页主要代码接口的三个特点:

  1. 返回值类型为TableDataInfo
  2. 接口第一行代码startPage()
  3. 接口最后一句:getDataTable(list)

获取分页参数

我们已经看到了TableDataInfo的数据结构,就是一个分页的数据结构,有total,有rows数据。

今天我们来看看startPage()时执行了什么逻辑。startPage方法位于基类BaseController中。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
java复制代码/**
* 设置请求分页数据
*/
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的详细结构如下述代码所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
java复制代码/**
* 分页数据
*
* @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()是如何获取到这些参数的呢?

其详细代码如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
java复制代码    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,我们再来看看这方法。

1
2
3
4
5
6
7
8
9
10
11
java复制代码public class ServletUtils
{
/**
* 获取String参数
*/
public static String getParameter(String name)
{
return getRequest().getParameter(name);
}
// 其他方法....
}

如何便逐层将前端Request的分页参数获取到了对象pageDomain中。

那么分页参数又是如何转换为sql执行的呢?

代码查找

接着研究startPage()方法,后续一句代码为:

1
java复制代码String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());

我们来看看这个方法的内部。

1
2
3
4
5
6
7
8
9
10
11
java复制代码/**
* 检查字符,防止注入绕过
*/
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方法,我们来看看其执行代码:

1
2
3
4
java复制代码/**抽象类:PageMethod中*/
public static <E> com.github.pagehelper.Page<E> startPage(int pageNum, int pageSize, java.lang.String orderBy) {
return null;
}

一脸懵逼!

哦~经过询问度娘,我们知道,这个是一个与mybatis相关的分页工具,叫PageHelper,孤陋寡闻了。

我们也在pom.xml中找到了配置:

1
2
3
4
5
xml复制代码<!-- pagehelper 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>

在配置文件application.yml中:

1
2
3
4
5
yaml复制代码# PageHelper分页插件
pagehelper:
helperDialect: mysql
supportMethodsArguments: true
params: count=countSql

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%