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

业务代码如下:

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

用的是pagehelper-spring-boot-starter


            com.github.pagehelper
            pagehelper-spring-boot-starter
            1.2.3
        
// 配置文件
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 getCompanyList( int pageIndex, int pageSize, CompanyDTO companyDTO) {
        PageHelper.startPage(pageIndex, pageSize);
        List companyDTOS = companyDTOMapper.getCompanyListByCond(companyDTO); // startPage()方法后面紧跟的是要分页的查询语句
        int counts = this.countCompanyByCond(companyDTO);
        PageBean companyPage = new PageBean<>(pageIndex, pageSize, counts);
        companyPage.setItems(companyDTOS);
        return companyPage;
    }

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

你可能感兴趣的:(java)