MyBatis 分页插件 PageHelper的不同使用方式

 更新时间:2026年05月15日 09:32:00   作者:西凉的悲伤  
文章介绍了MyBatis分页插件PageHelper的使用方法,并提供了多种使用方式的示例,需要注意的是,插件只能为紧跟在startPage方法后的第一个mybatis查询方法进行分页,且不支持带有forupdate语句的查询,感兴趣的朋友跟随小编一起看看吧

前言

PageHelper 是 针对 MyBatis 的一款分页插件,它支持常见 Oracle、MySql、MariaDB、SQLite、DB2、PostgreSQL、SqlServer 等 12 种数据库分页,它支持常见的RowBounds(PageRowBounds)、PageHelper.startPage 方法调用、Mapper 接口参数调用等多种分页方式。

官网

github

一、依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>6.1.1</version>
    <scope>compile</scope>
</dependency>

二、分页插件的不同使用方式

官网使用说明

第一种(推荐)

//Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);

注意:只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select)方法会被分页。

第二种

List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));

第三种

PageHelper.offsetPage(0, 10);
List<User> list = userMapper.selectIf(1);

第四种(参数方法调用)

//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
    List<User> selectByPageNumSize(
            @Param("user") User user,
            @Param("pageNum") int pageNum,
            @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<User> list = userMapper.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<User> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);

三、重要提示

1.只有紧跟在PageHelper.startPage方法后的第一个Mybatis的查询(Select)方法会被分页。

2.不要配置多个分页插件
不要在系统中配置多个分页插件(使用Spring时,mybatis-config.xml和Spring配置方式,请选择其中一种,不要同时配置多个分页插件)!

3.分页插件不支持带有for update语句的分页
对于带有for update的sql,会抛出运行时异常,对于这样的sql建议手动分页,毕竟这样的sql需要重视。

4.分页插件不支持嵌套结果映射
由于嵌套结果方式会导致结果集被折叠,因此分页查询的结果在折叠后总数会减少,所以无法保证分页结果数量正确。

四、示例

示例一

Controller 层接口:

    @PostMapping("/queryList")
    public ResponseEntity<PageInfo<ReconcileOrderDto>> queryList(@RequestBody ReconcileOrderRequest request) {
        List<ReconcileOrderDto> orderList = operateReconcileService.queryList(request);
        PageInfo<ReconcileOrderDto> pageInfo = new PageInfo<>(orderList);
        return ResponseEntity.ok().body(pageInfo);
    }

service 方法:

	public List<ReconcileOrderDto> queryList(ReconcileOrderRequest request) {
        ReconcileOrderPageDto orderPageDto = buildReconcileOrderPageDto(request);
        //分页查询
        PageHelper.startPage(request.getPage(), request.getPageSize());
        List<ReconcileOrderDto> pageReconcile = operateOrderMapper.selectOrderByReconcileTime(orderPageDto);
        return pageReconcile;
    }

示例二

上面使用了 PageInfo ,除了使用 PageHelper 自带的 PageInfo 分页类,也可以自己定义分页类。

import com.github.pagehelper.Page;
import lombok.ToString;
import java.util.List;
@ToString
public class MyPageInfo<T>{
    /**
     * 总条数
     */
    private int total;
    /**
     * 条数
     */
    private int size;
    /**
     * 每页条数
     */
    private int pageSize;
    /**
     * 当前页码
     */
    private int pageNum;
    /**
     * 分页数据
     */
    private List<T> list;
    public MyPageInfo(String code, String message, int size, int pageSize, int pageNum, int total, List<T> data) {
        super(code, message);
        this.size = size;
        this.pageSize = pageSize;
        this.pageNum = pageNum;
        this.list = data;
        this.total = total;
    }
    public MyPageInfo(String code, String message, List<T> data) {
        super(code, message);
        this.list = data;
    }
    public MyPageInfo(List<T> data) {
        this.list = data;
        if (data instanceof Page) {
            Page<T> page = (Page<T>) data;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();
            this.size = page.size();
            this.total = (int) page.getTotal();
        } else if (data != null) {
            this.pageNum = 1;
            this.pageSize = data.size();
            this.size = data.size();
            this.total = data.size();
        }
    }
    public int getSize() {
        return size;
    }
    public void setSize(int size) {
        this.size = size;
    }
    public int getPageSize() {
        return pageSize;
    }
    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }
    public int getPageNum() {
        return pageNum;
    }
    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }
    public Object getList() {
        return list;
    }
    public void setList(List<T> data) {
        this.list = data;
    }
    public int getTotal() {
        return total;
    }
    public void setTotal(int total) {
        this.total = total;
    }
}

