0%

Mybatis 分页插件PageHelper,告别重复代码 - JAVA

写代码时总会碰到各种各样的分页操作,纵然你用了Mybatis之类的ORM框架,还是无法避免重复的分页代码。

完善的Java生态自然有成熟的解决方案,比较流行的一个解法是使用PageHelper插件。

PageHelper插件官方地址: https://github.com/pagehelper/Mybatis-PageHelper

简单来讲,PageHelper插件会帮你把你的selectALl语句自动转换为一个分页查询的sql,并且给你返回详细的分页信息

话不多说,直接上例子。

在Spring已然成为Java业界的事实标准的情况下,我们只聊Spring Boot。

引入依赖

不同的spring版本可能需要不同的pageHelper版本,推荐使用1.2.13

1
2
3
4
5
6
         <!--MyBatis分页插件starter-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper-starter.version}</version>
</dependency>

写代码

代码示例

  • PageHelper.startPage(pageNum, pageSize) 这一句会作用于下面的第一个查询语句。
  • PageHelper的pageNum是从1开始,不是从0开始!
  • PageInfo可以获取所有的分页信息。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    PageHelper.startPage(pageNum, pageSize);
    PmsProductExample example = new PmsProductExample();
    PmsProductExample.Criteria criteria = example.createCriteria();
    criteria.andDeleteStatusEqualTo(0)
    .andPublishStatusEqualTo(1);
    if (categoryId != null) {
    criteria.andProductCategoryIdEqualTo(categoryId);
    }
    example.setOrderByClause("id desc");
    List<PmsProduct> pmsProducts = productMapper.selectByExample(example);

    PageInfo<PmsProduct> pageInfo = new PageInfo<>(pmsProducts);
    其中PageInfo包含了分页所需的所有信息,如下: PageInfo.png
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
pageNum当前页 
pageSize每页的数量
size当前页的数量
orderBy排序
startRow当前页面第一个元素在数据库中的行号
endRow当前页面最后一个元素在数据库中的行号
total总记录数(在这里也就是查询到的用户总数)
pages总页数 (这个页数也很好算,每页5条,总共有11条,需要3页才可以显示完)
list结果集
prePage前一页
nextPage下一页
isFirstPage是否为第一页
isLastPage是否为最后一页
hasPreviousPage是否有前一页
hasNextPage是否有下一页
navigatePages导航页码数
navigatepageNums所有导航页号
navigateFirstPage导航第一页
navigateLastPage导航最后一页
firstPage第一页
lastPage最后一页

非常详细,应有尽有,基本可以满足我们的所有日常业务需求。

安全性

PageHelper 方法使用了静态的ThreadLocal参数,分页参数和线程是绑定的。只要你可以保证在 PageHelper 方法调用后紧跟 MyBatis 查询方法,这就是安全的。 PageHelper 在 finally 代码段中自动清除了 ThreadLocal存储的对象。

但是千万不要写成下面这样

1
2
3
4
5
6
7
PageHelper.startPage(1, 10);
List<Country> list;
if(param1 != null){
list = countryMapper.selectIf(param1);
} else {
list = new ArrayList<Country>();
}

就不讲为什么了。

国人写的一款分页插件,让我感觉自己就是代码的搬运工。