条件分页查询

描述

条件分页查询,常见有四种方式:手动分页,pageHelper插件的startPage()MybatisPlus框架下的IPage。但无论使用哪种方式,条件分页查询都需要查询两次,并且要对查询结果进行排序

MybatisPlus框架分页

详细解释见:MyBatis-Plus 分页查询以及自定义sql分页-腾讯云开发者社区-腾讯云

MP的Wrapper提供了两种分页查询的方式,源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 根据 entity 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件(可以为 RowBounds.DEFAULT)
* @param queryWrapper 实体对象封装操作类(可以为 null)
*/
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

/**
* 根据 Wrapper 条件,查询全部记录(并翻页)
*
* @param page 分页查询条件
* @param queryWrapper 实体对象封装操作类
*/
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

两个分页方法参数都是一致的,只是返回参数略有不同,具体选择根据实际业务为准,在这里暂时只使用第一个方法。

对于单表分页,直接使用实体类的QueryWrapper调用selectPage()即可,对于多表分页,要在Mapper.xml文件中写入要联表查询的方法后直接在分页参数后调用该方法,具体代码如下。

单表分页

Mapper文件

1
2
@Select("select * from paper")
List<Paper> selectAll();

ServiceImpl文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 1️⃣ 手动分页
*/
public List<Paper> manualPage(int pageNum, int pageSize) {
List<Paper> allList = paperMapper.selectAll(); // 查询全部
int fromIndex = (pageNum - 1) * pageSize;
int toIndex = Math.min(fromIndex + pageSize, allList.size());
if (fromIndex >= allList.size()) {
return List.of();
}
return allList.subList(fromIndex, toIndex);
}

/**
* 2️⃣ 使用 PageHelper 分页
*/
public PageInfo<Paper> pageHelperPage(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<Paper> list = paperMapper.selectAll();
return new PageInfo<>(list);
}

/**
* 3️⃣ 使用 MyBatis-Plus 的 IPage 分页
*/
public IPage<Paper> mybatisPlusPage(int pageNum, int pageSize) {
Page<Paper> page = new Page<>(pageNum, pageSize);
return paperMapper.selectPage(page, null);
}

测试文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
@Test
public void testManualPage() {
int pageNum = 1;
int pageSize = 3;
List<Paper> list = paperService.manualPage(pageNum, pageSize);
System.out.println("【手动分页】第 " + pageNum + " 页, 每页 " + pageSize + " 条");
list.forEach(System.out::println);
}

/**
* 2️⃣ PageHelper 分页测试
*/
@Test
public void testPageHelperPage() {
int pageNum = 1;
int pageSize = 3;
PageInfo<Paper> pageInfo = paperService.pageHelperPage(pageNum, pageSize);
System.out.println("【PageHelper 分页】");
System.out.println("总记录数:" + pageInfo.getTotal());
System.out.println("总页数:" + pageInfo.getPages());
System.out.println("当前页:" + pageInfo.getPageNum());
System.out.println("当前页数据:");
pageInfo.getList().forEach(System.out::println);
}

/**
* 3️⃣ MyBatis-Plus 分页测试
*/
@Test
public void testMybatisPlusPage() {
int pageNum = 1;
int pageSize = 3;
IPage<Paper> page = paperService.mybatisPlusPage(pageNum, pageSize);
System.out.println("【MyBatis-Plus 分页】");
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:" + page.getPages());
System.out.println("当前页:" + page.getCurrent());
System.out.println("当前页数据:");
page.getRecords().forEach(System.out::println);
}

多表分页

实例参见MyBatis-Plus 分页查询以及自定义sql分页-腾讯云开发者社区-腾讯云,在给的示例中除了分页 Page 是没有额外传参的,实际上,可以额外传参。