MyBatis 配合 PageHelper 插件实现数据分页

691 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

1. PageHelper 分页插件

PageHelper 是一个强大的 MyBatis 分页插件,主要用来进行查询数据的分页显示,且分页和 Mapper.xml 完全解耦,并以插件的形式实现,对 MyBatis 执行的流程进行了强化,有效的避免了直接写 SQL 语句来实现分页功能。

不过 PageHelper 的内部实现原理也是使用 MyBatis 的拦截器和 limit 分页语句实现的。

2. 分页查询的实现方式

2.1 sql 语句中使用 limit 关键字

  • *** limit [offset,] rows; 其中,offset是相对首行的偏移量,从0开始;rows是返回条数;实际使用时可以使用变量传参。
select * from tableA limit 5,5;

2.2 使用 PageHelper 插件

由于分页限制了数据的显示条数,因此为了完整展示数据量,会先查询满足条件的数据总数量,再对数据进行分页查询。

MyBatis 封装的 PageHelper 插件,减少了每次分页时都去查询总数、页数、每页数量等信息的代码,只需要使用 PageHelper 对象就可以自动实现以上所有查询功能。

3. 使用方法

3.1 引入 PageHelper 依赖信息

  • 在 pom.xml 中添加分页插件依赖包
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.3.0</version>
</dependency>

3.2 配置文件中配置 PageHelper

在 yml 或 properties 配置文件中配置分页插件相关内容,此处使用 yml 配置文件

pagehelper:
 #指定数据库
 helperDialect: mysql  
 #启用分页合理化,当 pagenum<1 时查询第一页数据,pagenum>pages 时查询最后一页数据;不启用时返回空数据;默认为 false 不启用
 reasonable: true
 # 是否支持接口参数来传递分页参数,默认false
 supportMethodsArguments: true
 #用于从对象中根据属性名取值,即定义对应的属性值,直接从对象中获取
 params: count=countSql

3.3 在业务逻辑中使用分页插件

  • 使用时 Mapper 和 xml 中只需要正常定义查询语句,不需要使用额外的 limit 关键字
  • Controller 层代码逻辑正常,返回业务层输出结果
  • 业务逻辑层在操作时,需要使用 PageHelper 对象进行数据分页
@Service
public class UserServiceimpl{
    // 注意分页对象初始化代码一定要和数据获取代码挨着,否则分页无法生效
    // 中将数据对象集合放入分页对象中为了清除多余数据以及添加相应分页信息
    public List<User> selectAll(int pageNum,int pageSize) {
       PageHelper.startPage(pageNum,pageSize);		
       List<User> users = userMapper.selectAll();	
       PageInfo<User> pageInfo = new PageInfo<>(users);	
       return pageInfo.getList();
    }
}

注意:只有紧跟着 PageHelper.startPage() 的 sql 语句才被 PageHelper 起作用