SpringBoot整合Mybatis-Plus实现高效分页查询实战
1. 项目概述在Web应用开发中分页查询是最基础也最常用的功能之一。最近接手一个后台管理系统项目时我发现很多新人对SpringBoot整合Mybatis-Plus实现分页存在不少困惑。本文将分享我在电商平台开发中总结的分页实现方案从配置到实战完整走一遍流程。这个方案的特点是零XML配置完全注解驱动支持前端多种分页参数格式自动处理count查询优化整合Swagger文档展示2. 环境准备与基础配置2.1 依赖引入首先在pom.xml中添加必要依赖以SpringBoot 2.7.x为例dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.2/version /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-extension/artifactId version3.5.2/version /dependency注意避免同时引入mybatis和mybatis-plus的starter可能引起冲突2.2 分页插件配置在SpringBoot启动类或配置类中添加Configuration public class MybatisPlusConfig { Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor new MybatisPlusInterceptor(); // 分页插件 interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }这里有几个关键点DbType需根据实际数据库类型设置可以配置maxLimit防止全表查询支持多租户等其它插件组合使用3. 核心实现方案3.1 基础分页查询假设有用户表user对应的Mapper接口public interface UserMapper extends BaseMapperUser { // 无需额外方法 }Service层实现Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { public PageUser pageList(int current, int size) { PageUser page new Page(current, size); return baseMapper.selectPage(page, null); } }Controller示例GetMapping(/users) public RPageUser getUsers( RequestParam(defaultValue 1) int current, RequestParam(defaultValue 10) int size) { return R.success(userService.pageList(current, size)); }3.2 带条件的分页查询实际项目更多需要组合查询条件public PageUser pageQuery(UserQuery query) { LambdaQueryWrapperUser wrapper new LambdaQueryWrapper(); wrapper.eq(StringUtils.isNotBlank(query.getName()), User::getName, query.getName()) .ge(query.getStartTime() ! null, User::getCreateTime, query.getStartTime()); return baseMapper.selectPage(new Page(query.getCurrent(), query.getSize()), wrapper); }3.3 自定义分页SQL对于复杂SQL可以在Mapper中定义Select(SELECT * FROM user ${ew.customSqlSegment}) PageUser customPage(PageUser page, Param(Constants.WRAPPER) WrapperUser wrapper);4. 高级功能实现4.1 分页参数自动转换创建PageParam类统一接收参数Data public class PageParam { ApiModelProperty(value 页码, example 1) private long current 1; ApiModelProperty(value 每页数量, example 10) private long size 10; ApiModelProperty(排序字段) private String orderBy; ApiModelProperty(是否升序) private Boolean isAsc; public T PageT buildPage() { PageT page new Page(current, size); if (StringUtils.isNotBlank(orderBy)) { if (Boolean.TRUE.equals(isAsc)) { page.addOrder(OrderItem.asc(orderBy)); } else { page.addOrder(OrderItem.desc(orderBy)); } } return page; } }4.2 分页结果统一包装建议统一返回格式Data public class PageResultT implements Serializable { private long current; private long size; private long total; private ListT records; public static T PageResultT success(PageT page) { PageResultT result new PageResult(); result.setCurrent(page.getCurrent()); result.setSize(page.getSize()); result.setTotal(page.getTotal()); result.setRecords(page.getRecords()); return result; } }5. 性能优化技巧5.1 Count查询优化大数据量表count操作很耗性能可以通过以下方式优化使用缓存count结果不查询count设置page.setSearchCount(false)覆盖默认的countSqlSelect(SELECT COUNT(1) FROM user ${ew.customSqlSegment}) Long selectCountCustom(Param(Constants.WRAPPER) WrapperUser wrapper);5.2 多表联查分页推荐两种方案先分页主表ID再联查明细使用子查询分页SELECT * FROM order o WHERE o.id IN ( SELECT id FROM order WHERE user_id #{userId} LIMIT #{offset}, #{size} )6. 常见问题排查6.1 分页失效问题可能原因未配置分页插件方法参数没有Page对象自定义SQL未保留${ew.customSqlSegment}6.2 排序不生效检查点字段名是否正确数据库字段名是否被后续wrapper条件覆盖PageParam中的orderBy是否传递到Page对象6.3 性能问题优化方向检查是否走了正确的索引大数据量考虑游标分页合理设置pageSize建议不超过10007. 最佳实践建议统一分页参数接收格式限制最大pageSize可在拦截器配置重要查询添加分页审计日志前端配合实现优雅的滚动加载导出功能单独处理不分页实际项目中我们还会结合Redis缓存热点数据的分页结果对订单历史等查询采用时间分区等方式优化。Mybatis-Plus的分页功能虽然简单但用好需要结合具体业务场景做适当调整。

相关新闻

iMetaOmics:叶绿体基因组自动化分析流程解析

iMetaOmics:叶绿体基因组自动化分析流程解析

1. 项目背景与核心价值叶绿体基因组分析在植物系统发育、物种鉴定和功能基因研究中具有不可替代的作用。传统分析方法通常需要研究人员手动执行多个独立软件工具,不仅效率低下,还容易引入人为错误。天津中医药大学田晓轩课题组开发的iMetaOmics自动化流程…

2026/7/28 22:21:13阅读更多 →
汽车电子ASIC评估模块(EVM)硬件拆解与GUI软件实战指南

汽车电子ASIC评估模块(EVM)硬件拆解与GUI软件实战指南

1. 项目概述:为什么我们需要评估模块?在芯片设计,尤其是汽车电子这类高可靠性领域,把一颗全新的ASIC(专用集成电路)直接焊到客户的最终产品板子上进行测试,无异于一场豪赌。赌输了,轻…

2026/7/28 22:19:12阅读更多 →
Rust从入门到精通-trait

Rust从入门到精通-trait

Rust从入门到精通:trait 什么是trait?在Rust中,trait是一种定义共享行为的机制。它类似于其他语言中的接口(interface),但更加强大和灵活。trait允许你定义一组方法,然后让不同的类型实现这些方…

2026/7/28 22:19:12阅读更多 →
TPIC7710 EVM评估板实战指南:从硬件解析到GUI软件调试

TPIC7710 EVM评估板实战指南:从硬件解析到GUI软件调试

1. 项目概述:从评估板到系统级验证的桥梁在汽车电子和工业控制领域,当我们拿到一颗全新的、功能复杂的专用集成电路(ASIC)时,最头疼的问题往往不是芯片本身,而是如何快速、准确、低成本地验证它的功能&…

2026/7/28 23:31:39阅读更多 →
从入门到精通:User-Community Airflow Helm Chart的数据库配置全攻略

从入门到精通:User-Community Airflow Helm Chart的数据库配置全攻略

从入门到精通:User-Community Airflow Helm Chart的数据库配置全攻略 【免费下载链接】charts The User-Community Airflow Helm Chart is the standard way to deploy Apache Airflow on Kubernetes with Helm. Originally created in 2017, it has since helped t…

2026/7/28 23:31:39阅读更多 →
5分钟上手Lawnchair:从AOSP Launcher3到个性化桌面的无缝过渡

5分钟上手Lawnchair:从AOSP Launcher3到个性化桌面的无缝过渡

5分钟上手Lawnchair:从AOSP Launcher3到个性化桌面的无缝过渡 【免费下载链接】Launcher3 This is fork from Launcher3 in AOSP. 项目地址: https://gitcode.com/gh_mirrors/laun/Launcher3 Lawnchair是一款基于AOSP Launcher3开发的开源桌面启动器&#xf…

2026/7/28 23:31:39阅读更多 →
从零开始的博客搭建:使用Simply主题构建个人品牌的完整教程

从零开始的博客搭建:使用Simply主题构建个人品牌的完整教程

从零开始的博客搭建:使用Simply主题构建个人品牌的完整教程 【免费下载链接】simply Theme for Ghost inspired on Medium 项目地址: https://gitcode.com/gh_mirrors/si/simply Simply主题是一款受Medium启发的Ghost博客主题,它能帮助你快速搭建…

2026/7/28 23:31:39阅读更多 →
RAG技术优化:提升大语言模型知识检索与生成效率

RAG技术优化:提升大语言模型知识检索与生成效率

1. RAG技术体系概述:检索增强生成的核心价值检索增强生成(Retrieval-Augmented Generation,简称RAG)作为当前大语言模型应用的前沿范式,正在彻底改变知识密集型任务的实现方式。我在多个企业级知识管理项目中验证了其价…

2026/7/28 23:31:39阅读更多 →
GenshinCelShaderURP性能优化实践:降低Draw Call与内存占用的5个技巧

GenshinCelShaderURP性能优化实践:降低Draw Call与内存占用的5个技巧

GenshinCelShaderURP性能优化实践:降低Draw Call与内存占用的5个技巧 【免费下载链接】GenshinCelShaderURP 这是一个基于URP的开源仿原神卡通渲染项目 项目地址: https://gitcode.com/gh_mirrors/ge/GenshinCelShaderURP GenshinCelShaderURP是一个基于Uni…

2026/7/28 23:29:37阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →