MyBatis-Plus 分页查询两种实现方案
一、方案一PageUtils 工具类分页ThreadLocal 封装版1. 方案概述PageUtils.startPage()是项目统一封装的分页工具类基于 MyBatis-Plus 分页插件实现通过 ThreadLocal 存储分页参数对业务代码无侵入是传统项目 / 老项目最常用的分页方式。2. 核心原理调用startPage()后工具类自动获取前端传递的页码、每页条数MyBatis-Plus 分页插件拦截 SQL自动拼接LIMIT分页语法执行查询返回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 RJusticeCaseDimension selectCaseDimensionByScope(JusticeCaseDimensionQuery caseDimensionQuery) { // 1. 开启分页核心自动接收前端 page/pageSize 参数 PageUtils.startPage(); // 2. 执行业务查询返回普通 List 集合 ListJusticeCaseDimension justiceCaseDimensions caseDimensionContext.selectCaseDimensionByScope(caseDimensionQuery); // 3. 工具类封装 List 为分页结果返回 return R.page(justiceCaseDimensions); } }4.2 Service/Mapper 层无需任何分页相关代码正常返回List即可。二、方案二MyBatis-Plus 原生 IPage 分页官方推荐1. 方案概述IPage/Page是 MyBatis-Plus官方原生提供的分页对象直接通过方法入参 / 返回值实现分页代码更简洁、规范是新项目首选方案。2. 核心原理前端传递分页参数page、pageSizeSpringMVC 自动封装为Page对象将Page对象传入查询方法MyBatis-Plus 自动完成分页查询直接返回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 RIPageJusticeCaseDimension selectCaseDimensionByScope( // 分页参数自动接收 page、pageSize PageJusticeCaseDimension page, JusticeCaseDimensionQuery caseDimensionQuery ) { // 1. 直接传入 Page 对象返回 IPage 分页结果 IPageJusticeCaseDimension pageResult caseDimensionContext.selectCaseDimensionByScope(page, caseDimensionQuery); // 2. 直接返回原生分页对象 return R.ok(pageResult); } }4.2 Service 层/** * Service 层方法 */ public IPageJusticeCaseDimension selectCaseDimensionByScope(PageJusticeCaseDimension page, JusticeCaseDimensionQuery query) { // 调用 Mapper直接返回 IPage return baseMapper.selectCaseDimensionByScope(page, query); }4.3 Mapper 层/** * Mapper 层方法 */ IPageJusticeCaseDimension selectCaseDimensionByScope(PageJusticeCaseDimension page, Param(query) JusticeCaseDimensionQuery query);三、两种分页方案核心对比对比维度PageUtils 工具类分页原生 IPage 分页官方推荐度非官方项目自定义封装✅ MyBatis-Plus 官方标准代码侵入性无侵入无需修改原有接口轻度侵入需传入 Page 对象代码简洁度需手动开启分页 封装结果一步到位代码极简分页信息工具类自动封装自带完整分页信息总条数 / 总页数适用项目老项目、存量系统改造新项目、标准化开发学习成本低直接调用工具方法低原生对象无额外学习四、最佳实践建议新项目优先使用 原生 IPage 分页符合官方规范代码更易维护团队协作成本更低老项目保留 PageUtils 分页无需大规模改造代码兼容现有业务逻辑统一项目规范一个项目中只使用一种分页方案避免代码风格混乱。