对PageHelper使用的封装

# 1. 问题点

在使用 PageHelper 的过程中,产生了两个问题

    1. 一个分页接口点击下一页时,绝大多数的情况下数据总数是不变的,但却需要每次请求去查询统计数据总数,产生了性能浪费.
    1. 实际使用中要实现分页要写两步,先在要执行分页的代码前标注 PageHelper.startPage(vo); , 再在返回数据时使用 PageInfo.of(list) 生成分页对象,步骤略微麻烦.

# 2. 代码

分页参数基础类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.china315net.common.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import static com.china315net.common.constant.ConstantPool.MAX_PAGE_SIZE;

/**
* 基本分页对象
*/
@Data
public class BasePageVO {
@ApiModelProperty(value = "当前页")
private Integer pageNum = 1;

@ApiModelProperty(value = "当页显示条数")
private Integer pageSize = 10;

@ApiModelProperty(value = "总页数")
private Integer totalRow = 0;

public void setPageSize(Integer pageSize) {
if (pageSize > MAX_PAGE_SIZE) {
this.pageSize = MAX_PAGE_SIZE;
return;
}
this.pageSize = pageSize;
}
}

分页工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.china315net.mybatis.util;

import com.china315net.common.vo.BasePageVO;
import com.github.pagehelper.ISelect;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import java.util.List;
import java.util.function.Function;

public class PageUtil {

public static <T, P extends BasePageVO> PageInfo<T> doPage(P param, Function<P,List<T>> function) {
ISelect select = () -> function.apply(param);
int total = param.getTotalRow();
int pageNum = param.getPageNum();
int pageSize = param.getPageSize();
PageInfo<T> pageInfo;
//最后一页强制触发分页条件
if (pageNum*pageSize >= total) {
pageInfo = PageHelper.startPage(param).doSelectPageInfo(select);
} else {
pageInfo = PageHelper.startPage(param).setCount(false).doSelectPageInfo(select);
int nowTotal = (pageNum-1)*pageSize + pageInfo.getSize();
//当前页未满且不是最后一页,设置数据总数为当前数据总数
if (pageNum*pageSize > nowTotal) {
total = nowTotal;
}
pageInfo.setTotal(total);
}
return pageInfo;
}
}

# 3. 使用

使用的示例代码如下

1
2
3
4
5
@ApiOperation(value = "列表查询")
@GetMapping("/list")
public ResultBean<PageInfo<BlendingFormulaVO>> list(BlendingFormulaSearchVO search) {
return ResultBean.success(PageUtil.doPage(search, blendingFormulaService::listPage));
}

# 4. 工具类效果

    1. 当前页为最后一页强制触发查询数据总数
    1. 当前页未满时说明数据库数据总数为当前分页计算出的数据总数,设置数据总数为当前当前分页计算出数据总数
    1. 不满足上面两条且前端传了分页总数的情况,不会去查询数据总数