Mybatis分页插件PageHelper的使用

本文介绍了Mybatis分页插件PageHelper的使用,包括PageHelper项目地址、分页的关键要素、Mybatis自带的RowBounds分页实现的缺点,以及PageHelper的四种使用方式。PageHelper简化了分页操作,无需关注分页逻辑,提高了开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值