
PageHelper是国人开源的一款MyBatis扩展插件,可以帮助完成自动分页功能。PageHelper自动分页插件使用非常简单,如果持久层框架用的是MyBatis,建议使用该分页插件。
引入分页插件
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.11</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</dependency>
分页插件参数介绍
下面几个参数都是针对默认 dialect 情况下的参数。使用自定义 dialect 实现时,下面的参数没有任何作用。
-
helperDialect:分页插件会自动检测当前数据库url链接,判断数据库类型自动选择合适的分页方式。也可以配置helperDialect属性来指定分页插件使用哪种数据库方言(mysql、oracle、sqlite、db2、sqlserver等)。
-
reasoonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询,即pageNum=-1时,就会查询-1页,这样就会导致出错。(强烈建议设置该属性为true)
-
更多参数请参照官网
在mybatis-config.xml中配置拦截器插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--设置数据库类型-->
<property name="pageDialect" value="mysql"/>
<!--设置分页合理化-->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
在代码中使用
<select id="selectPage" resultType="User">
select * from t_user where age < 45
</select>
@Test
public void testPageHelper(){
SqlSession sqlSession = null;
try{
sqlSession = MyBatisUtils.openSession();
/* 开启自动分页,startPage()方法会自动将下一次查询进行分页 */
PageHelper.startPage(pageNum, pageSize); //pageNum是页码,pageSize是页宽
//获取分页对象
List<User> userList = (Page) sqlSession.selectList("selectPage");
//得到分页结果对象,分页信息都保存在pageInfo中
PageInfo<User> page = new PageInfo<>(userList);
System.out.println("总页数:" + page.getPages());
System.out.println("总记录数:" + page.getTotal());
System.out.println("开始行号:" + page.getstartRow());
System.out.println("结束行号:" + page.getEndRow());
System.out.println("当前页码:" + page.getPageNum());
List<User> data = page.getResult(); //当前页的数据
for(User u : data){
System.out.println(u.getUserName());
}
}catch (Exception e){
throw e;
}finally {
MyBatisUtils.closeSession(sqlSession);
}
}
总结:
想要实现分页需要做哪些事:
-
当前页数据查询:select * from tab limit 0, 10
-
总记录数查询:select count(*) from tab
-
通过程序计算总页数,上一页页码,下一页页码
当在使用了PageHelper分页插件后,这些事都不需要我们来做了,PageHelper会自动帮我们来完成。并且还扩充了更多的功能。