Mybatis08-使用pageHelper
一、什么是分页
1-1、传参
页码:pageNum(用户会发送请求,携带页码 pageNum 给服务器.)
每页显示的记录条数:pageSize,例如百度默认就是每页展示 10 条记录。
实际上每一次在进行分页请求发送的时候,都是要发送两个数据的:
- 页码 pageNum 要传送给服务器。
- 每页显示的记录条数 pageSize 也要传送给服务器。
前端提交表单的话,数据格式:
uri?pageNum=1&pageSize=10
1-2、关于mysql当中的分页sql应该怎么写?
limit关键字。
limit 语法格式:
limit 开始下标,显示的记录条数,
示例:limit startIndex, pageSize(从第startIndex条开始,显示pageSize条)
select * from t_car limit 0, 3;
select * from t_car limit 2; 和 select * from t_car limit 0, 2;是等效的。
mysql当中起始行的下标从0开始。第一条记录的下标是0。
二、使用 PageHelper 插件(推荐)
PageHelper 是 MyBatis 最常用的分页插件,它通过拦截器方式,在执行 SQL 前自动在语句后追加 LIMIT
和 OFFSET
,从而达到分页的目的。
它的核心原理是拦截 Executor.query()
方法,对 SQL 动态改写。
1. 添加依赖(Maven)
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.2</version>
</dependency>
2、在 mybatis-config.xml中添加拦截器
<plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql" /><property name="reasonable" value="true" /></plugin>
</plugins>
配置结构说明
<plugins>
是 MyBatis 插件扩展点<plugin>
是指注册一个分页拦截器(PageInterceptor
)每个
<property>
都是对插件行为的控制
(1)、helperDialect="mysql"
指定数据库方言,也就是 PageHelper 应该为哪种数据库生成分页语句。
值 | 对应数据库 |
---|---|
mysql | MySQL、MariaDB |
oracle | Oracle |
mssql | SQL Server |
postgresql | PostgreSQL |
sqlite | SQLite |
建议:明确指定
mysql
,避免自动识别出错。
(2)、reasonable="true"
是否启用 分页参数合理化机制,常用于防止越界问题。
启用后(true
)的行为:
情况 | 结果 |
---|---|
pageNum ≤ 0 | 自动使用第一页(pageNum = 1) |
pageNum > 最大页 | 自动使用最后一页 |
pageSize ≤ 0 | 查所有记录 |
示例:
PageHelper.startPage(-1, 10); // 实际使用 pageNum = 1
PageHelper.startPage(9999, 10); // 如果最大页是 50,会用 pageNum = 50
推荐开启,防止前端传参错导致崩溃或空页。
3. 基本用法
你只需要在查询之前调用:
startPage
会自动修改 SQL,加上 LIMIT 和 OFFSET,配合 PageInfo
拿到分页数据和总页数等信息。
【注意】:
一定要在执行sql语句之前加上:PageHelper.startPage(pageNum, pageSize);
控制台执行的sql语句会自动加上limit分页
4. PageInfo 的使用(封装分页结果)
PageInfo<Car> pageInfo = new PageInfo<>(cars);
直接将查询结果给到pageInfo即可
方法 | 返回值 | 含义 |
---|---|---|
getTotal() | long | 总记录数 |
getPages() | int | 总页数 |
getPageNum() | int | 当前页码 |
getPageSize() | int | 每页大小 |
getList() | List | 当前页的数据列表 |
isHasNextPage() | boolean | 是否有下一页 |
isIsLastPage() | boolean | 是否是最后一页 |
5、XML 文件中的配合使用
你的 XML 中写的仍是普通 SQL:
分页逻辑由 Java 代码调用
PageHelper.startPage()
控制,XML 无需修改。