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

别再写一堆if了!Mybatis动态SQL的choose/when/otherwise标签,5分钟搞定多条件分支

告别if嵌套噩梦MyBatis动态SQL的choose/when/otherwise实战指南在电商后台开发中我们经常遇到这样的场景需要根据不同的订单状态或用户等级查询不同的数据。传统的做法是使用一连串的if标签结果XML文件变得臃肿不堪维护起来像在走迷宫。今天我要分享一个让代码重获新生的技巧——choose/when/otherwise标签组合。1. 为什么需要choose/when/otherwise想象一下你正在开发一个订单管理系统需要根据不同的平台类型查询不同的订单表。用if标签实现会是这样的select idfindOrders resultTypeOrder SELECT * FROM if testplatformType 1 orders_A /if if testplatformType 2 orders_B /if if testplatformType 3 orders_C /if WHERE status #{status} /select这种写法存在几个致命问题当所有条件都不满足时SQL语句会变成SELECT * FROM WHERE status ?直接导致语法错误条件判断逻辑分散难以一目了然无法设置默认查询表而choose/when/otherwise组合完美解决了这些问题它相当于Java中的switch-case-default结构。2. choose标签的核心用法让我们重构上面的例子select idfindOrders resultTypeOrder SELECT * FROM choose when testplatformType 1 orders_A /when when testplatformType 2 orders_B /when when testplatformType 3 orders_C /when otherwise orders_default /otherwise /choose WHERE status #{status} /select这个结构有几个关键优势必选其一choose确保最终只会选择一个分支不会出现所有条件都不满足的情况顺序执行when标签会按顺序判断第一个满足条件的会被执行默认保障otherwise提供了保底选项确保SQL语句始终有效3. 高级应用技巧3.1 复杂条件判断when标签的test属性支持所有OGNL表达式可以实现复杂条件判断when test platformType ! null and platformType.trim() ! and (platformType 1 || platformType 2) orders_premium /when3.2 多层级choose嵌套对于更复杂的业务逻辑可以嵌套使用choosechoose when testuserLevel VIP choose when testorderAmount 1000 SELECT * FROM vip_orders_large /when otherwise SELECT * FROM vip_orders_normal /otherwise /choose /when otherwise SELECT * FROM normal_orders /otherwise /choose3.3 与where标签配合使用choose常与where标签搭配构建灵活的查询条件select idsearchOrders resultTypeOrder SELECT * FROM orders where choose when teststatus PENDING AND pay_status 0 AND create_time #{startTime} /when when teststatus SHIPPED AND ship_status 1 AND ship_time BETWEEN #{startTime} AND #{endTime} /when otherwise AND complete_status 1 AND complete_time #{lastMonth} /otherwise /choose /where /select4. 性能优化与最佳实践条件顺序优化将最可能命中的条件放在前面减少判断次数避免过度嵌套嵌套层级最好不要超过3层否则会影响可读性合理使用otherwise确保所有可能的情况都被覆盖参数预处理在Java代码中对参数进行预处理减少XML中的复杂判断// 在Mapper接口中预处理参数 default ListOrder findOrdersByStatus(OrderQuery query) { if (query.getStatus() null) { query.setStatus(DEFAULT); } return findOrders(query); }5. 常见问题排查问题1条件都不满足时没有走otherwise分支解决检查是否有空格等不可见字符使用trim()方法处理字符串问题2多个when条件同时满足解决choose只会执行第一个满足条件的when调整条件顺序问题3OGNL表达式报错解决检查是否为null可以使用org.apache.commons.lang3.StringUtilsisNotBlank(param)在实际项目中我发现很多团队还在大量使用if标签处理多分支逻辑。经过几次性能调优后我们把关键查询改为了choose结构不仅代码量减少了30%查询性能也提升了15%。特别是在处理多平台数据隔离的场景下choose/when/otherwise的组合让我们的代码更加清晰可维护。

相关文章:

别再写一堆if了!Mybatis动态SQL的choose/when/otherwise标签,5分钟搞定多条件分支

