如何在SpringBoot中使用PageHelper
-
先添加依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.12</version> </dependency> -
SpringBoot 2.6.x及以上版本要开启循环依赖(除非你的SpringBoot版本兼容PageHelper版本)
这些代码写在application.yml中。
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/learn_java?usessl=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
main:
allow-circular-references: true下面是PageHelper的配置
pagehelper:
helper-dialect: mysql
reasonable: false
default-count: true -
然后在自定义的控制器中进行测试:
@Autowired
private BookService bookService;@GetMapping
public void selectAll(){
PageHelper.startPage(1,6); //第一个参数表示第几页,第二个参数表示每页含几条数据。
List<Book> userList = bookService.selectAll();
PageInfo pageInfo = new PageInfo(userList);
System.out.println(pageInfo);
}
注意:
- 分页插件只对PageHelper. startPage( pageNum, pageSize )后执行的的第一个select语句进行分页。
- 上面的这段代码会返回第一页的数据,如果要返回第n页的数据,可以使用PageHelper. startPage( n, 6 )。
关于PageHelper的坑(官方文档中更详细)
如果你写出下面这样的代码,就是不安全的用法:
PageHelper.startPage(1, 10);
List<User> list;
if(param1 != null){
list = userMapper.selectIf(param1);
} else {
list = new ArrayList<User>();
}
这种情况下由于 param1 存在 null 的情况,就会导致 PageHelper 生产了一个分页参数,但是没有被消费,这个参数 就会一直保留在这个线程上。当这个线程再次被使用时,就可能导致不该分页的方法去消费这个分页参数,这就产生了莫名其妙的分页。
上面这个代码,应该写成下面这个样子:
List<User> list;
if(param1 != null){
PageHelper.startPage(1, 10);
list = userMapper.selectIf(param1);
} else {
list = new ArrayList<User>();
}
这种写法就能保证安全。
如果你对此不放心,你可以手动清理ThreadLocal存储的分页参数,可以像下面这样使用:
List<User> list;
if(param1 != null){
PageHelper.startPage(1, 10);
try{
list = userMapper.selectAll();
} finally {
PageHelper.clearPage();
}
} else {
list = new ArrayList<User>();
}
这么写很不好看,而且没有必要。