最近项目中有一个需求,需求是这样的。需要将A项目中的数据全部推送到B项目组,同时需要可配置化切换读取的数据源。也就是说需要兼容之前读取A项目数据源。防止读取B项目有问题可随时切换。
需求很明确,功能挺简单。但当我看到A项目中的下面这行代码时,有点小懵逼。还是因为自己对PageHelper不太熟悉。
//业务代码
public PageInfo<Item> selectByPage(ItemQuertDTO queryDTO) {
PageHelper.startPage(queryDTO.getPageNum(), queryDTO.getPageSize());
List<Item> list =mapper.selectByPage(queryDTO);
return new PageInfo<>(list);
}
看到上面的感觉。嗯很简单。我直接将B项目数据,获取。直接 new PageInfo返回。于是乎,我写了以下代码。感觉不太对因为没设置分页,但先看看。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
return new PageInfo<>(list);
嘿嘿。很完美。数据完美返回。还是分页。但是,分页的数据不太对。list中有多少条数据,在分页中显示的总数据就有多少条。
打印结果如下:很明显看到total总条数是10.实际我查出来的总条数可是100。
PageInfo{pageNum=1, pageSize=10, size=10, startRow=0, endRow=9, total=10, pages=1, list=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], firstPage=1, prePage=0, nextPage=0, lastPage=1, isFirstPage=true, isLastPage=true, hasPreviousPage=false, hasNextPage=false, navigatePages=8, navigatepageNums=[1]}
于是我看了一下pageInfo的构造函数。很明显的发现了区别。入参的list有2种,一种是实现Page类。一种是实现Collection
类。2个类的区别可以很明显发现:实现Page的list会使用Page自身的总条数、页面数、显示条数等,而对于实现Collection的list则是将list的本身数据作为了全量数据,可以看出这种数据永远只有1页。
public PageInfo(List<T> list, int navigatePages) {
this.isFirstPage = false;
this.isLastPage = false;
this.hasPreviousPage = false;
this.hasNextPage = false;
if (list instanceof Page) {
Page page = (Page)list;
this.pageNum = page.getPageNum();
this.pageSize = page.getPageSize();
this.orderBy = page.getOrderBy();
this.pages = page.getPages();
this.list = page;
this.size = page.size();
this.total = page.getTotal();
if (this.size == 0) {
this.startRow = 0;
this.endRow = 0;
} else {
this.startRow = page.getStartRow() + 1;
this.endRow = this.startRow - 1 + this.size;
}
} else if (list instanceof Collection) {
this.pageNum = 1;
this.pageSize = list.size();
this.pages = 1;
this.list = list;
this.size = list.size();
this.total = (long)list.size();
this.startRow = 0;
this.endRow = list.size() > 0 ? list.size() - 1 : 0;
}
if (list instanceof Collection) {
this.navigatePages = navigatePages;
this.calcNavigatepageNums();
this.calcPage();
this.judgePageBoudary();
}
当我看到这里的时候。我大概明白了。也就是对于list我需要自定义一些数据。比如总条数、页数、条数等。于是有了我的第一版。在实例化PageInfo之后,对pageinfo自身的分页数据进行赋值。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 分页参数
int pageNum = 1; // 当前页码
int pageSize = 5; // 每页显示的记录数
int total = 100; // 总记录数
// 创建PageInfo对象,并设置相关属性
PageInfo<Integer> pageInfo = new PageInfo<>();
pageInfo.setList(list ); // 设置当前页的数据列表
pageInfo.setTotal(total); // 设置总记录数
pageInfo.setPageNum(pageNum); // 设置当前页码
pageInfo.setPageSize(pageSize); // 设置每页记录数
打印结果
PageInfo{pageNum=1, pageSize=5, size=0, startRow=0, endRow=0, total=100, pages=4, list=[1, 2, 3, 4, 5], firstPage=0, prePage=0, nextPage=0, lastPage=0, isFirstPage=false, isLastPage=false, hasPreviousPage=false, hasNextPage=false, navigatePages=0, navigatepageNums=null}
但结果不太满意。hasNextPage 这个参数意思是是否有下一页。这里还是false。说明结果还是没有下一页,数据还是错误的。
当第一次失败后,我就想着问问AI。于是在智谱上试了一下。
首先告诉大家结果:还是不行。智谱的结果与我第一次尝试的代码基本一样。
到这里我只能继续回到源码,看一下 hasNextPage 到底是如何生成的。
请看代码
可以看到。在构造的时候就直接将hasNextPage生成了。所以在后期配置其他属性都解决不了这个问题了。
public PageInfo(List<T> list, int navigatePages) {
-删除部分代码--
---
---
if (list instanceof Collection) {
this.navigatePages = navigatePages;
this.calcNavigatepageNums();
this.calcPage();
this.judgePageBoudary();
}
}
private void judgePageBoudary() {
this.isFirstPage = this.pageNum == 1;
this.isLastPage = this.pageNum == this.pages;
this.hasPreviousPage = this.pageNum > 1;
this.hasNextPage = this.pageNum < this.pages;
}
当上面我们发现 PageInfo 在构造的时候就直接将hasNextPage生成了。那么在后期配置其他属性都解决不了这个问题了。
这时候我们只能瞄准 list 实现 Page 这一点来处理了。
直接上代码
List<Integer> fullList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20); // 调用
int pageNum = 1;
int pageSize = 5;
//创建Page类
Page<Integer> page = new Page<>(pageNum, pageSize);
//为Page类中的total属性赋值
int total = fullList.size();
page.setTotal(total);
//计算当前需要显示的数据下标起始值
int startIndex = (pageNum - 1) * pageSize;
int endIndex = Math.min(startIndex + pageSize,total);
//从链表中截取需要显示的子链表,并加入到Page
page.addAll(fullList.subList(startIndex,endIndex));
//以Page创建PageInfo
PageInfo<Integer> pageInfo = new PageInfo<>(page.getResult());
//将数据传回前端
System.out.println(pageInfo);
简化一下。如果B项目返回的直接就是分页数据,那么转换就只需要
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int pageNum = 1;
int pageSize = 5;
int total = 100;
//创建Page类
Page<Integer> page = new Page<>(pageNum, pageSize);
page.setTotal(total);
page.addAll(list);
//以Page创建PageInfo
PageInfo<Integer> pageInfo = new PageInfo<>(page.getResult());
//将数据传回前端
System.out.println(pageInfo);
以上代码就是完整的将B项目的List 转换成了 PageInfo结构体。完美兼容A项目历史使用。
现在AI发展很快,大部分情况下我们都可以使用AI解决问题,当AI无法解决时,我们也需要有阅读源码能定位问题的能力。平常还是要多看源码多分析。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有