告别if嵌套噩梦:MyBatis动态SQL的choose/when/otherwise实战指南 在电商后台开发中,我们经常遇到这样的场景:需要根据不同的订单状态或用户等级查询不同的数据。传统的做法是使用一连串的if标签,结果XML文件变得臃肿不堪&#xff…...

Vivado HLS实战避坑指南:从C代码到可用的IP核,我踩过的那些坑

Vivado HLS实战避坑指南:从C代码到可用的IP核,我踩过的那些坑 第一次用Vivado HLS把C代码变成FPGA上的IP核时,那种兴奋感至今难忘。但很快我就发现,从"能跑通Demo"到"做出稳定可用的IP"之间,横亘着…...

从SOT-23到SOT-963:手把手教你识别和选用那些长得像的SMD晶体管封装

从SOT-23到SOT-963:手把手教你识别和选用那些长得像的SMD晶体管封装 在物联网设备和小型化电子产品设计中,SMD晶体管封装的选择往往让人头疼。那些看似相同的微型封装,实际上在尺寸、引脚排列和散热性能上存在微妙差异。一位资深工程师曾告诉…...

别再死记硬背Next数组了!用‘最长相等前后缀’这个核心概念,5分钟彻底搞懂KMP

从几何视角彻底理解KMP算法:Next数组的本质是字符串的自相似性 每次看到KMP算法中那个神秘的Next数组,总有种面对黑盒的感觉——明明代码只有几行,背后的逻辑却像被施了魔法。今天我们不谈公式推导,换个视角用"最长相等前后缀…...

【代码】基于交替方向乘子法(admm)的微电网分布式低碳优化运行策略matlab-yalmip-cplex/gurobi

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

如何解决多线图中线条颜色不渲染(仅标记和提示框显示颜色)的问题

多线图中线条显示为黑色而标记点和工具提示却正常显示设定颜色,通常是因第三方 css 或 javascript 库意外覆盖了图表库的样式或破坏了其渲染逻辑所致。 多线图中线条显示为黑色而标记点和工具提示却正常显示设定颜色,通常是因第三方 css 或 javascr…...

CSS如何消除图片下方多余间隙_设置display-block改变盒模型

图片下方空白源于img默认inline导致的基线对齐&#xff1b;display:block最直接有效&#xff0c;vertical-align:middle等有兼容性与场景限制&#xff0c;font-size:0或line-height:0副作用大。图片下方空白是行内元素的基线对齐导致的默认情况下 <img> 是行内元素&#…...

自己做agent项目时,为什么工具和提示词写完之后总要重构再重构

最近有朋友来问我&#xff0c;他们团队做内部agent代理项目&#xff0c;工具写了十几个&#xff0c;能跑起来了&#xff0c;但后来想加权限没地方加&#xff0c;agent中断之后也不知道怎么恢复状态&#xff0c;最后只好停下来把工具全部重写了一遍&#xff01; 他们花了一个小…...

逆向YouTube Shorts接口:我是如何用Java和Protobuf搞定短视频列表解析的

逆向解析YouTube Shorts接口&#xff1a;Java与Protobuf实战指南 在移动应用逆向工程领域&#xff0c;Google系产品的接口分析向来以高复杂度著称。本文将分享如何突破层层技术障碍&#xff0c;从零开始解析YouTube Shorts短视频列表接口的全过程。不同于常见的API调用教程&…...

SAP财务凭证增强实战:利用BADI_ACC_DOCUMENT和CI_COBL为BAPI_ACC_DOCUMENT_POST扩展自定义字段

SAP财务凭证增强实战&#xff1a;从需求分析到稳定部署的全流程设计 在SAP标准财务模块实施过程中&#xff0c;业务需求的个性化往往超出标准功能的覆盖范围。当企业需要为会计凭证添加反记账标识、自定义记账码等特殊字段时&#xff0c;标准的BAPI_ACC_DOCUMENT_POST接口就显得…...

Akagi麻将AI助手:30天从新手到高手的终极免费指南

