关于pagehelper失效

以下是经常出现的一种场景,那就是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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值