分页插件
2026/1/15大约 3 分钟MyBatis分页PageHelper
分页插件
分页插件使用步骤
1. 添加依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>2. 配置分页插件
在 MyBatis 的核心配置文件中配置插件:
<plugins>
<!-- 设置分页插件 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>分页插件的使用
分页原理
limit index, pageSize
index: 当前页的起始索引
pageSize: 每页显示的条数
pageNum: 当前页的页码
index = (pageNum - 1) * pageSize基本使用
@Test
public void testPageHelper() {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = factory.openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 1. 在查询功能之前开启分页
PageHelper.startPage(1, 5); // 第1页,每页5条
// 2. 执行查询
List<Emp> list = mapper.selectByExample(null);
// 3. 获取分页相关数据
PageInfo<Emp> pageInfo = new PageInfo<>(list, 5); // 5表示导航分页的页码数
System.out.println("pageInfo = " + pageInfo);
} catch (IOException e) {
e.printStackTrace();
}
}使用 Page 对象
@Test
public void testPage() {
// 开启分页,返回Page对象
Page<Object> page = PageHelper.startPage(1, 5);
List<Emp> list = mapper.selectByExample(null);
// 输出分页信息
System.out.println("当前页码: " + page.getPageNum());
System.out.println("每页条数: " + page.getPageSize());
System.out.println("总记录数: " + page.getTotal());
System.out.println("总页数: " + page.getPages());
}分页相关数据
PageInfo 对象
PageInfo{
pageNum=8, // 当前页码
pageSize=4, // 每页条数
size=2, // 当前页显示的真实条数
startRow=29, // 起始行
endRow=30, // 结束行
total=30, // 总记录数
pages=8, // 总页数
list=Page{...}, // 分页数据
prePage=7, // 上一页页码
nextPage=0, // 下一页页码
isFirstPage=false, // 是否为第一页
isLastPage=true, // 是否为最后一页
hasPreviousPage=true,// 是否有上一页
hasNextPage=false, // 是否有下一页
navigatePages=5, // 导航分页的页码数
navigateFirstPage=4, // 导航分页的第一页
navigateLastPage=8, // 导航分页的最后一页
navigatepageNums=[4, 5, 6, 7, 8] // 导航分页的页码
}常用数据说明
| 属性 | 说明 |
|---|---|
| pageNum | 当前页的页码 |
| pageSize | 每页显示的条数 |
| size | 当前页显示的真实条数 |
| total | 总记录数 |
| pages | 总页数 |
| prePage | 上一页的页码 |
| nextPage | 下一页的页码 |
| isFirstPage | 是否为第一页 |
| isLastPage | 是否为最后一页 |
| hasPreviousPage | 是否存在上一页 |
| hasNextPage | 是否存在下一页 |
| navigatePages | 导航分页的页码数 |
| navigatepageNums | 导航分页的页码,如 [1,2,3,4,5] |
完整测试代码
public class PageHelperTest {
@Test
public void testPageHelper() {
try {
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = factory.openSession(true);
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 开启分页
PageHelper.startPage(2, 4);
// 查询数据
List<Emp> list = mapper.selectByExample(null);
// 获取分页信息
PageInfo<Emp> pageInfo = new PageInfo<>(list, 5);
// 输出分页信息
System.out.println("当前页码: " + pageInfo.getPageNum());
System.out.println("每页条数: " + pageInfo.getPageSize());
System.out.println("当前页真实条数: " + pageInfo.getSize());
System.out.println("总记录数: " + pageInfo.getTotal());
System.out.println("总页数: " + pageInfo.getPages());
System.out.println("是否有上一页: " + pageInfo.isHasPreviousPage());
System.out.println("是否有下一页: " + pageInfo.isHasNextPage());
System.out.println("导航页码: " + Arrays.toString(pageInfo.getNavigatepageNums()));
// 输出数据
System.out.println("分页数据:");
list.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}注意事项
注意
PageHelper.startPage()必须在查询语句之前调用- 只对紧跟在
startPage()后的第一个查询语句生效 - 分页插件不支持嵌套查询
总结
PageHelper 是 MyBatis 最常用的分页插件,使用简单,功能强大。只需要在查询前调用 PageHelper.startPage(),然后使用 PageInfo 获取分页相关数据即可。
