您的位置:首页 > 其它

Mybatis分页插件PageHelper的使用

2017-10-28 02:23 357 查看

PageHelper项目地址:

oschub的项目地址:http://git.oschina.net/free/Mybatis_PageHelper

github的项目地址:https://github.com/pagehelper/Mybatis-PageHelper

PageHelper的使用例子

https://gitee.com/xuguolong/mybatis-pagehelper-sample

这个大家再熟悉不过的MySQL的分页查询语句

select * from t_user limit 0 , 15


1、简单了解分页的几个关键要素

页码(pageNum): 即表示当前查询第几页的数据

每页大小(pageSize):即每页显示的记录数

总页数 :当前查询满足条件的总页数,总页数 = 总记录数/pageSize

总记录数:当前查询满足条件的总记录条数

2、分页的基本思想

根据pageNum和pageSize计算它的数据偏移量

从当前数据偏移量开始,取出pageSize条记录

3、不使用插件,使用Mybatis自带的RowBounds实现分页

使用Mybatis自带的分页功能(PageBounds)

RowBounds rowBounds = new RowBounds(0 ,10);
List<User> users = userMapper.selectUserListWithRowBounds(null ,rowBounds);
System.out.println(users);
for(User user :users){
System.out.println(user);
}


缺点:

1、内存中分页,即它会先把所有满足条件的数据都查询出来,然后再在内存中筛选分页数据,这个对于大数据量的情况下,是非常致命的。

2、没有统计总记录数、总页数需要自己计算

自己实现分页功能

/**
* 自己实现分页逻辑
*/
@Test
public void page2() {
List<User> users = userMapper.selectUserListForPage(null ,null ,10 ,15);
System.out.println(users);
for(User user :users){
System.out.println(user);
}
}

xml配置:
<!--自己实现分页逻辑 -->
<select id="selectUserListForPage" parameterType="map" resultType="com.xgl.mybatis.study.model.User">
select * from tb_user
<where>
<if test="id !=null">
and id=#{id}
</if>
<if test="name != null ">
and name=#{name}
</if>
</where>

limit #{pageOffset} ,#{pageSize}
</select>


缺点:

1、总记录数、总页数需要自己计算

2、代码不能重复利用

3、需要针对不同的数据库实现不同的分页逻辑,例如Oracle和MySQL的分页逻辑是不同的

4、对原有业务代码有一定的入侵

4、如何使用Mybatis-PageHelper分页插件

使用分页插件,使我们专注与业务逻辑的开发,而不需要关心分页逻辑的实现,甚至,对于dao层来说,完全感觉不到分页的存在。Mybatis-PageHelper是一个非常简单好用的分页插件,因此,这里给大家分享下如何使用。



1、首先导入Mybatis-PageHelper相关依赖jar包

<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>


2、在Mybatis配置文件mybatis-config.xml增加分页插件配置

<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--一些可选的配置参数 -->
</plugin>
</plugins>


3、在代码中使用

前面讲过了,分页基本思想就是通过 页码和页大小来获取分页数据。Mybatis-PageHelper的分页原理就是拦截你的查询方法,然后看看有没有同时存在pageNum和pageSize两个参数,如果有,则进行分页处理,否则不做分页处理。

因此,如果我们需要分页,就应该想办法将pageNum和pageSize传递给Mybatis-PageHelper插件。主要有以下几种方式

分页方式一:使用Mybatis自带的RowBounds类来传递

Mybatis-PageHelper支持使用Mybatis自带的分页类RowBounds来传入分页参数。默认情况下,这种方式不会进行数据统计(即没有总页数和总记录数),如果需要这些返回信息,需要在配置插件使,配置一下属性


配置代码:

<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="offsetAsPageNum" value="true" />
<property name="rowBoundsWithCount" value="true" />
</plugin>
</plugins>

程序编码:
List<User> userList = userMapper.selectUserListWithRowBounds( null ,new RowBounds( 0,10));
for(User user: userList){
System.out.println(user);
}

