Spring Boot中的Mybatis分页插件-pageh

很多时候我们写DAO层接口会写一个查询所有记录的方法,但是在数据量非常大的时候,查询所有记录会巨慢无比,这时我们就需要用到分页查询。pagehelper就是个很好的分页插件。

1,配置

pagehelper的项目地址:地址

我们只需在Maven中加入如下依赖即可:

1
2
3
4
5
xml复制代码<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>

2,执行分页查询

首先这里先写好DAO和Mapper XML的查询全部部分:

Mapper XML的select节点:

1
2
3
xml复制代码<select id="getAll" resultMap="userResultMap">
select * from `user`
</select>

DAO:

1
2
3
4
java复制代码/**
* 获取全部用户
*/
List<User> getAll();

User类表示一个用户的POJO类。

然后在Service中写一个查询指定页的用户的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
java复制代码@Autowired
private UserDAO userDAO;

/**
* 查询用户
*
* @param pageNum 当前页码
* @param pageSize 一页的记录数
*/
public Page<User> getUserList(int currentPage, int pageSize) {
Page<User> userPage = PageHelper.startPage(currentPage, pageSize).doSelectPage(() -> userDAO.getAll());
return userPage;
}

使用PageHelper类即可很轻松的进行分页查询了!可见PageHelperstartPage方法用于指定要获取的当前页码和一页的记录数,startPage这个方法就设定了分页查询的基本参数,返回了个PageMethod对象,然后在此基础上,执行PageMethod对象的doSelectPage方法,这个方法中通过lambda语句执行我们Mybatis的查询全部方法,这样内部就自动完成了分页逻辑,并返回了指定页码的数据记录。

最后查询的结果是个Page对象,这个对象有如下方法:

  • getPageNum 获取当前的页码
  • getPages 获取总页数
  • getTotal 获取总记录数
  • getResult 获取当前页的数据记录,为一个List集合

所以在Controller中我们就可以通过调用Service取得结果的Page对象后,再调用getResult方法获取这一页的数据:

1
2
java复制代码//查询第一页数据,每一页15条记录
userService.getUserList(1, 15).getResult();

上述startPage方法第一个参数写0和1是一样的,都表示获取第一页。

3,优化分页模型

实际业务中通常会自己封装一个类表示我们分页查询后的结果:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
java复制代码import com.github.pagehelper.Page;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.Serializable;
import java.util.List;

/**
* 分页查询结果模型,存放整个结果分页基本信息和当前页信息以及内容
*/
@Setter
@Getter
@NoArgsConstructor
public class Paging<T> implements Serializable {

/**
* 当前页
*/
private int currentPageNum;

/**
* 总页数
*/
private int totalPageNum;

/**
* 每页记录数量
*/
private int pageSize;

/**
* 总记录数
*/
private long totalCount;

/**
* 当前页记录集合
*/
List<T> dataCurrentPage;

/**
* 传入Page结果对象构造Pageing对象
*
* @param pageResult 分页查询结果Page对象
*/
public Paging(Page<T> pageResult) {
this.currentPageNum = pageResult.getPageNum();
this.totalPageNum = pageResult.getPages();
this.totalCount = pageResult.getTotal();
this.pageSize = pageResult.getPageSize();
this.dataCurrentPage = pageResult.getResult();
}

}

这里封装了一个Paging类,表示我们查询的分页结果类。然后改造上述Service的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
java复制代码@Autowired
private UserDAO userDAO;

/**
* 查询用户
*
* @param pageNum 当前页码
* @param pageSize 一页的记录数
*/
public Paging<User> getUserList(int currentPage, int pageSize) {
Page<User> userPage = PageHelper.startPage(currentPage, pageSize).doSelectPage(() -> userDAO.getAll());
Paging<User> userPaging = new Paging<User>(userPage);
return userPaging;
}

让Service处理我们得到的分页结果Page对象中所需要的属性,并放入我们自己的分页模型Paging并返回,这样更加方便。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%