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 在idea中实现热部署的方法

    springboot 在idea中实现热部署的方法

    这篇文章主要介绍了springboot 在idea中实现热部署的方法,实现了热部署,在每一次作了修改之后,都会自动的重启,非常节约时间,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • SpringBoot @Autowired注入为空的情况解读

    SpringBoot @Autowired注入为空的情况解读

    这篇文章主要介绍了SpringBoot @Autowired注入为空的情况解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 快速定位Java 内存OOM的问题

    快速定位Java 内存OOM的问题

    这篇文章主要介绍了快速定位Java 内存OOM的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • IDEA修改idea.vmoptions后,IDEA无法打开的解决方案

    IDEA修改idea.vmoptions后,IDEA无法打开的解决方案

    文章介绍了在IDEA中因错误修改启动参数导致无法启动的问题,指出正确的修改文件位置应在破解插件目录下的idea.vmoptions,并分享了个人经验供参考
    2025-10-10
  • 如何用Java Stream写出既高雅又装*的代码

    如何用Java Stream写出既高雅又装*的代码

    如何让同事看不懂你写的代码,然后觉得你非常牛逼,这里用到了stream()与Lambda,需要有点基础,没基础你炫个&#128296;优雅永不过时~ 看下面文章时记得穿燕尾服,拿高脚杯
    2021-08-08
  • Java项目--家庭收支记录程序

    Java项目--家庭收支记录程序

    本文主要介绍Java基础阶段的一个小项目——家庭收支记录程序(附完整源代码),本项目所用到的主要知识点:基本语法、数组和方法。本项目并不难,主要是对Java初学者的基础综合运用的训练及检验
    2021-07-07
  • 深入详解SpringBoot配置diff的实战方法

    深入详解SpringBoot配置diff的实战方法

    在日常的开发与运维工作中,配置管理是一项至关重要的任务,简单来说,Spring Boot 配置 diff 就是对比 Spring Boot 应用中不同配置版本之间的差异,下面小编就和大家详细介绍一下Spring Boot 配置 diff 的实战方法吧
    2026-04-04
  • MyBatis注解开发之实现自定义映射关系和关联查询

    MyBatis注解开发之实现自定义映射关系和关联查询

    本文主要详细介绍了MyBatis注解开发中,实现自定义映射关系和关联查询,文中有详细的代码示例,对学习MyBatis有一定的参考价值,需要的朋友可以参考阅读
    2023-04-04
  • Java实现向Word文档添加文档属性

    Java实现向Word文档添加文档属性

    这篇文章主要介绍了Java实现向Word文档添加文档属性的相关资料,需要的朋友可以参考下
    2023-01-01
  • java中读写Properties属性文件公用方法详解

    java中读写Properties属性文件公用方法详解

    在项目开发中我们会将很多环境特定的变量定义到一个配置文件中,比如properties文件,把数据库的用户名和密码存放到此属性文件中。下面这篇文章就主要介绍了java中读写Properties属性文件公用方法,需要的朋友可以参考借鉴。
    2017-01-01

最新评论