以下是经常出现的一种场景,那就是pagehelper遇见多次list数据库查询时失效,以下给的解决方案是物理分页,但是这种情况其实是不建议采用的,除非你明确知道数据量不大,因为我们知道,mybatis是有一二级缓存的,当进行执行查询后,会在缓存中存放这些查询到的数据,除非执行刷新,重置这些缓存,否则,进行翻页时,都是从缓存中去读取数据,从而节省服务器资源,物理分页会避开这种情况,每次查询都会将查询出所有的数据,然后再进行分页,会损失一定的性能,所以,不建议在查询大量数据的情况下去使用!
/**
* 查询用户余额变更记录
*
* @param query
* @return
*/
@Override
public PageInfo<MemberBalanceDetailsVO> detailsList(MemberBalanceDetailsQuery query) {
PageHelper.startPage(query.getPage(), query.getPageSize());
List<MemberBalanceDetailsPO> detailsPOList = baseMapper.selectList(new LambdaQueryWrapper<MemberBalanceDetailsPO>()
.eq(MemberBalanceDetailsPO::getMemberId, query.getMemberId()));
if (StringUtils.isEmpty(detailsPOList)) {
return PageInfo.emptyPageInfo();
}
List<MemberBalanceDetailsVO> memberBalanceVOS = BeanUtil.copyToList(detailsPOList, MemberBalanceDetailsVO.class);
return PageInfo<MemberBalanceDetailsVO> pageInfo = CollUtil.isNotEmpty(memberBalanceVOS) ? new PageInfo<>(memberBalanceVOS) : PageInfo.emptyPageInfo();
}
以上这种出现单查询但是多个list集合,或者多个list查询的情况时,均会出现分页失效的情况。
/**
* 查询用户余额变更记录
*
* @param query
* @return
*/
@Override
public PageInfo<MemberBalanceDetailsVO> detailsList(MemberBalanceDetailsQuery query) {
//PageHelper.startPage(query.getPage(), query.getPageSize());
List<MemberBalanceDetailsPO> detailsPOList = baseMapper.selectList(new LambdaQueryWrapper<MemberBalanceDetailsPO>()
.eq(MemberBalanceDetailsPO::getMemberId, query.getMemberId()));
if (StringUtils.isEmpty(detailsPOList)) {
return PageInfo.emptyPageInfo();
}
List<MemberBalanceDetailsVO> memberBalanceVOS = BeanUtil.copyToList(detailsPOList, MemberBalanceDetailsVO.class);
//分页
PageInfo<MemberBalanceDetailsVO> pageInfo = CollUtil.isNotEmpty(memberBalanceVOS) ? new PageInfo<>(memberBalanceVOS) : PageInfo.emptyPageInfo();
return PageInfoUtils.PageInfoUtils(query.getPage(), query.getPageSize(),pageInfo);
}
以下是工具类,用来处理分页失效的情况:
package org.law.one.finance.utils;
import com.github.pagehelper.PageInfo;
/**
* 使用PageInfo做分页时手动设置参数的工具类
* pageNum 页码
* pageSize 每页包含的数据量
* PageInfo 对象
*
* @author hy
*/
public class PageInfoUtils {
public static PageInfo PageInfoUtils(Integer pageNum, Integer pageSize, PageInfo pageInfo) {
int start = 0;
int end = 0;
// 总页数
int totalPages = 0;
int totalRecord = (int) pageInfo.getTotal();
pageInfo.setPageNum(pageNum);
pageInfo.setPageSize(pageSize);
pageInfo.setSize(totalRecord);
if (totalRecord % pageSize == 0) {
totalPages = totalRecord / pageSize;
} else {
totalPages = totalRecord / pageSize + 1;
}
//初始边界值计算
if (pageNum == 1) {
start = 0;
// 设置没有前一页
pageInfo.setHasPreviousPage(false);
// 设置前一页的值为0
pageInfo.setPrePage(0);
// 设置是否为第一页
pageInfo.setIsFirstPage(true);
} else {
// 如果不是第一页, 需要计算最开始页的值:每页数量 * (当前的页数 - 1)
start = pageInfo.getPageSize() * (pageInfo.getPageNum() - 1);
// 设置前一页的值为true
pageInfo.setHasPreviousPage(true);
// 设置前一页的值
pageInfo.setPrePage(pageNum - 1);
// 设置是否为第一页的值为false
pageInfo.setIsFirstPage(false);
}
// 设置成上一页的最后一个值
pageInfo.setStartRow((pageNum - 1) * pageSize);
//结束边界值计算
// 判断 当前页的第一个值 + 每页的数量值 是否大于总数
if ((start + pageInfo.getPageSize() > pageInfo.getTotal())) {
// 把总数赋值给end
end = totalRecord;
// 设置是否有下一页的值为false
pageInfo.setHasNextPage(false);
// 设置为最后一页
pageInfo.setIsLastPage(true);
// 设置最后一页的元素在下标
pageInfo.setEndRow(totalRecord);
} else {
// 上一页的最后值 + 当前页的页面数
end = start + pageInfo.getPageSize();
// 设置是否有下一页
pageInfo.setHasNextPage(true);
// 设置下一页的页数
pageInfo.setNextPage(pageNum + 1);
// 设置不是最后一页
pageInfo.setIsLastPage(false);
// 设置最后一页的元素下标:当前页 * 页面数量
pageInfo.setEndRow(pageNum * pageSize);
}
// 设置页面上要显示的数据
if (start < end && end <= totalRecord) {
pageInfo.setList(pageInfo.getList().subList(start, end));
}
// 判断总数是否为0
if (pageInfo.getSize() == 0) {
// 都设置为0
pageInfo.setStartRow(0);
pageInfo.setEndRow(0);
} else {
// 当页的第一个值为:上页数的最后值+1
pageInfo.setStartRow(pageInfo.getStartRow() + 1);
// 当页的最后值为:减一加页面总数
pageInfo.setEndRow(pageInfo.getStartRow() - 1 + pageInfo.getSize());
}
// 设置总页数
pageInfo.setPages(totalPages);
// 设置导航条上的最后一页
pageInfo.setNavigateLastPage(totalPages > pageNum ? pageNum + 1 : totalPages);
return pageInfo;
}
}
3064

被折叠的 条评论
为什么被折叠?



