MyBatis-Plus实现分页查询两种方案详解

 更新时间:2026年04月17日 08:58:32   作者:暗暗别做白日梦  
这篇文章主要为大家详细介绍了两种MyBatis-Plus分页实现方案,分别是PageUtils工具类分页和MyBatis-Plus原生IPage分页,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

方案一:PageUtils 工具类 分页(ThreadLocal 封装版)

1. 方案概述

PageUtils.startPage() 是项目统一封装的分页工具类,基于 MyBatis-Plus 分页插件实现,通过 ThreadLocal 存储分页参数,对业务代码无侵入,是传统项目 / 老项目最常用的分页方式。

2. 核心原理

  1. 调用 startPage() 后,工具类自动获取前端传递的页码、每页条数
  2. MyBatis-Plus 分页插件拦截 SQL,自动拼接 LIMIT 分页语法;
  3. 执行查询返回 List 集合,工具类自动封装成分页结果集。

3. 适用场景

  • 项目已统一封装分页工具类
  • 不希望修改 Mapper/Service 层原有代码
  • 快速实现分页,低成本改造

4. 完整代码示例

4.1 Controller 层

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;

/**
 * 案件维度管理 Controller
 */
@RestController
@RequestMapping("/justice/case/dimension")
public class JusticeCaseDimensionController {

    @Resource
    private CaseDimensionContext caseDimensionContext;

    /**
     * 按范围查询案件聚合维度(账龄+批次号/被告)
     * 方案一:PageUtils 工具类分页
     */
    @GetMapping("/selectCaseDimensionByScope")
    public R<JusticeCaseDimension> selectCaseDimensionByScope(JusticeCaseDimensionQuery caseDimensionQuery) {
        // 1. 开启分页(核心:自动接收前端 page/pageSize 参数)
        PageUtils.startPage();
        
        // 2. 执行业务查询,返回普通 List 集合
        List<JusticeCaseDimension> justiceCaseDimensions = caseDimensionContext.selectCaseDimensionByScope(caseDimensionQuery);
        
        // 3. 工具类封装 List 为分页结果返回
        return R.page(justiceCaseDimensions);
    }
}

4.2 Service/Mapper 层

无需任何分页相关代码,正常返回 List 即可。

二、方案二:MyBatis-Plus 原生 IPage 分页(官方推荐)

1. 方案概述

IPage/Page 是 MyBatis-Plus 官方原生提供的分页对象,直接通过方法入参 / 返回值实现分页,代码更简洁、规范,是新项目首选方案。

2. 核心原理

  1. 前端传递分页参数(page、pageSize),SpringMVC 自动封装为 Page 对象;
  2. Page 对象传入查询方法,MyBatis-Plus 自动完成分页查询;
  3. 直接返回 IPage 对象,自带总条数、总页数、当前页数据等完整分页信息。

3. 适用场景

  • 新项目开发、遵循官方规范
  • 需要清晰的分页参数传递
  • 简化代码结构,降低维护成本

4. 完整代码示例

4.1 Controller 层(业务接口)

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

/**
 * 案件维度管理 Controller
 */
@RestController
@RequestMapping("/justice/case/dimension")
public class JusticeCaseDimensionController {

    @Resource
    private CaseDimensionContext caseDimensionContext;

    /**
     * 按范围查询案件聚合维度(账龄+批次号/被告)
     * 方案二:原生 IPage 分页(官方推荐)
     */
    @GetMapping("/selectCaseDimensionByScope")
    public R<IPage<JusticeCaseDimension>> selectCaseDimensionByScope(
            // 分页参数:自动接收 page、pageSize
            Page<JusticeCaseDimension> page,
            JusticeCaseDimensionQuery caseDimensionQuery
    ) {
        // 1. 直接传入 Page 对象,返回 IPage 分页结果
        IPage<JusticeCaseDimension> pageResult = caseDimensionContext.selectCaseDimensionByScope(page, caseDimensionQuery);
        
        // 2. 直接返回原生分页对象
        return R.ok(pageResult);
    }
}

4.2 Service 层

/**
 * Service 层方法
 */
public IPage<JusticeCaseDimension> selectCaseDimensionByScope(Page<JusticeCaseDimension> page, JusticeCaseDimensionQuery query) {
    // 调用 Mapper,直接返回 IPage
    return baseMapper.selectCaseDimensionByScope(page, query);
}

