在使用Mybatis的分页插件PageHelper时导致的分页失效

Mybatis分页插件的原理

MyBatis 的分页插件主要通过拦截 SQL 执行过程来实现分页功能。其原理大致如下:
  1. 拦截器:MyBatis 分页插件是通过拦截器(Interceptor)来实现的。拦截器可以在执行 SQL 语句前后进行拦截和处理。
  2. SQL 解析:当执行查询操作时,分页插件会拦截 SQL 语句,并解析其中的分页相关信息,比如需要查询的页数、每页的记录数等。
  3. SQL 重写:基于解析的结果,分页插件会对原始的 SQL 语句进行改写,通常是在原始的 SQL 语句外部包裹一层包含分页逻辑的 SQL,以实现分页查询。
  4. 执行查询:改写后的 SQL 语句将被用来执行数据库查询操作,只返回符合分页条件的数据。

总的来说,在你调用PageHelper的开始分页方法时,只会在接下来执行的第一条查询有效,在它返回的list其实不是Collection类型,而是Page。

我碰到的问题:使用分页插件分页后,返回的total总数是正确的,由于我需要返回给前端的数据需要组装为其他数据, 在组装之后这时候发现,total总数不正确。

原因:

 public PageInfo(List<? extends T> list, int navigatePages) {
        super(list);
        this.isFirstPage = false;
        this.isLastPage = false;
        this.hasPreviousPage = false;
        this.hasNextPage = false;
        if (list instanceof Page) {
        //如果是Page对象
            Page page = (Page)list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();
            this.pages = page.getPages();
            this.size = page.size();
            if (this.size == 0) {
                this.startRow = 0L;
                this.endRow = 0L;
            } else {
                this.startRow = page.getStartRow() + 1L;
                this.endRow = this.startRow - 1L + (long)this.size;
            }
        } else if (list instanceof Collection) {
        //如果是集合,page的size就会使用list的大小
            this.pageNum = 1;
            this.pageSize = list.size();
            this.pages = this.pageSize > 0 ? 1 : 0;
            this.size = list.size();
            this.startRow = 0L;
            this.endRow = list.size() > 0 ? (long)(list.size() - 1) : 0L;
        }

        if (list instanceof Collection) {
            this.calcByNavigatePages(navigatePages);
        }

    }

我的解决方法:

 PageInfo<CaseLibVo> pageInfo = new PageInfo();
 pageInfo.setList(yourList);
 pageInfo.setTotal(yourList.size());
 //可以选择使用这个pageInfo对象返回
 return pageinfo;

希望能帮到碰到这种问题的人。
不知道大家有没有更好的解决方法,欢迎评论!!!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值