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

2025 若依框架实战:MyBatis分页失效排查与SQL优化指南

1. 多部门查询引发的分页失效现场还原最近在重构一个老项目时遇到了一个典型的分页失效问题。场景是这样的系统需要根据不同部门的权限返回数据列表管理员可以看到所有数据普通用户只能查看自己所属部门的数据。听起来很简单的需求对吧但实际运行时却发现分页完全失效前端明明设置了每页10条结果返回了全部几百条数据。先来看原始代码的关键片段已简化public ListSysTest selectList(String name) { SysUser user SecurityUtils.getLoginUser().getUser(); ListSysTest resultList new ArrayList(); if (user.isAdmin()) { // 管理员直接查询全部 resultList sysTestMapper.selectAll(name); } else { // 普通用户处理多部门情况 if (user.hasMultipleDepts()) { String[] deptIds user.getDeptIds().split(,); for (String deptId : deptIds) { // 循环查询每个部门的数据 ListSysTest tempList sysTestMapper.selectByDept(name, deptId); resultList.addAll(tempList); } } else { // 单个部门直接查询 ListSysTest tempList sysTestMapper.selectByDept(name, user.getDeptId()); resultList.addAll(tempList); } } return resultList; }这段代码的业务逻辑看似合理先判断用户权限然后根据部门数量决定查询方式。但为什么分页会失效呢关键在于PageHelper.startPage()的拦截机制。在实际调用链中Controller层确实调用了startPage()但最终分页效果却消失了。2. PageHelper分页原理深度剖析要理解这个问题我们需要先搞清楚MyBatis分页插件的工作原理。以最常用的PageHelper为例它的核心机制是这样的拦截点通过MyBatis的Interceptor接口在Executor.query()方法执行前进行拦截生效条件只有在startPage()之后立即执行的第一个查询语句会被分页处理分页逻辑自动计算总记录数执行COUNT查询修改原始SQL添加LIMIT子句对查询结果进行包装返回Page对象在我们的案例中问题出在Service层的处理方式上。虽然Controller调用了startPage()但Service层却通过以下方式绕过了分页循环执行多次selectByDept查询在内存中合并结果集每次循环中的Mapper查询都被视为独立的查询只有第一个会被分页最终合并的结果集自然就失去了分页效果3. SQL优化方案实战解决这个问题的核心思路是将多次查询合并为单次查询。具体来说我们需要改造SQL使其支持多部门查询。下面是详细的改造步骤3.1 Mapper接口改造首先修改Mapper接口将部门参数改为List类型ListSysTest selectByDepts( Param(name) String name, Param(deptIds) ListString deptIds );3.2 XML映射文件优化使用MyBatis的动态SQL实现多部门查询select idselectByDepts resultTypeSysTest SELECT t.* FROM sys_test t JOIN sys_dept_relation r ON t.id r.test_id WHERE r.status 1 if testname ! null and name ! AND t.name LIKE CONCAT(%, #{name}, %) /if if testdeptIds ! null and deptIds.size() 0 AND r.dept_id IN foreach collectiondeptIds itemdeptId open( separator, close) #{deptId} /foreach /if /select3.3 Service层重构简化后的Service实现public ListSysTest selectList(String name) { SysUser user SecurityUtils.getLoginUser().getUser(); if (user.isAdmin()) { return sysTestMapper.selectAll(name); } else { ListString deptIds Arrays.asList(user.getDeptIds().split(,)); return sysTestMapper.selectByDepts(name, deptIds); } }3.4 Controller层调整保持Controller不变即可GetMapping(/list) public TableDataInfo getList(String name) { startPage(); // 关键分页入口 ListSysTest list testService.selectList(name); return getDataTable(list); }4. 性能对比与优化建议改造前后的性能对比非常明显指标改造前方案优化后方案查询次数N次部门数量1次分页效果失效正常数据库压力高低网络传输量可能传输过量数据严格按分页传输代码可维护性复杂简洁在实际项目中我还总结了几个优化小技巧IN子查询优化当部门数量过多时比如超过100个可以考虑改用临时表关联查询分页参数传递确保startPage()在调用链的最外层通常是ControllerPageHelper配置建议在配置中添加reasonabletrue和pageSizeZerotrue参数索引检查确保查询条件涉及的字段如dept_id有适当索引5. 常见踩坑点排查指南在实际开发中分页失效问题可能还有以下变种异步调用导致失效在异步方法中调用分页查询需要特别注意线程上下文传递嵌套查询问题在复杂的嵌套查询中PageHelper可能无法正确拦截目标SQL手动COUNT问题当使用PageHelper.startPage(pageNum, pageSize, true)时注意自定义COUNT语句的编写规范特殊数据库方言对于Oracle等特殊数据库可能需要额外配置方言这里分享一个排查分页问题的通用流程确认startPage()的调用位置是否正确检查是否有多余的查询操作在分页查询之前执行使用MyBatis的SQL日志功能观察实际执行的SQL语句在PageHelper配置中开启helperDialect属性确保方言正确对于复杂查询考虑使用PageHelperSkip注解跳过不需要分页的方法6. 若依框架中的分页最佳实践在若依框架中分页功能已经做了很好的封装。这里分享几个框架特有的使用技巧TableDataInfo封装直接使用框架提供的getDataTable()方法返回分页数据全局分页配置在application.yml中可以配置默认分页参数前端分页联动若依前端表格组件会自动处理分页参数传递特殊分页需求对于需要自定义分页逻辑的场景可以使用PageHelper.offsetPage()一个完整的若依分页请求流程是这样的前端发起请求携带pageNum和pageSize参数Controller调用startPage()启动分页Service执行单次数据库查询框架自动拦截SQL并添加分页逻辑返回包装后的Page对象前端渲染分页组件和数据表格7. 动态SQL编写技巧进阶为了处理更复杂的业务场景这里再分享几个动态SQL的高级用法多条件组合查询示例select idselectComplex resultTypeSysTest SELECT * FROM sys_test where if testname ! null AND name LIKE #{name} /if choose when testtype 1 AND status 1 /when when testtype 2 AND status IN (2,3) /when otherwise AND status ! 0 /otherwise /choose if testdeptIds ! null AND dept_id IN foreach collectiondeptIds itemitem open( separator, close) #{item} /foreach /if /where ORDER BY create_time DESC /select批量更新示例update idbatchUpdate UPDATE sys_test trim prefixSET suffixOverrides, trim prefixname CASE suffixEND, foreach collectionlist itemitem WHEN id #{item.id} THEN #{item.name} /foreach /trim trim prefixstatus CASE suffixEND, foreach collectionlist itemitem WHEN id #{item.id} THEN #{item.status} /foreach /trim /trim WHERE id IN foreach collectionlist itemitem open( separator, close) #{item.id} /foreach /update这些技巧在复杂业务系统中非常实用既能保证代码整洁又能提高执行效率。特别是在处理分页查询时合理的SQL设计可以避免很多性能问题。

相关文章:

2025 若依框架实战:MyBatis分页失效排查与SQL优化指南

1. 多部门查询引发的分页失效现场还原 最近在重构一个老项目时,遇到了一个典型的分页失效问题。场景是这样的:系统需要根据不同部门的权限返回数据列表,管理员可以看到所有数据,普通用户只能查看自己所属部门的数据。听起来很简单…...

nodejs+vue基于springboot的山东济南旅游路线智能推荐规划系统

目录技术栈选择系统功能模块数据处理与API设计推荐算法实现示例前端交互关键点部署与优化测试与迭代项目技术支持可定制开发之功能创新亮点源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术栈选择 后端采用Spring Boot框架,提…...

告别谷歌水印!用自研AI工具处理3Dtiles/OSGB模型数据的保姆级教程

3Dtiles/OSGB模型数据AI去水印全流程实战指南 当你在数字孪生或三维可视化项目中遇到带版权水印的倾斜摄影模型时,是否曾为如何专业处理而苦恼?本文将彻底解决这个痛点——不同于简单的PS覆盖,我们将深入一套基于AI技术的自动化水印去除方案&…...

UOS打印机故障不求人:手把手教你排查错误日志(附常见问题速查表)

UOS打印机故障排查实战指南:从日志分析到快速修复 办公室里最让人抓狂的时刻之一,莫过于急需打印文件时打印机突然罢工。作为UOS系统管理员或技术支持人员,掌握一套高效的打印机故障排查方法至关重要。本文将带你深入UOS打印系统内部&#xf…...

解锁系统潜能:Windows Cleaner的C盘空间释放之道

解锁系统潜能:Windows Cleaner的C盘空间释放之道 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 当你的代码编译到99%突然中断,弹出"…...

Jenkins升级踩坑实录:从备份到重启的完整避坑指南

Jenkins升级实战:从备份策略到灾备恢复的完整指南 每次Jenkins升级都像一次高空走钢丝——看似简单的版本更新背后,隐藏着插件兼容性、配置丢失、服务启动失败等无数"暗礁"。作为支撑企业持续交付的核心引擎,Jenkins的稳定性直接关…...

AI才不是石头里蹦出来的!一文带你看懂AI的“前世今生“

凌晨三点,你大概率已经睡着了,但全球各地的服务器还在疯狂运转——无数AI模型正在处理你白天问过的问题、生成你需要的文案、识别你上传的照片。你有没有想过,这些现在已经习以为常的AI功能,背后是多少代人努力了70多年的结果&…...

呼吸纪元:城市觉醒的肺叶

呼吸纪元:当整座城市成为单个肺叶2061年立春,零点零分零秒,上海所有电动汽车同时完成一次深呼吸——不是比喻,是物理意义上的空气吞吐。一万七千个车载空气净化系统同时反向运转,将储存了整整一个冬季的、来自世界各地…...

强烈建议 Go 语言爱好者立即拿下软考(政策风口)

🔥倒计时不足100天!2026年软考5月考季进入黄金备考期!本号联系大厂IT负责人,紧急开启——2026软考📑考前抢分特训群无需转发分享,直接扫码,0元快速进群!【准入声明】为确保学习质量&…...

FDA软件验证文档包缺失这4类C语言单元测试记录?你的510(k)申请可能已自动拒收

第一章:FDA软件验证文档包的合规性本质与510(k)自动拒收机制FDA对医疗器械软件的监管核心在于“可追溯性、可复现性与风险驱动的证据完整性”。软件验证文档包(Software Verification and Validation Package)并非静态交付物,而是…...

《Ionic 加载动画》

《Ionic 加载动画》 引言 随着移动应用开发技术的不断发展,用户体验(UX)成为开发者关注的焦点。在众多技术中,Ionic框架因其丰富的组件和易于上手的特性,成为了移动应用开发的热门选择。本文将详细介绍Ionic框架中的加…...

开源贡献指南:Magma智能体社区开发入门

开源贡献指南:Magma智能体社区开发入门 1. 前言:欢迎来到Magma开源社区 如果你对多模态AI智能体开发感兴趣,想要参与一个真正有影响力的开源项目,那么Magma社区正是你寻找的地方。作为一个面向数字与物理世界的多模态AI代理基础…...

摆线减速器(SolidWorks)

摆线减速器作为机械传动领域的核心部件,其核心作用在于通过独特的摆线齿轮啮合原理实现高精度、高扭矩的减速功能。相较于传统减速装置,其结构采用摆线针轮与输出机构协同工作的模式,通过摆线轮的连续摆动与针齿的周期性啮合,将输…...

【Dify混合RAG召回率优化实战白皮书】:20年AI工程老兵亲测的5大召回瓶颈与3倍提升路径

第一章:Dify混合RAG召回率优化对比评测报告全景概览本报告聚焦于 Dify 平台中混合 RAG(Retrieval-Augmented Generation)架构的召回率优化实践,系统评估不同向量模型、分块策略、重排序器(Reranker)及元数据…...

C#海康视觉VM4.1二次开发框架源码解析:多流程框架、运动控制卡服务框架与海康威视VM开发经验分享

C#基于海康视觉VM4.1的二次开发框架源码,有多流程框架 运动控制卡 服务框架 需要有海康VM的基础并且有海康威视VM开发狗框架概述 GVM V2.7是一个基于海康威视VM4.1平台的二次开发框架,专为工业自动化场景设计。该框架提供了完整的服务架构、运动控制、视…...

省心了! 降AIGC网站 千笔·专业降AIGC智能体 VS 知文AI,专科生专属神器!

在AI技术迅速发展的今天,越来越多的专科生开始借助AI工具辅助完成毕业论文写作,以提高效率、优化内容质量。然而,随着学术审查标准日益严格,AI生成内容的痕迹和重复率问题逐渐成为困扰学生的“隐形炸弹”。面对查重系统升级、Turn…...

Starry Night Art Gallery部署教程:safetensors加载+cuda缓存清理详解

Starry Night Art Gallery部署教程:safetensors加载cuda缓存清理详解 1. 项目概述:当AI遇见艺术殿堂 想象一下,你走进的不是一个冰冷的AI工具界面,而是一座充满文艺复兴气息的数字艺术馆——这就是Starry Night Art Gallery&…...

AgentCPM深度研报助手:5分钟本地部署,一键生成专业研究报告

AgentCPM深度研报助手:5分钟本地部署,一键生成专业研究报告 1. 研报写作的新范式:本地化智能解决方案 在信息爆炸的时代,专业研究报告的撰写正面临前所未有的挑战。传统方式下,分析师需要花费大量时间在资料收集、框…...

探索 Lumen IM:基于 Vue3 + Go 的现代化网页即时聊天系统设计与实现

摘要随着互联网技术的飞速发展,即时通信已经成为人们日常交流中不可或缺的一部分。本文深入剖析了一款基于 Vue3 Naive UI 前端框架与 Go 语言后端技术栈构建的现代化网页即时聊天系统——Lumen IM。从系统架构设计、核心功能实现到技术选型,本文详细阐…...

aigc 生成几何图 整理笔记

目录 geouni: 环境安装 图生成推理演示 问题解决的推理演示 问题创建的推理演示 geouni: chengruogu0915/GeoUni: Repository for GeoUni, A Unified Model for Generating Geometry Diagrams, Problems and Problem Solutions. 环境安装 pip ins…...

告别Python依赖:纯Java环境部署YOLOv10模型全指南

适配环境:JDK 11+ | YOLOv10 | DJL 0.26.0 / ONNX Runtime 1.19.2 实战价值:彻底告别Python依赖,所有逻辑在JVM内完成,工业级部署零门槛,30分钟跑通YOLOv10目标检测 前言:工业级Java项目,真的不能为了YOLO装个Python “老周,我们的MES系统是纯Java写的,现在要加个YOL…...

ffmpeg 提取音频

ffmpeg -i input.mp4 output.wav# 或指定语音识别常用参数 ffmpeg -i input.mp4 -ar 16000 -ac 1 output.wav...

ROS 2传感器实战:从数据流到感知决策的闭环构建

1. ROS 2传感器数据流处理的核心逻辑 第一次用ROS 2处理传感器数据时,我被各种消息类型和话题搞得晕头转向。直到把整个数据处理流程拆解成几个关键环节,才真正理解了从原始数据到感知决策的完整链路。传感器数据流的本质,就是把物理世界的信…...

SEO_快速见效的SEO优化技巧与常见问题解决办法

快速见效的SEO优化技巧:从入门到精通在当今的互联网时代,搜索引擎优化(SEO)已经成为每一个网站拥有者的必备技能。特别是在百度这样的主流搜索引擎上,优化好一个网站不仅能带来更多的流量,还能提升品牌知名…...

基于麻雀搜索算法的三维旅行商问题

基于麻雀搜索算法(SSA)的三维旅行商问题,三维TSP问题。 如果觉得蚁群算法太老了,那么麻雀算法解决三维TSP问题就相对新颖一些了。标记出城市坐标的三维节点,起始点。 如果您改进出麻雀算法,但缺少工程应用,3维TSP未尝不…...

西门子PLC物料分拣系统实战:从硬件选型到梯形图编程全流程解析

西门子PLC物料分拣系统实战:从硬件选型到梯形图编程全流程解析 在工业自动化领域,物料分拣系统正经历着从传统人工到智能化的革命性转变。作为一名深耕自动化领域多年的工程师,我见证了无数企业通过引入PLC控制系统实现分拣效率的飞跃式提升。…...

探索空气流注放电模型:基于Comsol等离子体模块的奇妙之旅

空气流注放电模型,采用等离子体模块,包含多种化学反应 空气流注放电模型,采用等离子体模块,包含多种化学反应 Comsol等离子体模块 空气棒板放电 11种化学反应 放的是求的速率 碰撞界面数据在bolsig里求出来速率 导入模型 然后导入…...

[工业控制]解决方案:突破硬件限制的虚拟总线技术创新方法

[工业控制]解决方案:突破硬件限制的虚拟总线技术创新方法 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus 技术定位:重新定义工业控制领域的设备抽象层 解构虚拟总线技术的底层架构 虚拟总线技术&#xff0…...

ITU-R BT.2100建议书标准解读和应用指南

标准主题:单主HDR制作环境中的近距离HDR/SDR监测观看条件 发布日期:2025年2月 系列分类:BT(广播业务-电视) 引言:为什么要有BT.2100? 你有没有这种感觉:同样一台4K电视,看某些流媒体节目时,阳光耀眼得刺眼,暗部细节清清楚楚;看另一些节目时,画面却平淡无奇,像蒙…...

全球隐私控制(GPC):隐私保护新利器的机遇与挑战

全球隐私控制(GPC):隐私保护的新防线全球隐私控制(GPC)始于 2020 年,灵感源自《加州消费者隐私法案》,旨在帮助用户重新掌控自己的隐私。用户可以通过一些浏览器和浏览器扩展程序,知…...