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.直接调用就可以了
总结:
分页是用于解决数据库数量巨大时减轻数据的读取速度 请结合自己需求使用