SpringBoot + PageHelper, 分页不生效解决方案

业务代码如下:

public PageBean<CompanyDTO> getCompanyList( int pageIndex, int pageSize, CompanyDTO companyDTO) {
        PageHelper.startPage(pageIndex, pageSize);
        int counts = this.countCompanyByCond(companyDTO);
        List<CompanyDTO> companyDTOS = companyDTOMapper.getCompanyListByCond(companyDTO);
        PageBean companyPage = new PageBean<>(pageIndex, pageSize, counts);
        companyPage.setItems(companyDTOS);
        return companyPage;
    }

用的是pagehelper-spring-boot-starter

<dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
        </dependency>

配置文件

// 配置文件
pagehelper:
  helperDialect: mysql
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql

但是分页就是不生效,每次都会查出全量数据
百度了一个多小时,各种方法都试过了,就是解决不了
无奈之下,只能爬官网文档,终于找到这么一段话:PageHelper-如何使用分页插件

4. 什么时候会导致不安全的分页?
PageHelper 方法使用了静态的 ThreadLocal 参数,分页参数和线程是绑定的。

只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。
因为 PageHelper 在 finally 代码段中自动清除了 ThreadLocal 存储的对象。

如果代码在进入 Executor 前发生异常,就会导致线程不可用,这属于人为的 Bug
(例如接口方法和 XML 中的不匹配,导致找不到 MappedStatement 时), 这种情况由于线程不可用,也不会导致 ThreadLocal 参数被错误的使用。
而我在上面的业务代码逻辑中调用startPage()方法后,不是直接去查询列表,而是先去查了记录数量,所以后面的查列表的接口就不会使用分页!!修改业务代码如下生效:

public PageBean<CompanyDTO> getCompanyList( int pageIndex, int pageSize, CompanyDTO companyDTO) {
        PageHelper.startPage(pageIndex, pageSize);
        List<CompanyDTO> companyDTOS = companyDTOMapper.getCompanyListByCond(companyDTO); // startPage()方法后面紧跟的是要分页的查询语句
        int counts = this.countCompanyByCond(companyDTO);
        PageBean companyPage = new PageBean<>(pageIndex, pageSize, counts);
        companyPage.setItems(companyDTOS);
        return companyPage;
    }


其实错误很简单,原理也很简单,就是PageHelper设置的分页参数被提前消费了,但是因为对PageHelper的原理理解不清晰,又没有直接去官网获取信息,而百度出来的也都不适用我这种情况,所以解决起来花的时间比较多.
所以,学习这件事,还是得直击原理,不能走捷径!
 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值