业务代码如下:
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的原理理解不清晰,又没有直接去官网获取信息,而百度出来的也都不适用我这种情况,所以解决起来花的时间比较多.
所以,学习这件事,还是得直击原理,不能走捷径!