Akagi麻将AI助手&#xff1a;30天从新手到高手的终极免费指南 【免费下载链接】Akagi 支持雀魂、天鳳、麻雀一番街、天月麻將&#xff0c;能夠使用自定義的AI模型實時分析對局並給出建議&#xff0c;內建Mortal AI作為示例。 Supports Majsoul, Tenhou, Riichi City, Amatsuki,…...

SpringBoot+Vue教务管理系统源码+论文

代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择&#xff1a; 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...

如何配置Oracle 19c Data Pump目录_数据泵导入导出的环境准备

必须先创建DIRECTORY对象并授权&#xff1a;CREATE OR REPLACE DIRECTORY dpump_dir AS /u01/app/oracle/dpdump; GRANT READ,WRITE ON DIRECTORY dpump_dir TO scott; 且Oracle进程需有目录读写权限。怎么创建 Data Pump 目录对象&#xff08;DIRECTORY&#xff09;oracle dat…...

SpringBoot项目整合FISCO BCOS 2.9.1 SDK:从WeBASE-Front导出合约到Java调用的保姆级避坑指南

SpringBoot项目整合FISCO BCOS 2.9.1 SDK实战&#xff1a;从合约导出到Java调用的全流程解析 当Java开发者首次尝试将区块链能力整合到现有SpringBoot项目中时&#xff0c;往往会遇到一系列意料之外的挑战。本文将以一个典型的企业级资产管理系统为背景&#xff0c;详细拆解从W…...

C语言宏定义续行符踩坑实录:手把手教你解决‘backslash and newline separated by space’警告

C语言宏定义续行符的隐秘陷阱&#xff1a;从警告解析到工程级解决方案 第一次在CLion里看到backslash and newline separated by space这个警告时&#xff0c;我盯着那个无辜的反斜杠看了足足三分钟。作为一个刚接触C语言宏编程的开发者&#xff0c;这个看似简单的格式问题背后…...

UniApp实战:精准控制微信小程序iOS端滚动行为,告别橡皮筋回弹

1. 为什么iOS橡皮筋效果让人又爱又恨 第一次用UniApp开发微信小程序时&#xff0c;我就被iOS这个特性整懵了。明明在安卓机上运行正常的页面&#xff0c;到了iPhone上就变成了"橡皮泥"——随便一拉就能扯出大片空白。后来才知道&#xff0c;这正是iOS引以为傲的橡皮筋…...

HarmonyOS布局避坑指南:为什么你的Column和Row总对不齐?

HarmonyOS布局避坑指南&#xff1a;为什么你的Column和Row总对不齐&#xff1f; 在HarmonyOS应用开发中&#xff0c;布局是构建用户界面的基础。然而&#xff0c;许多开发者在实际项目中常常遇到Column和Row组件对不齐的问题&#xff0c;导致界面显示效果不尽如人意。本文将深入…...

别再只盯着K-Means了!用sklearn的轮廓系数(silhouette_score)帮你选出最佳聚类算法

用轮廓系数为聚类算法打分&#xff1a;从K-Means到DBSCAN的科学选择指南 当面对一堆未标注的数据时&#xff0c;很多人的第一反应是直接套用K-Means算法——这就像拿到食材只会做炒饭一样。但真实世界的数据分布千奇百怪&#xff0c;有的像瑞士奶酪布满空洞&#xff08;适合DBS…...

JavaScript 中的 setTimeout 是否依赖系统时钟?

settimeout 的延迟计时基于浏览器内部的高精度单调时钟&#xff08;如 performance.now() 所依赖的机制&#xff09;&#xff0c;而非操作系统本地时间&#xff1b;因此修改系统时间不会影响其倒计时行为&#xff0c;但页面休眠、cpu 节流或事件循环阻塞会导致实际触发延迟。 …...

科研党福音:Zotero 6.0 内置PDF阅读器+翻译插件,打造一站式文献阅读与笔记系统

Zotero 6.0 科研工作流革命&#xff1a;内置PDF生态与智能翻译实战指南 当你在深夜赶论文时&#xff0c;是否经历过这样的场景&#xff1a;PDF阅读器卡顿崩溃、翻译软件弹窗遮挡关键图表、文献批注散落在五个不同平台&#xff1f;Zotero 6.0的这次迭代&#xff0c;用原生PDF阅读…...

