乐趣区

关于java:解决PageHelperstartPagepage-size后total和PageSize总是相等的问题

很多人会应用 PageHelper 主动分页当前,对查出来的数据进行封装返回前端,却发现显示的数据数量和期待的不符,甚至总是和设定的 PageSize 相等,然而查阅了很多博客材料发现话只说一半,对于初学者来说不解决问题。明天就把问题彻底解决了。

一、问题

PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getOrderBy());
// 和数据库的第一次交互
List<Coupon> couponList = couponMapper.selectByExample(couponExample);

// 封装
List<SearchCouponResponse> searchCouponResponseList = couponDao.getSearchCouponResponse(couponList, userId);

// 返回前端
return new PageInfo(searchCouponResponseList);

网上都说 PageHelper.startPage 前面肯定要紧跟和数据库的交互的函数。这样他们就能拦挡到 第一次 和数据库交互的数据并进行分页解决。这话是没错的,然而而后我依据我失去的 list 进行封装这个是很多业务必不可少的吧。然而封装后的数据却损失了很多属性,总共的数据量也失落了。咱们要解决这个问题那么首先咱们就要晓得为什么会这样。

二、起因

代码块一

public PageInfo(List<T> list, int navigatePages) {super(list);// 要害,代码块二展现了 super 内容
        if (list instanceof Page) {  // 要害
            Page page = (Page) list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();

            this.pages = page.getPages();
            this.size = page.size();
            // 因为后果是 >startRow 的,所以理论的须要 +1
            if (this.size == 0) {
                this.startRow = 0;
                this.endRow = 0;
            } else {this.startRow = page.getStartRow() + 1;
                // 计算理论的 endRow(最初一页的时候非凡)this.endRow = this.startRow - 1 + this.size;
            }
        } else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();

            this.pages = this.pageSize > 0 ? 1 : 0;// 要害
            this.size = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }

代码块二

// 第一个构造函数有一个 super(),这里是 super 的内容
public PageSerializable(List<T> list) {
        this.list = list;
        if(list instanceof Page){this.total = ((Page)list).getTotal();} else {this.total = list.size();
        }
    }

依据代码块一,稍有常识的人都能发现,咱们传进来的 List 其实是一个 Page, 因而他须要判断一下传进来的 list 能不能转型成 Page 对象。为什么呢因为咱们说了在第一次和数据库交互的时候,被拦挡到进行了封装,那么返回给你的这部分数据是分页好的,并且保留了特定的信息,而这个过程就是把数据库搜寻到的 list 封装成 page 的过程,也就是说

List<Coupon> couponList = couponMapper.selectByExample(couponExample);

这个 couponList 他不是真的 List 了,是一个 Page 类型。有趣味的敌人打一个断点看看他是什么。

那么也就是说返回给我的 list 是曾经分页好的,并且保留了所有的必要数据。那么我就想,我能不能自己创立一个 PageInfo, 我把必要的数据给他塞进去,然而呢 list 塞我封装好的数据,做一个狸猫换太子的操作

三、解决办法

public PageInfo(List<T> list, int navigatePages) {super(list);
        if (list instanceof Page) {Page page = (Page) list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();

            this.pages = page.getPages();// 共几页
            this.size = page.size();}
public PageSerializable(List<T> list) {
        this.list = list;
        if(list instanceof Page){this.total = ((Page)list).getTotal();} else {this.total = list.size();
        }
    }

那么 PageInfo 稍有常识的人就能发现,他须要 pageNum, pageSize, pages, size, 和 total。前两者是咱们自定义的,后三者是 第一次交互返回给咱们的 list的那个变量里就曾经有的。还有一个 this.list = list 把咱们封装好的给他换进去不就好了?

四、后果

..................... 省略
PageHelper.startPage(pageParam.getPageNum(), pageParam.getPageSize(), pageParam.getOrderBy());
        List<Coupon> couponList = couponMapper.selectByExample(couponExample);

        // 封装
        List<SearchCouponResponse> searchCouponResponseList = couponDao.getSearchCouponResponse(couponList, userId);

        PageInfo pageInfo = new PageInfo();
        if(couponList instanceof com.github.pagehelper.Page) {pageInfo = buildPageInfo((com.github.pagehelper.Page) couponList);// 把属性提取进去本人 new 一个 pageInfo
        }
        pageInfo.setList(searchCouponResponseList); // 再把咱们封装好的塞进去,狸猫换太子

        if(couponList.size() == 0) return new Page(new PageInfo(new ArrayList()));;


        return new Page(pageInfo);
        
.................... 省略
}

private PageInfo buildPageInfo(com.github.pagehelper.Page pageList) {PageInfo pageInfo = new PageInfo();
        pageInfo.setPageNum(pageList.getPageNum());
        pageInfo.setPageSize(pageList.getPageSize());
        pageInfo.setPages(pageList.getPages());
        pageInfo.setTotal(pageList.getTotal());
        return pageInfo;
    }

我的 CSDN 原文地址

退出移动版