4.3 Mapper 层

/**
 * Mapper 层方法
 */
IPage<JusticeCaseDimension> selectCaseDimensionByScope(Page<JusticeCaseDimension> page, @Param("query") JusticeCaseDimensionQuery query);

三、两种分页方案核心对比

对比维度PageUtils 工具类分页原生 IPage 分页
官方推荐度非官方,项目自定义封装✅ MyBatis-Plus 官方标准
代码侵入性无侵入,无需修改原有接口轻度侵入,需传入 Page 对象
代码简洁度需手动开启分页 + 封装结果一步到位,代码极简
分页信息工具类自动封装自带完整分页信息(总条数 / 总页数)
适用项目老项目、存量系统改造新项目、标准化开发
学习成本低(直接调用工具方法)低(原生对象,无额外学习)

四、最佳实践建议

  1. 新项目优先使用 原生 IPage 分页:符合官方规范,代码更易维护,团队协作成本更低;
  2. 老项目保留 PageUtils 分页:无需大规模改造代码,兼容现有业务逻辑;
  3. 统一项目规范:一个项目中只使用一种分页方案,避免代码风格混乱。

到此这篇关于MyBatis-Plus实现分页查询两种方案详解的文章就介绍到这了,更多相关MyBatis-Plus分页查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程Condition接口原理介绍

    Java多线程Condition接口原理介绍

    这篇文章主要介绍了Java多线程Condition接口原理介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java ArrayUtils数组工具类使用详解

    Java ArrayUtils数组工具类使用详解

    这篇文章主要介绍了Java ArrayUtils数组工具类使用,‌ArrayUtils‌是Apache Commons Lang库中的一个工具类,主要用于处理数组的各种操作,它提供了许多实用的方法,包括数组的创建、修改、查询等操作,极大地简化了数组处理的复杂度,需要的朋友可以参考下
    2025-05-05
  • java线程的基础实例解析

    java线程的基础实例解析

    java中线程的基本方法的熟练使用是精通多线程编程的必经之路,线程相关的基本方法有wait,notify,notifyAll,sleep,join,yield等,本文浅要的介绍一下它们的使用方式
    2021-06-06
  • java中驼峰与下划线的写法互转

    java中驼峰与下划线的写法互转

    这篇文章主要介绍了java中驼峰与下横线的写法互转方法,文中先是进行了简单的介绍,之后跟大家分享了一个自己编写的工具类的示例代码,有需要的朋友可以参考借鉴,下面来一起学习学习吧。
    2017-01-01
  • Java入门基础之Java的基本语法与Java所支持的数据类型

    Java入门基础之Java的基本语法与Java所支持的数据类型

    这篇文章主要介绍了Java入门基础之Java的基本语法与Java所支持的数据类型,熟悉语法和数据类型通常是了解一种编程语言的开始,需要的朋友可以参考下
    2016-02-02
  • Spring Cloud OAuth2 实现用户认证及单点登录的示例代码

    Spring Cloud OAuth2 实现用户认证及单点登录的示例代码

    这篇文章主要介绍了Spring Cloud OAuth2 实现用户认证及单点登录的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • MyBatis中#{}和${}的区别详解

    MyBatis中#{}和${}的区别详解

    mybatis和ibatis总体来讲都差不多的。下面小编给大家探讨下mybatis中#{}和${}的区别,感兴趣的朋友一起学习吧
    2016-08-08
  • Java8中Stream的使用方式

    Java8中Stream的使用方式

    这篇文章主要介绍了Java8中Stream的使用方式,文章通过Stream的创建展开详细的介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-04-04
  • java启动jar包引入外部配置文件方式

    java启动jar包引入外部配置文件方式

    文章介绍了在运行Java应用程序时,如何使用外部的application-test.yml配置文件,而不是JAR包内部的同名文件,通过使用-D命令设置系统属性或指定配置文件路径,可以解决这个问题,需要注意的是,如果引入的配置文件包含spring.profile属性
    2025-11-11
  • Java移动文件夹及其所有子文件与子文件夹

    Java移动文件夹及其所有子文件与子文件夹

    这篇文章主要为大家详细介绍了Java移动文件夹及其所有子文件与子文件夹的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论