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

MyBatis条件拼接失效?一招解决!

问题背景

在前后端联调过程中,前端传递的参数在后端断点调试时能够正确接收,但在 MyBatis 的mapper.xml文件中,条件拼接却失效。原本使用常见的<if>标签检查参数是否为空,但始终无法生效。

原因分析

常见的<if test="dto.acb21a!=null and dto.acb21a!=''">写法在某些情况下可能无法正确判断字符串是否为空或空白。尤其是在参数为字符串类型时,空字符串或空白字符的判断可能不够严谨,导致条件逻辑未按预期执行。

解决方案

改用org.apache.commons.lang3.StringUtils工具类的isNotBlank方法,可以更严格地判断字符串是否非空且非空白。以下是优化后的代码示例:

<if test="@org.apache.commons.lang3.StringUtils@isNotBlank(dto.acb21a)"> <choose> <when test='dto.acb21a == "2"'> AND (BCC21B BETWEEN 1700 AND 1999 OR BCC21A BETWEEN 1700 AND 1999) </when> <when test='dto.acb21a == "3"'> AND (BCC21B BETWEEN 2000 AND 2999 OR BCC21A BETWEEN 2000 AND 2999) </when> <when test='dto.acb21a == "4"'> AND (BCC21B BETWEEN 3000 AND 4499 OR BCC21A BETWEEN 3000 AND 4499) </when> <when test='dto.acb21a == "5"'> AND (BCC21B BETWEEN 4500 AND 5999 OR BCC21A BETWEEN 4500 AND 5999) </when> <when test='dto.acb21a == "6"'> AND (BCC21B BETWEEN 6000 AND 7999 OR BCC21A BETWEEN 6000 AND 7999) </when> <when test='dto.acb21a == "7"'> AND (BCC21B BETWEEN 8000 AND 9999 OR BCC21A BETWEEN 8000 AND 9999) </when> <when test='dto.acb21a == "8"'> AND (BCC21B BETWEEN 10000 AND 14999 OR BCC21A BETWEEN 10000 AND 14999) </when> <when test='dto.acb21a == "9"'> AND (BCC21B >= 15000 OR BCC21A >= 15000) </when> </choose> </if>

关键点说明

  1. 字符串判断优化
    StringUtils.isNotBlank方法会检查字符串是否为null、空字符串或仅包含空白字符,比手动判断更可靠。

  2. 动态 SQL 逻辑清晰
    使用<choose><when>标签实现多条件分支,逻辑清晰且易于维护。

  3. 依赖引入
    确保项目中已引入org.apache.commons.lang3依赖,例如 Maven 配置:

    <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>

适用场景

此方案适用于以下情况:

  • 需要严格判断字符串参数是否有效。
  • 动态 SQL 中需根据参数值实现多分支条件逻辑。
  • 避免因参数为空或空白导致 SQL 拼接异常。

通过这种方法,可以显著提升 MyBatis 动态 SQL 的健壮性和可读性。

http://www.cnnetsun.cn/news/108277.html

相关文章:

  • 轻松高效生成音频字幕:OpenLRC完整指南与多语言LRC文件制作
  • 鸿蒙投屏神器HOScrcpy:5分钟快速上手完整指南
  • 从零到一:全栈FastAPI项目部署实战指南
  • 刚刚发布!中信所发布2025年度国际期刊预警名单
  • OCLP-Mod技术解析:为老旧Mac注入新活力的完整方案
  • QuickLook视频预览优化指南:3分钟解决所有播放问题
  • macOS开源应用终极指南:免费工具集合实现效率飞跃
  • 从零构建:BewlyBewly多语言架构深度解析与实战指南
  • 智能家居控制反馈语音:由EmotiVoice驱动
  • Unitree机器人Python控制终极指南:快速掌握unitree_sdk2_python
  • 三步搞定!B站8K超清视频下载神器bilidown使用指南
  • 深度学习模型扩展实践:从理论突破到工业部署的完整指南
  • 如何快速配置Git项目:跨平台开发的终极指南
  • Clay UI库如何实现微秒级响应的高性能交互系统?
  • OkHttp跨平台网络库:构建多端统一API的高性能连接管理方案
  • 商城App标签选择组件开发,如何React Native鸿蒙跨平台开发`react-native-tags`是一个流行的React Native库,用于实现标签选择功能
  • Dolphin智能文档解析:三步告别PDF转Markdown的烦恼
  • 17、邮件安全与Procmail使用指南
  • EmotiVoice语音合成情感冲突规避机制:避免怪异混合情绪
  • GP2040-CE开源固件:构建高性能定制化游戏控制器解决方案
  • GoScan:让网络扫描变得简单高效的终极指南
  • 开发者必看:EmotiVoice源码结构与二次开发入门指南
  • XCOM V2.6串口调试工具:嵌入式开发的得力助手
  • Obsidian Tasks 插件:重塑知识库任务管理的新范式
  • Android键盘状态监听实战指南:从基础到进阶
  • 解锁细胞分割新高度:Cellpose cyto3模型完整应用手册
  • 裁员潮下的测试人:真正聪明的人正在做这三件事
  • 百度网盘秒传黑科技:网页版极速转存全解析
  • 从零开始:Psi4量子化学计算的5大实战应用场景
  • SourceGit:现代化Git图形化客户端的革命性体验