当前位置: 首页 > news >正文

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

一、方案一: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. 统一项目规范:一个项目中只使用一种分页方案,避免代码风格混乱。
http://www.cnnetsun.cn/news/1922178.html

相关文章:

  • 手把手教你用STM32CubeMX配置PWM,轻松玩转L298N和L9110S电机调速
  • 如何3步掌握FunClip:开源AI视频智能剪辑工具终极指南
  • 如何利用开源工具实现网盘下载速度突破:高效解决方案指南
  • Visual C++运行库终极指南:一键解决DLL缺失问题的完整方案
  • APM飞控实战:从零搭建一台稳定四旋翼
  • 用STAR数据集搞定卫星图像分析:从对象检测到场景关系推理的完整实战指南
  • 在LVGL上实现一个可交互的音频均衡器:手把手教你用贝塞尔曲线绘制平滑EQ曲线
  • 数字化车间无线联网解决方案
  • 告别电脑噪音烦恼:5分钟掌握Windows风扇智能控制神器FanControl
  • 终极指南:如何用MAA实现明日方舟全自动日常管理
  • Windows风扇控制神器:用FanControl打造你的专属静音散热系统
  • 如何在Mac与Windows间架起高效通信桥梁:飞秋Mac版完全指南
  • 3步搞定全网资源下载:告别繁琐操作,用res-downloader轻松获取无水印内容
  • 网络工程师避坑指南:H3C HCL_v3.0.1.1+WSL2共存配置全流程
  • 告别手动!用C# .NET给AutoCAD写个批量打印PDF的脚本(附完整代码)
  • 终极桌面革命:用Rainmeter打造你的Windows数字画布
  • 告别天价API!手把手教你用阿里开源Wan2.1-T2V-1.3B模型,打造个人免费文生视频工具
  • 给Xilinx K7 FPGA做远程固件升级,我是如何用Multiboot实现‘双保险’的?
  • 手把手教你使用env()和constant()解决微信小程序底部安全区域问题
  • SenseVoice-Small ONNX部署教程:ARM架构设备(树莓派/国产芯片)适配实录
  • 软件估算中的敏捷估算方法实践指南
  • Ubuntu 22.04 下构建SageMath加密计算环境:从Conda配置到实战应用
  • FMEA深入详解
  • 自选股进阶筛选函数指南-3:板块与逻辑判断
  • Ubuntu22.04切换lightdm后常见问题及解决方案汇总
  • WRF模式后处理避坑指南:为什么你的兰伯特投影转等经纬度后地图变形了?
  • FAST-LIVO2点云去畸变实战:如何用IMU反向传播搞定运动补偿(含PCL代码避坑点)
  • 【解析】无线定位技术:从RSSI到TDOA的实战应用对比
  • 终极鼠标优化指南:5分钟让普通鼠标在macOS上超越苹果触控板
  • 告别人工验布:YOLO26实现布料缺陷自动化检测(项目源码+数据集+模型权重+UI界面+python+深度学习+远程环境部署)