一、介绍
Pagehelper是mybatis一个插件,主要是更加方便地进行分页查询;pagehelpe分页插件给我们封装了很多参数,不用我们再去硬性编码获取各种参数。
将查到的分页数据包装成com.github.pagehelper.Page或者com.github.pagehelper.PageInfo对象当中,Page或者PageInfo的对象就会包含分页信息,比如每页数量、当前页数、总条数、上一页或下一页等分页信息。
二、PageHelper的使用
主要以Springboot项目为示例
2.1 首先需要导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
● gradle依赖导入:
implementation group: 'com.github.pagehelper', name: 'pagehelper', version: '5.1.10'
2.2 配置yml文件
○ 配置文件
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: pageNum=pageNum;pageSize=pageSize;
○ 配置项详解
#格式:
# pagehelper:
# xxxxx: xx
# 如:
# pagehelper:
# offsetAsPageNum: false
# 常用配置:
# helperDialect: 数据库方言, 默认:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式
# 可选择 oracle,mysql,postgresql,db2,sqlserver,sqlserver2012 等
# offsetAsPageNum: 默认值为 false, 该参数对使用 RowBounds 作为分页参数时有效。
# 当该参数设置为 true 时,会将 RowBounds 中的 offset 参数当成 pageNum 使用,
# 可以用页码和页面大小两个参数进行分页。
# rowBoundsWithCount: 默认值为false,该参数对使用 RowBounds 作为分页参数时有效。
# 当该参数设置为true时,使用 RowBounds 分页会进行 count 查询。
# pageSizeZero: 默认值为 false,当该参数设置为 true 时,如果 pageSize=0 或者 RowBounds.limit = 0 就会
# 查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是 Page 类型)。
# reasonable: 分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,
# pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。
# params: 为了支持startPage(Object params)方法,增加了该参数来配置参数映射,用于从对象中根据属性名取值,
# 可以配置 pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的用默认值,
# 默认值为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
# supportMethodsArguments 支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,
# 自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页
2.3 使用方式
● 静态方法,传递两个参数(当前页码,每页查询条数)
● 使用pageHelper 分页的时候,不再关注分页语句,查询全部的语句
● 自动的对PageHelper.startPage 方法下的第一个sql 查询进行分页
// pageNum 当前页数, pageSize 每页条数;
/* 注意:
1. 只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select)方法会被分页。
2. 由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。
*/
// 步骤一:
// 参数分别是设置 当前的页数pageNum 和 每页的数量pageSize
PageHelper.startPage(pageNum, pageSize);
// 步骤二:
// startPage后面跟着的查询就会进行分页查询
List<Employee> employeeList = employeeMapper.example();
// 步骤三:
// 使用PageInfo包装查询后的结果,只要将PageInfo中的信息返回给页面
// PageInfo封装了详细的分页信息,包括查询出来的数据employeeList
PageInfo<Employee> pageResult = new PageInfo<>(employeeList);
2.4 其他方式的使用
// 说明:
// 其他方式 针对 2.3中的步骤一、二步的不同使用方式
// 方式一:
PageHelper.offsetPage(pageNum, pageSize);
List<Employee> list1 = employeeMapper.example();
// 方式二:
// 参数方法调用
// 1. 接口方法定义, xml 中不需要处理这两个参数 List<Employee> selectByPageNumSize(@Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
// 2. supportMethodsArguments=true
List<Employee> list2 = employeeMapper.selectByPageNumSize(pageNum, pageSize);
三、Page和PageInfo的区分
3.1 Page和PageInfo介绍
两者都能获取到数据,
- Page是一个ArrayList。
- PageInfo是一个对象,能获取到的数据比Page多。
3.2 Page和PageInfo常用属性
- Page常用属性:
private int pageNum; //当前页码
private int pageSize; //每页数据的数量
private int startRow; //始页首行行号
private int endRow; //尾页尾行行号
private long total; //总记录数
private int pages; //总页数
private Boolean reasonable; //分页合理化
private Boolean pageSizeZero; //当设置为true的时候,如果pagesize设置为0(或RowBounds的limit=0),就不执行分页,返回全部结果
- PageInfo常用属性:
private int pageNum; //当前页
private int pageSize; //每页显示数据条数
private int size; //当前页的数量
private int startRow; //始页首行行号
private int endRow; //尾页尾行行号
private long total; //总记录数
private int pages; //总页数
private List<T> list; //查询结果的数据
private int firstPage; //首页
private int prePage; //上一页
private int nextPage; // 下一页
private int lastPage; //最后一页
private boolean isFirstPage; //是不是第一页
private boolean isLastPage; //是不是最后一页
private boolean hasPreviousPage;//有没有上一页
private boolean hasNextPage; //有没有下一页
private int navigatePages; //所有导航页号
private int[] navigatepageNums; //导航页码数
3.3 Page和PageInfo的使用
- 首先,就是开启分页,设置 pageNum:当前页 和 pageSize:每页记录数,2.3使用方式中使用示例的步骤一;
- 然后,就利用Mybatis根据上面设置的分页条件,去查询数据库,得到查询结果,2.3使用方式中使用示例的步骤二;
- 然后,可以根据前端对分页数据格式的要求,把上一步骤中查到的分页数据,包装成Page对象或者PageInfo对象
- 包装成Page对象
Page<Employee> pageResult = (Page<Employee>) employeeList;
- 包装成PageInfo对象
PageInfo<Employee> pageResult = new PageInfo<>(employeeList);
四、总结
- PageHelper是分页插件,结合mybatis、spring 使用;
- 只需要在需要执行的sql上面,加入代码 PageHelper.startPage(pageNum, pageSize),就可以实现;
- 分页原理是通过ThreadLocal 或者 开启自动查找参数中的分页参数,在执行真实sql 之前查询总数,然后返回Page(list)对象,实现分页效果。