前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >List数据自定义转PageInfo结构解决项目兼容PageHelper分页查询

List数据自定义转PageInfo结构解决项目兼容PageHelper分页查询

原创
作者头像
小草飞上天
发布于 2024-12-31 07:04:49
发布于 2024-12-31 07:04:49
21100
代码可运行
举报
文章被收录于专栏:java学习java学习
运行总次数:0
代码可运行

引言

最近项目中有一个需求,需求是这样的。需要将A项目中的数据全部推送到B项目组,同时需要可配置化切换读取的数据源。也就是说需要兼容之前读取A项目数据源。防止读取B项目有问题可随时切换。

需求很明确,功能挺简单。但当我看到A项目中的下面这行代码时,有点小懵逼。还是因为自己对PageHelper不太熟悉。

代码语言:txt
AI代码解释
复制
 //业务代码
   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返回。于是乎,我写了以下代码。感觉不太对因为没设置分页,但先看看。

代码语言:txt
AI代码解释
复制
 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]}

new PageInfo 的分析

于是我看了一下pageInfo的构造函数。很明显的发现了区别。入参的list有2种,一种是实现Page类。一种是实现Collection

类。2个类的区别可以很明显发现:实现Page的list会使用Page自身的总条数、页面数、显示条数等,而对于实现Collection的list则是将list的本身数据作为了全量数据,可以看出这种数据永远只有1页

代码语言:txt
AI代码解释
复制
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自身的分页数据进行赋值。

代码语言:txt
AI代码解释
复制
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生成了。所以在后期配置其他属性都解决不了这个问题了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

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 这一点来处理了。

直接上代码

代码语言:txt
AI代码解释
复制
 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项目返回的直接就是分页数据,那么转换就只需要

代码语言:txt
AI代码解释
复制
     
        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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • new PageInfo 的分析
  • 第一次尝试
  • 第二次尝试
  • 解决方案
  • 总结
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档