引言
Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在开发过程中,分页查询是一个常见的需求。为了简化分页查询的操作,我们可以使用 Mybatis 的分页插件,如 PageHelper
。
分页插件的概念
分页查询时,通常需要传入页数(page)和每页条数(pageSize)。返回的数据包括页面数据、总条数、总页数、当前页面、每页条数等。使用分页插件可以快速帮助我们获取这些数据。
分页插件的核心原理
分页查询的核心原理是通过 SQL 语句中的 LIMIT 关键字,根据传入的参数(当前页码、每页显示条数)来控制返回的当前页的内容范围。
Mybatis分页插件的配置步骤
添加依赖
在项目的 pom.xml 文件中添加 PageHelper
的依赖(以5.2.0版本为例)
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
Mybatis 配置分页插件
- 在MyBatis的核心配置文件(如 mybatis-config.xml)中配置插件
<plugins>
<!--设置分页插件-->
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
分页插件的使用
开启分页功能
在查询功能之前使用 PageHelper.startPage(int pageNum, int pageSize)
开启分页功能,传入当前页码和每页显示的条数:
pageNum
:当前页的页码pageSize
:每页显示的条数
@Test
public void testPageHelper() throws IOException {
// 加载 MyBatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 使用 SqlSessionFactoryBuilder构建SqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 打开 SqlSession,设置为自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 获取 EmpMapper接口的代理实现类
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 开始分页,设置页码为1,每页显示4条数据
// 注意:startPage()方法需要在执行查询方法之前调用
// PageHelper会自动拦截查询操作,并添加LIMIT子句实现分页
PageHelper.startPage(1, 4);
// 执行查询操作,获取分页后的数据列表
// 由于已经调用了 PageHelper.startPage(),这里传入null作为查询条件,返回的是第一页的数据
List<Emp> emps = mapper.selectByExample(null);
// 遍历并打印查询结果
emps.forEach(System.out::println);
// 由于在打开 SqlSession时设置了自动提交事务,这里不需要手动提交或回滚
// 关闭 SqlSession
sqlSession.close();
}
进行分页测试:
分页相关数据
直接输出
@Test
public void testPageHelper() throws IOException {
// 加载MyBatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 使用SqlSessionFactoryBuilder构建SqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 打开SqlSession,设置为自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 获取EmpMapper接口的代理实现类
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 访问第一页,每页四条数据
// 注意:这里使用PageHelper.startPage()方法,但实际上返回的Page对象在PageHelper 5.x 版本中可能不被直接使用
// 通常我们只关心返回的List集合和分页信息,Page对象可能在较新或特定版本的PageHelper中使用
Page<Object> page = PageHelper.startPage(1, 4);
// 执行查询操作,获取分页后的数据列表
List<Emp> emps = mapper.selectByExample(null);
// 在查询到List集合后,尝试打印分页数据,但这里可能不会打印出预期的Page对象信息
// 因为Page对象在这里可能只是一个占位符,实际的分页信息需要通过其他方式获取
System.out.println(page);
// 关闭SqlSession
sqlSession.close();
}
- 分页相关数据:
Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=8, pages=2, reasonable=false, pageSizeZero=false}[Emp{eid=1, empName='admin', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=2, empName='admin2', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=3, empName='王五', age=12, sex='女', email='123@qq.com', did=3}, Emp{eid=4, empName='赵六', age=32, sex='男', email='123@qq.com', did=1}]
使用PageInfo
在查询获取list集合之后,使用 PageInfo<T> pageInfo = new PageInfo<>(List<T> list, intnavigatePages)
获取分页相关数据:
list
:分页之后的数据navigatePages
:导航分页的页码数
@Test
public void testPageHelper() throws IOException {
// 加载MyBatis配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// 使用SqlSessionFactoryBuilder构建SqlSessionFactory
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
// 打开SqlSession,设置为自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);
// 获取EmpMapper接口的代理实现类
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 访问第一页,每页四条数据
PageHelper.startPage(1, 4);
// 执行查询操作,获取分页后的数据列表
List<Emp> emps = mapper.selectByExample(null);
// 创建一个PageInfo对象,用于包装查询到的List集合和分页信息
// 这里的第二个参数5可能是误用,PageInfo的构造函数第二个参数通常是导航页码大小,这里应该省略或设置为合适的值
PageInfo<Emp> page = new PageInfo<>(emps); // 正确的使用方式,不需要第二个参数
// 打印分页信息,包括当前页数据、总页数、总条数等
System.out.println(page);
// 关闭SqlSession
sqlSession.close();
}
分页相关数据:
PageInfo{
pageNum=1, pageSize=4, size=4, startRow=1, endRow=4, total=8, pages=2,
list=Page{count=true, pageNum=1, pageSize=4, startRow=0, endRow=4, total=8, pages=2, reasonable=false, pageSizeZero=false}[Emp{eid=1, empName='admin', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=2, empName='admin2', age=22, sex='男', email='456@qq.com', did=3}, Emp{eid=3, empName='王五', age=12, sex='女', email='123@qq.com', did=3}, Emp{eid=4, empName='赵六', age=32, sex='男', email='123@qq.com', did=1}],
prePage=0, nextPage=2, isFirstPage=true, isLastPage=false, hasPreviousPage=false, hasNextPage=true, navigatePages=5, navigateFirstPage=1, navigateLastPage=2, navigatepageNums=[1, 2]}
其中 list
中的数据等同于方法一中直接输出的 page
数据
常用数据说明
pageNum
:当前页的页码pageSize
:每页显示的条数size
:当前页显示的真实条数total
:总记录数pages
:总页数prePage
:上一页的页码nextPage
:下一页的页码isFirstPage
/isLastPage
:是否为第一页 / 最后一页hasPreviousPage
/hasNextPage
:是否存在上一页/下一页navigatePages
:导航分页的页码数navigatepageNums
:导航分页的页码,[1,2,3,4,5]
总结
Mybatis 的分页插件 PageHelper
通过简单的配置和使用,可以快速实现分页查询功能,极大地简化了开发过程。同时,了解分页查询的SQL实现原理,有助于我们更好地理解和使用分页插件。