//如果使用RowBounds方式传递分页参数,那么需要配置rowBoundsWithCount=true才能得到以下返回参数
Page page = (Page) userList;
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:"   + page.getPages());
System.out.println("当前页:"   + page.getPageNum());
System.out.println("每页记录数:" + page.getPageSize());


搭配建议:RowBounds + 配置offsetAsPageNum=true + 配置 rowBoundsWithCount=true

分页方式二:PageHelper的startPage(pageNum ,pageSize)静态方法

int pageNum = 1;
int pageSize = 10;

//获取第一页
PageHelper.startPage(pageNum++ ,pageSize);  //每次都要执行
List<User> userList = userMapper.selectUserList( new User());
for(User user: userList){
System.out.println(user);
}

Page page = (Page) userList;
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:"   + page.getPages());
System.out.println("当前页:"   + page.getPageNum());
System.out.println("每页记录数:" + page.getPageSize());

System.out.println("----------------------------------------------------------");

//获取第二页
PageHelper.startPage(pageNum++,pageSize);  //每次都要执行
userList = userMapper.selectUserList( new User());

for(User user: userList){
System.out.println(user);
}


注意:

只有紧跟着PageHelper.startPage今天方法后的第一个sql才会执行分页

每次分页都要先执行PageHelper.startPage方法

分页方式三:在Mapper接口方法中增加pageNum ,pageSize两个参数

即在Mapper接口方法中定义pageNum ,pageSize两个参数,如果使用此种方式进行分页,则还需要在mybatis-config.xml配置分页插件时,配置 supportMethodsArguments为true

mybatis-config.xml中插件配置:

<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="supportMethodsArguments" value="true" />
</plugin>
</plugins>


Mapper接口方法定义:

List<User> selectUserListForParam(@Param("id") String id ,@Param("name") String name ,
@Param("pageNum") int pageNum , @Param("pageSize") int pageSize);


代码中使用分页

int pageNum = 1;
int pageSize = 10;

//获取第一页
List<User> userList = userMapper.selectUserListForParam( null ,null ,pageNum++ ,pageSize);
for(User user: userList){
System.out.println(user);
}

Page page = (Page) userList;
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:"   + page.getPages());
System.out.println("当前页:"   + page.getPageNum());
System.out.println("每页记录数:" + page.getPageSize());

System.out.println("----------------------------------------------------------");

//获取第二页
userList = userMapper.selectUserListForParam( null ,null ,pageNum++ ,pageSize);

for(User user: userList){
System.out.println(user);
}


分页方式四:通过对象属性(包含pageSize和pageNum属性)

public class User {
private Long id;
private String name;
private Integer age;
private Integer sex;

private int pageNum;
private int pageSize;
}


程序中使用分页

User param = new User();
param.setPageSize(10);
param.setPageNum(1);

//获取第一页
List<User> userList = userMapper.selectUserList(param);
for(User user: userList){
System.out.println(user);
}

Page page = (Page) userList;
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:"   + page.getPages());
System.out.println("当前页:"   + page.getPageNum());
System.out.println("每页记录数:" + page.getPageSize());

System.out.println("----------------------------------------------------------");

//获取第二页
param.setPageNum(2);
userList = userMapper.selectUserList(param);

for(User user: userList){
System.out.println(user);
}


4、获取分页结果

其实,主要在mybatis-config.xml中配置了mybatis-pagehelper分页插件之后,不管是否执行分页,返回结果都是

mybatis-pagehelper封装的Page对象,所有相关的分页信息都保存在该对象中。

//获取第一页
List<User> userList = userMapper.selectUserListForMap(param);
for(User user: userList){
System.out.println(user);
}

Page page = (Page) userList;
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:"   + page.getPages());
System.out.println("当前页:"   + page.getPageNum());
System.out.println("每页记录数:" + page.getPageSize());
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: