MyBatis-Plus分页查询实现与优化实践
1. 分页查询的核心价值与实现思路在业务系统开发中数据分页是最基础却至关重要的功能。我经历过多个从零搭建的企业级项目发现无论管理系统还是移动应用只要涉及数据展示就必然需要分页支持。传统JDBC实现分页需要手动计算limit/offset而MyBatis-Plus的IPage接口让这一切变得异常简单。SpringBoot与MyBatis-Plus的组合堪称Java后端开发的黄金搭档。前者提供自动化配置和依赖管理后者在MyBatis基础上扩展出强大的单表操作能力。当它们相遇时原本需要数十行代码的分页查询现在只需3个关键步骤定义分页参数对象调用Service层分页方法返回统一分页结果格式这种简洁性背后是MyBatis-Plus对物理分页的智能处理。它会根据当前数据库类型MySQL/Oracle等自动生成适配的分页SQL开发者无需再关心不同数据库的语法差异。下面通过完整示例演示如何实现企业级分页方案。2. 环境准备与基础配置2.1 依赖引入关键点在pom.xml中需要明确引入以下核心依赖建议锁定版本号dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3/version /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-extension/artifactId version3.5.3/version /dependency注意mybatis-plus-extension包含分页插件等增强功能必须显式引入。常见错误是只引入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.MYSQL会根据MySQL语法生成分页SQL。实际项目中应根据真实数据库类型配置支持Oracle、PostgreSQL等主流数据库。3. 核心实现步骤详解3.1 定义分页参数接收对象创建统一的分页查询参数DTOData public class PageQuery { ApiModelProperty(当前页码) private Integer pageNum 1; ApiModelProperty(每页数量) private Integer pageSize 10; public T IPageT buildPage() { return new Page(pageNum, pageSize); } }这个对象有两个关键设计点设置默认值避免空指针提供buildPage方法快速创建IPage实例3.2 Service层分页查询实现以用户查询为例展示Service实现Service public class UserServiceImpl extends ServiceImplUserMapper, User implements UserService { Override public PageResultUser queryByPage(PageQuery query) { // 构建分页条件 IPageUser page query.buildPage(); // 执行分页查询 IPageUser result baseMapper.selectPage(page, null); // 转换为统一返回格式 return new PageResult( result.getRecords(), result.getTotal(), result.getCurrent(), result.getSize() ); } }这里使用MyBatis-Plus提供的selectPage方法其第二个参数是Wrapper条件构造器传null表示无附加条件。3.3 统一分页响应结构定义标准化分页返回体Data AllArgsConstructor public class PageResultT { private ListT records; private long total; private long current; private long size; }这种结构适配前端主流分页组件如ElementUI的Pagination包含四个必要字段records当前页数据列表total总记录数current当前页码size每页条数4. 高级功能与实战技巧4.1 带条件的分页查询实际项目中最常见的是带过滤条件的分页通过QueryWrapper构建条件Override public PageResultUser queryByCondition(UserQuery query) { // 构建分页条件 IPageUser page query.buildPage(); // 构建查询条件 QueryWrapperUser wrapper new QueryWrapper(); wrapper.like(StringUtils.isNotBlank(query.getName()), name, query.getName()) .eq(query.getStatus() ! null, status, query.getStatus()); // 执行查询 IPageUser result baseMapper.selectPage(page, wrapper); return new PageResult(result.getRecords(), result.getTotal(), result.getCurrent(), result.getSize()); }条件构造器的like、eq等方法第一个参数是boolean类型实现动态SQL效果。这是MyBatis-Plus最强大的特性之一。4.2 自定义分页SQL处理对于复杂多表查询可能需要自定义SQL!-- UserMapper.xml -- select idselectUserPage resultTypeUser SELECT u.*, d.dept_name FROM user u LEFT JOIN department d ON u.dept_id d.id ${ew.customSqlSegment} /selectMapper接口定义IPageUser selectUserPage(IPageUser page, Param(Constants.WRAPPER) WrapperUser wrapper);关键点必须使用${ew.customSqlSegment}接收Wrapper生成的WHERE条件否则分页条件不会生效4.3 性能优化实践COUNT优化对于大表分页默认COUNT(*)可能很慢。可以通过重写selectPage方法使用缓存计数Override public PageResultUser fastPageQuery(PageQuery query) { IPageUser page query.buildPage(); // 使用缓存的总数 Long total getCachedTotalCount(); page.setTotal(total); // 只查询当前页数据 ListUser records baseMapper.selectPageRecords( page.getCurrent(), page.getSize() ); return new PageResult(records, total, page.getCurrent(), page.getSize()); }深度分页处理当pageNum较大时如100页MySQL的LIMIT offset,size效率急剧下降。解决方案使用基于游标的分页记录上一页最后一条记录的ID禁止跳转到过大的页码5. 常见问题排查指南5.1 分页失效问题现象返回所有记录而非分页数据排查步骤检查是否配置了PaginationInnerInterceptor确认Mapper方法第一个参数是IPage类型查看执行的SQL日志是否包含LIMIT子句5.2 总数统计异常现象total数量与实际不符解决方案检查Wrapper条件是否正确复杂SQL可能需要自定义COUNT语句select idselectUserPage resultTypeUser SELECT u.* FROM user u ${ew.customSqlSegment} /select select idselectUserPageCount resultTypelong SELECT COUNT(1) FROM user u ${ew.customSqlSegment} /select5.3 排序失效问题现象ORDER BY不生效正确用法wrapper.orderBy(true, true, create_time) .orderBy(true, false, name);第一个参数表示是否执行排序第二个参数表示是否ASC第三个是字段名6. 最佳实践总结经过多个项目验证推荐以下分页实现规范统一参数与响应所有分页接口使用相同的PageQuery和PageResult结构防御性编程对pageSize设置最大值限制如不超过100前端协作返回的current应该是当前实际页码有些前端组件从0开始计数需要转换日志完善在Service层记录关键分页参数便于问题排查性能监控对慢分页查询建立告警机制在最近开发的电商后台系统中这套分页方案支撑了日均百万级的查询请求。特别是在商品管理模块面对千万级商品表通过缓存总数游标分页的组合方案使分页响应时间始终保持在200ms以内。

相关新闻

写论文不用苦苦硬扛!okbiye 一站式平台,解决毕业生 90% 论文难题

写论文不用苦苦硬扛!okbiye 一站式平台,解决毕业生 90% 论文难题

临近毕业,论文这件事压得很多同学喘不过气。 选题拿不准、文献难找、初稿写不动,改完查重又冒出 AI 痕迹问题,格式调一遍又一遍,临近答辩还要熬夜做 PPT。 每一个环节单独找工具,不仅费时,还暗藏不少学术风…

2026/10/14 2:39:27 阅读更多 →
Vue3+Express+SQLite课程设计最小闭环系统搭建指南

Vue3+Express+SQLite课程设计最小闭环系统搭建指南

简介:本资源是一份完整的高校Web开发类期末课程设计报告及配套源码,面向计算机专业本科生与Web初学者,解决课程设计从选题、技术实现到文档撰写的全流程实践需求。压缩包共181个文件,涵盖前端(22个CSS、18个JS、12个HT…

2026/10/14 2:38:27 阅读更多 →
小白_程序员必看:收藏这份网络安全学习指南,带你深入理解Agent安全核心!

小白_程序员必看:收藏这份网络安全学习指南,带你深入理解Agent安全核心!

小白/程序员必看:收藏这份网络安全学习指南,带你深入理解Agent安全核心! 本文将模型视为不可信的概率型规划器,通过完整性、最小代理权、可逆性和恢复能力四大约束保障其现实影响。核心观点包括:安全评价需追踪从意图…

2026/10/14 2:38:27 阅读更多 →

最新新闻

TikTok Shop 多店铺:平台侧哪些信息会被交叉比对

TikTok Shop 多店铺:平台侧哪些信息会被交叉比对

一、先说结论:官方对「关联」的定义,比你想的宽 TikTok Shop 官方在卖家学习中心有一篇《关联账号风险指南》,原文写得很直白——平台对关联账号的判定,通常不是依据单一的重合信息,而是多项风险信号综合判断&#xff…

2026/10/14 3:24:35 阅读更多 →
小白程序员必看:FDE前沿部署工程师,AI落地新风口

小白程序员必看:FDE前沿部署工程师,AI落地新风口

本文介绍了FDE(前沿部署工程师)这一新兴AI岗位,主要职责是连接AI技术与企业实际业务,解决大模型落地难题。文章阐述了FDE的工作内容、所需技能(AI基础、RAG/Agent应用、项目实践、沟通能力),并分…

2026/10/14 3:24:35 阅读更多 →
我把一个只有 7 行的 AI Skill 用出了花:聊聊 eli5

我把一个只有 7 行的 AI Skill 用出了花:聊聊 eli5

一个小到离谱的"插件" 最近我在整理 AI 工具的时候,翻到一个特别不起眼的东西,叫 eli5。它的完整定义只有短短几行,翻译成人话就一句:假装我是一个对这个话题一无所知的人,用一张 HTML 页面、大图配少量文字…

2026/10/14 3:24:35 阅读更多 →
北美外教一对一哪个好?2026年最新深度横评,价格、口音、互动性三维度打分

北美外教一对一哪个好?2026年最新深度横评,价格、口音、互动性三维度打分

在线少儿北美外教一对一赛道,经过多年迭代,目前平台差异化已经非常明显。很多家长选课只看宣传噱头,忽略师资口音纯度、课堂互动落地性、长期性价比等核心指标,最终出现“高价低效、口音不标准、上课全程旁听”等问题。本文基于20…

2026/10/14 3:24:35 阅读更多 →
C++手搓坐标图工具:从坐标变换到实时渲染的工程实践

C++手搓坐标图工具:从坐标变换到实时渲染的工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 3:24:34 阅读更多 →
Virglrenderer 虚拟化技术深入解析 · 专栏目录

Virglrenderer 虚拟化技术深入解析 · 专栏目录

一套面向工程师的 virglrenderer 源码级技术专栏。从概述与演进讲起,再深入核心抽象、各后端实现、部署集成与工程实践。所有内容以仓库源码为准。 这里讲一下我为什么关注 virglrenderer,因为国产 GPU 的虚拟化需求。 随着国产化替代的推进&#xff0c…

2026/10/14 3:23:34 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →