PageHelper简单使用
1. 简介
PageHelper是国内优秀的开源的mybatis分页插件,支持主流常用的数据库。
【官网】https://pagehelper.github.io/
2. 使用方法【Maven】
-
导入依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>最新版本</version> </dependency>
-
配置拦截器插件
特别注意,新版拦截器是
com.github.pagehelper.PageInterceptor
。com.github.pagehelper.PageHelper
现在是一个特殊的dialect
实现类,是分页插件的默认实现类,提供了和以前相同的用法。 -
mybatis中xml配置
<!-- plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下: properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers? --> <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageInterceptor"> <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 --> <property name="param1" value="value1"/> </plugin> </plugins>
-
spring配置文件中配置拦截器插件
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 注意其他配置 --> <property name="plugins"> <array> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <value> params=value1 </value> </property> </bean> </array> </property> </bean>
常用的配置:
- helperDialect:指定数据库,例如MySQL、db2、oracle
- reasonable:分页合理化参数,默认值为 false 。当该参数设置为 true 时, pageNum<=0 时会查询第一 页, pageNum>pages (超过总数时),会查询最后一页。
-
常用方法
RowBounds方式的调用
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
-
使用这种调用方式时,你可以使用RowBounds参数进行分页,这种方式侵入性最小,我们可以看到,通过RowBounds方式调用只是使用了这个参数,并没有增加其他任何内容。
-
分页插件检测到使用了RowBounds参数时,就会对该查询进行物理分页。
-
关于这种方式的调用,有两个特殊的参数是针对
RowBounds
的,你可以参看上面的 场景一 和 场景二 -
**注:**不只有命名空间方式可以用RowBounds,使用接口的时候也可以增加RowBounds参数,例如:
//这种情况下也会进行物理分页查询 List<Country> selectAll(RowBounds rowBounds);
- 注意: 由于默认情况下的
RowBounds
无法获取查询总数,分页插件提供了一个继承自RowBounds
的PageRowBounds
,这个对象中增加了total
属性,执行分页查询后,可以从该属性得到查询总数。
PageHelper.startPage静态方法调用【重点】
//获取第1页,10条内容,默认查询总数 count PageHelper.startPage(1, 10); //紧跟着的第一个select方法会被分页 List<Country> list = countryMapper.selectIf(1);
- 在你需要进行分页的 MyBatis 查询方法前调用
PageHelper.startPage
静态方法即可,紧跟在这个方法后的第一个MyBatis 查询方法会被进行分页。
-
3. 实战【权限系统】
-
导入PageHelper依赖
<!--分页查询插件--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency>
-
spring中配置文件配置
<!--配置生产SqlSession的工厂--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--分页插件--> <property name="plugins"> <array> <!-- 传入插件的对象 --> <bean class="com.github.pagehelper.PageInterceptor"> <property name="properties"> <props> <prop key="helperDialect">mysql</prop> <prop key="reasonable">true</prop> </props> </property> </bean> </array> </property> </bean>
-
service中使用PageHelper.startPage方法
public List<Orders> findAllByPages(int start,int size) throws Exception{ PageHelper.startPage(start,size); return ordersDao.findAll(); }
设置开始变化以及每页显示的大小
start:开始位置
size: 每页显示的条数
-
controller中使用PageInfo封装返回结果
@RequestMapping("/findAllByPage.do") public String findAllByPage(@RequestParam(required = true,value = "start",defaultValue = "1") int start, @RequestParam(required = true,value = "size",defaultValue = "4") int size, Model model) throws Exception { List<Orders> all = ordersService.findAllByPages(start,size); PageInfo pageInfo = new PageInfo(all); model.addAttribute("pageInfo",pageInfo); return "orders-list"; }
此处将PageHelper根据查询的List结合传入的开始位置以及每页大小封装的PageInfo对象中,返回的到jsp页面中。
4. PageInfo
PageInfo对象封装了分页查询的诸多信息。包括查询到的对象集合,页面大小,总数等等。
PageInfo部分源码
public class PageInfo<T> implements Serializable {
private static final long serialVersionUID = 1L;
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow;
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集
private List<T> list;
//前一页
private int prePage;
//下一页
private int nextPage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
//导航条上的第一页
private int navigateFirstPage;
//导航条上的最后一页
private int navigateLastPage;