CTF新手必看:从猪圈密码到JSFuck,这10种古典密码的识别与破解实战

CTF密码学实战&#xff1a;10种古典密码的快速识别与高效破解指南 第一次参加CTF比赛时&#xff0c;我盯着那道Crypto题目发呆了半小时——密文由一堆点和横线组成&#xff0c;隐约像是某种编码&#xff0c;但完全无从下手。直到队友提醒"试试摩斯密码"&#xff0c;三…...

如何通过宝塔面板批量导出网站数据_使用宝塔命令行导出

宝塔命令行导出网站数据的正确入口是使用官方bt命令工具&#xff0c;通过bt 10&#xff08;网站备份&#xff09;或bt 11&#xff08;数据库备份&#xff09;子命令执行&#xff1b;需SSH登录root权限服务器&#xff0c;备份文件默认存于/www/backup/site/和/database/目录&…...

怎么部署OpenClaw?2026年华为云部署OpenClaw配置Coding Plan喂奶级流程

怎么部署OpenClaw&#xff1f;2026年华为云部署OpenClaw配置Coding Plan喂奶级流程。OpenClaw&#xff08;前身为Clawdbot/Moltbot&#xff09;作为开源、本地优先的AI助理框架&#xff0c;凭借724小时在线响应、多任务自动化执行、跨平台协同等核心能力&#xff0c;成为个人办…...

【AI Agent工程实战系列②】工具调用的正确姿势——不只是写个函数那么简单

先模拟一个场景 我们有一个Agent负责处理内部的IT工单,工具列表里有两个长得很像的工具: def get_user_info(user_id: str) -> dict:"""获取用户的基本信息"""...def get_user_permissions(user_id: str) -> dict:"""获…...

【AI Agent工程实战系列①】Agent系统为什么比你想的难十倍

Demo Agent和生产级Agent:本质区别在哪里 绝大多数Agent教程展示的是这样的系统: 用户输入 → LLM思考 → 选择工具 → 工具执行 → 返回结果这个流程在happy path(正常路径)上工作得很好。教程里的例子永远是: 用户问题清晰、意图明确 工具总是返回正确结果 任务在3-5步…...

OpCore Simplify:黑苹果配置终极指南 - 智能自动化工具让OpenCore EFI创建变得简单快速

OpCore Simplify&#xff1a;黑苹果配置终极指南 - 智能自动化工具让OpenCore EFI创建变得简单快速 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify Op…...

3步实现安卓投屏:QtScrcpy让你的手机在电脑上流畅操作

3步实现安卓投屏&#xff1a;QtScrcpy让你的手机在电脑上流畅操作 【免费下载链接】QtScrcpy Android实时投屏软件&#xff0c;此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限 项目地址: https://gitcode.com/barry-ran/QtScrcpy …...

保姆级教程:手把手调试vsomeip 3.1.20.3的Event订阅流程(附GDB/日志追踪技巧)

深入调试vsomeip事件订阅&#xff1a;从原理到实战排查指南 事件订阅机制的核心原理 vsomeip作为车载中间件领域的核心通信框架&#xff0c;其事件订阅机制的设计直接影响着分布式系统的实时性和可靠性。理解这套机制的工作原理&#xff0c;是高效排查订阅问题的前提。 事件订阅…...

Scroll Reverser:解决Mac滚动方向混乱的终极指南

Scroll Reverser&#xff1a;解决Mac滚动方向混乱的终极指南 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否经常在Mac触控板和鼠标之间切换时&#xff0c;被完全相反的滚…...

深入涂鸦IoT SDK核心:剖析pre_app_init到device_init的启动流程与最佳实践

涂鸦IoT SDK启动流程深度解析&#xff1a;从硬件上电到云端连接的架构设计与性能优化 在智能硬件开发领域&#xff0c;启动流程的优化往往决定了产品的第一印象。想象一下&#xff1a;当你按下智能灯泡的开关&#xff0c;是希望立即看到灯光响应&#xff0c;还是等待几秒才亮起…...