PageHelper是针对mybatis开发的一款开源插件,可以很方便进行分页查询,且支持大部分主流数据库。
引入分页插件引入分页插件有下面2种方式,推荐使用 Maven 方式。
1). 引入 Jar 包
由于使用了sql 解析工具,需要下载 jsqlparser.jar:http://repo1.maven.org/maven2/com/github/jsqlparser/jsqlparser/0.9.5/
你可以从下面的地址中下载最新版本的 jar 包
https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/
http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
2). 使用 Maven
在 pom.xml 中添加如下依赖:<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.2.1</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>0.9.5</version>
</dependency>
2. 配置拦截器插件
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor。 com.github.pagehelper.PageHelper 现在是一个特殊的 dialect 实现类,是分页插件的默认实现类,提供了和以前相同的用法。
1. 在 MyBatis 配置 xml 中配置拦截器插件
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 定义数据库的方言 -->
<property name="dialect" value="mysql" />
<!--设置自动去查询总数 -->
<property name="rowBoundsWithCount" value="true" />
</plugin>
</plugins>
分页插件支持以下几种调用方式:
//第一种,RowBounds方式的调用
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<Country> selectByPageNumSize(
@Param("user") User user,
@Param("pageNum") int pageNum,
@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);
//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
//其他fields
//下面两个参数名和 params 配置的名字一致
private Integer pageNum;
private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<Country> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<Country> list = countryMapper.selectByPageNumSize(user);
//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectGroupBy();
}
});
//jdk8 lambda用法
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy());
//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectGroupBy();
}
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());
//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectLike(country);
}
});
//lambda
total = PageHelper.count(()->countryMapper.selectLike(country));
下面只介绍PageHelper.startPage 静态方法调用
其余方法参考:
https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
首先我们在UserMapper.xml中添加
<select id="queryUserAll" resultType="com.lcx.mybatis.pojo.User">
select * from t_user
</select>
然后去UserMapper.java添加方法
/**
* 返回User集合
* @param id
* @return
*/
public List<User> queryUserAll();
编写测试类运行
@Test
public void testQueryUserAll() {
//获取第1页,3条内容,默认查询总数count
PageHelper.startPage(1, 3);
//紧跟着的第一个select方法会被分页
List<User> queryUserAll = userMapper.queryUserAll();
for (User user : queryUserAll) {
System.out.println(user);
}
//获取第2页,3条内容,默认查询总数count
PageHelper.startPage(2, 3);
//紧跟着的第一个select方法会被分页
List<User> queryUserAll2 = userMapper.queryUserAll();
for (User user : queryUserAll2) {
System.out.println(user);
}
}
可以看到控制台第一次打印出了三条,第二次又打印出了三条,实现了分页的效果。
但是有一个问题,为什么第一次分页执行了select count(0) from t_user 而第二次没有呢?相信看过我前面文章的童鞋会明白的。