上面的 自定义分页类 MyPageInfo 含有 total、size等方法,你还可以增加其他字段,比如 sucess来标识请求是否成功、errorMessage 错误消息等。

使用 MyPageInfo 后,示例一的 代码可以修改为:

    @PostMapping("/queryList")
    public ResponseEntity<MyPageInfo<ReconcileOrderDto>> queryList(@RequestBody ReconcileOrderRequest request) {
        List<ReconcileOrderDto> orderList = operateReconcileService.queryList(request);
        MyPageInfo<ReconcileOrderDto> myPageInfo = new MyPageInfo<>(orderList);
        return ResponseEntity.ok().body(myPageInfo );
    }

到此这篇关于MyBatis 分页插件 PageHelper的不同使用方式的文章就介绍到这了,更多相关MyBatis 分页插件 PageHelper内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 2 统一异常处理过程解析

    SpringBoot 2 统一异常处理过程解析

    这篇文章主要介绍了SpringBoot 2 统一异常处理过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Java实现计算器的代码

    Java实现计算器的代码

    这篇文章主要为大家介绍了Java实现计算器的详细代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • Java线程中断的本质深入理解

    Java线程中断的本质深入理解

    Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,本文将详细介绍,需要了解的朋友可以参考下
    2012-12-12
  • SpringCloudAlibaba整合服务网关GateWay教程

    SpringCloudAlibaba整合服务网关GateWay教程

    文章介绍了Spring Cloud Gateway和Zuul的区别,并详细描述了如何使用Gateway进行服务转发和自定义TokenFilter实现参数拦截访问
    2026-01-01
  • MyBatis中SqlSession实现增删改查案例

    MyBatis中SqlSession实现增删改查案例

    这篇文章主要介绍了MyBatis中SqlSession实现增删改查案例,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-03-03
  • Java如何实现CIDR转IP段

    Java如何实现CIDR转IP段

    CIDR是一种用于高效分配和管理 IP 地址的网络编址方法,这篇文章主要为大家详细介绍了如何使用Java实现CIDR转IP段,感兴趣的小伙伴可以参考一下
    2025-03-03
  • mybatis解决<foreach>标签不能超过1000的问题

    mybatis解决<foreach>标签不能超过1000的问题

    MyBatis是一个开源的持久层框架,它可以帮助开发者简化数据库操作的编写,而foreach是MyBatis中的一个重要标签,用于在SQL语句中进行循环操作,本文主要给大家介绍了mybatis解决<foreach>标签不能超过1000的问题,需要的朋友可以参考下
    2024-05-05
  • java图片和文本同时提交到表单的实例代码

    java图片和文本同时提交到表单的实例代码

    在本篇文章里小编给大家整理的是关于java实现图片和文本同时提交到表单的相关内容,有需要的朋友们可以学习下。
    2020-02-02
  • Java线程阻塞和唤醒的几种方式详解

    Java线程阻塞和唤醒的几种方式详解

    这篇文章主要介绍了Java线程阻塞和唤醒的几种方式详解,线程阻塞是指当一个线程无法继续执行时,它会进入阻塞状态,直到某个条件满足后才能继续执行,线程阻塞可以通过多种方式实现,如等待锁、等待IO操作、等待其他线程的完成等,需要的朋友可以参考下
    2023-10-10
  • Spring EL表示式的运用@Value说明

    Spring EL表示式的运用@Value说明

    这篇文章主要介绍了Spring EL表示式的运用@Value说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04

最新评论