PageHelper.startPage分页的使用和pageSize的值和list相同导致循环出来的total总数不对

PageHelper.startPage分页的使用和pageSize的值和list相同导致循环出来的total总数不对

	/**
	CommonQo 是我自己定义的一个类 来存放pageNum和PageSize
	**/
    @Override
    public PageInfo<FleetData> selectMarkAndSelfIdOne(CommonQo commonQo) {
		PageHelper.startPage(commonQo.getPageNum(),commonQo.getPageSize());

        List<FleetData> fleetData = fleetDataMapper.selectMarkAndSelfIdOne();
        //debug断点
        PageInfo<FleetData> pageInfo = new PageInfo<>(fleetData);

        List<FleetData> fleetDataList = new ArrayList<>();
        System.out.println(fleetData.size());
        //for循环就循环5
        for (FleetData fleetData2: fleetData) {
            Long userId= fleetData2.getId();//获得用户id
            //System.out.println("用户id======="+ userId );
            List<FleetBill> fleetBills = fleetBillMapper.selectBySelfId(userId);
            if (fleetBills.size()>0){
                for (FleetBill fleet:fleetBills) {
                    Long userId1= fleet.getFleetId();//获得用户id
                    //System.out.println("客户id======="+ userId1);
                }
            }
            else {
                fleetDataList.add(fleetData2);
            }
        }
//        PageInfo<FleetData> page= new PageInfo<>(fleetDataList);
//        BeanUtils.copyProperties(pageInfo,page);
        pageInfo.setList(fleetDataList);
        return pageInfo;
    }

1.PageHelper 是一个分页插件。需要传入参数,pageNum,pageSize如果你传入的参数分别是10,5,表示第10页,每页5条数据。那么 fleetDataMapper.selectMarkAndSelfIdOne();的sql 末尾会默认加上limit 50,5,也就是查询结果最多返回5条数据。

//未分页
select * from marker
//分页后
select * from marker limit 50,5

2.那么问题就来了
我需要的是把所有的东西查出来之后进行for循环处理把我需要的数据存放到一个新的list集合里然后再去分页


PageHelper.startPage(commonQo.getPageNum(),commonQo.getPageSize());

List<FleetData> fleetData = fleetDataMapper.selectMarkAndSelfIdOne();

应为PageHelper.startPage是直接操作数据库的,所以他在这里提前做了分页 如果pageSize是5 那么他就会直接去数据库查5条数据 然后返回给你 最后导致for循环的次数不对 然后影响下边的数据处理 导致最后返回的数据total总数不对

3.解决方法
定义一个list分页工具
等所有的东西处理完之后直接对list做分页

/**
 * 自定义List分页工具
 * @author hanwl
 */
public class PageUtil {

    //页数
     private Integer lastPage;
    //一共有多少条数据
     private Integer count;
    //页码
     private Integer pageNum;
    //每页多少条数据
     private Integer pageSize;

    public Integer getLastPage() {
        return lastPage;
    }

    public void setLastPage(Integer lastPage) {
        this.lastPage = lastPage;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public Integer getPageNum() {
        return pageNum;
    }

    public void setPageNum(Integer pageNum) {
        this.pageNum = pageNum;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    /**
     * 开始分页
     * @param list
     * @param pageNum 页码
     * @param pageSize 每页多少条数据
     * @return
     */
    public  List startPage(List list, Integer pageNum,
                                 Integer pageSize) {
        if (list == null) {
            return null;
        }
        if (list.size() == 0) {
            return null;
        }

        count = list.size(); // 记录总数

        lastPage = 0; // 页数
        if (count % pageSize == 0) {
            lastPage = count / pageSize;
        } else {
            lastPage = count / pageSize + 1;
        }

        int fromIndex = 0; // 开始索引
        int toIndex = 0; // 结束索引

        if (pageNum != lastPage) {
            fromIndex = (pageNum - 1) * pageSize;
            toIndex = fromIndex + pageSize;
        } else {
            fromIndex = (pageNum - 1) * pageSize;
            toIndex = count;
        }
        this.pageNum = pageNum;
        this.pageSize = pageSize;

        List pageList = list.subList(fromIndex, toIndex);

        return pageList;
    }
}

4.直接调用就可以了

总结:
分页是用于解决数据库数量巨大时减轻数据的读取速度 请结合自己需求使用

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值