PageHelper

一、引入

通过Mybatis框架写SQL语句也是可以实现分页查询的。但是很繁琐,可以用Mybatis框架的一个插件PageHelper来实现分页查询。

在使用 MyBatis 时,PageHelper 是一个非常方便的分页插件,它可以帮助我们在执行查询时自动处理分页逻辑。官网:https://pagehelper.github.io/

二、使用

1.插件实现流程

1.先获取到要执行的SQL语句:select * from db

2.把SQL语句中的字段列表,变为:count(*)

3.执行SQL语句:select count(*) from emp //获取到总记录数

4.再对要执行的SQL语句:select * from emp 进行改造,在末尾添加 limit ? , ?

5.执行改造后的SQL语句:select * from emp limit ? , ?

2.引入依赖

1
2
3
4
5
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>

3.配置 PageHelper

application.ymlapplication.properties 中配置 PageHelper(这一步通常不是必须的,除非你需要进行一些定制化设置)。

1
2
3
4
5
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
params: count=countSql

4.代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

@Service
public class UserService {

@Autowired
private UserMapper userMapper;

public PageInfo<User> getUsers(int pageNum, int pageSize) {
// 开启分页
PageHelper.startPage(pageNum, pageSize); // 页码数,及每页数量
// 执行查询
// 用Page来接收数据
List<User> users = userMapper.selectAllUsers(); // 就是执行没加数量限制的SQL语句
// 返回分页信息
return users;
}
}

使用Page 或 PageInfo接收数据

1
2
3
4
5
// Page
Page<User> users = userMapper.selectAllUsers();
// PageInfo
List<User> users = userMapper.selectAllUsers();
PageInfo<User> users = new PageInfo(users);

区别

1
2
3
4
5
6
7
8
9
// Page
private int pageNum; //当前页码
private int pageSize; //每页数据的数量
private int startRow; //始页首行行号
private int endRow; //尾页尾行行号
private long total; //总记录数
private int pages; //总页数
private Boolean reasonable; //分页合理化
private Boolean pageSizeZero; //当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// PageInfo
private int pageNum; //当前页
private int pageSize; //每页显示数据条数
private int size; //当前页的数量
private int startRow; //始页首行行号
private int endRow; //尾页尾行行号
private long total; //总记录数
private int pages; //总页数
private List<T> list; //查询结果的数据
private int firstPage; //首页
private int prePage; //上一页
private int nextPage; // 下一页
private int lastPage; //最后一页
private boolean isFirstPage; //是不是第一页
private boolean isLastPage; //是不是最后一页
private boolean hasPreviousPage;//有没有上一页
private boolean hasNextPage; //有没有下一页
private int navigatePages; //所有导航页号
private int[] navigatepageNums; //导航页码数

针对不同的场景使用不同的对象来接收数据。