# 1. 问题点
在使用 PageHelper 的过程中,产生了两个问题
-
- 一个分页接口点击下一页时,绝大多数的情况下数据总数是不变的,但却需要每次请求去查询统计数据总数,产生了性能浪费.
-
- 实际使用中要实现分页要写两步,先在要执行分页的代码前标注
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. 工具类效果
-
- 当前页为最后一页强制触发查询数据总数
-
- 当前页未满时说明数据库数据总数为当前分页计算出的数据总数,设置数据总数为当前当前分页计算出数据总数
-
- 不满足上面两条且前端传了分页总数的情况,不会去查询数据总数