【MyBatis Exception】省略动态SQL中的‘‘,会造成Runtime Exception

省略 '' 后不会直接报语法错误 ,但会触发逻辑错误(这比语法错误更隐蔽、更难排查),具体表现分两种场景:

一、核心问题:空字符串会被当成有效条件

当你省略 tigerName!='',只写 tigerName!=null 时:

xml

复制代码
<!-- 省略后的错误写法 -->
<when test="tigerName!=null">
    tiger_name=#{tigerName}
</when>

如果代码中传入 tigerName=""(空字符串):

  • MyBatis 会判定 tigerName!=null 为 true(因为空字符串不是 null);
  • 最终拼接出的 SQL 会包含 tiger_name='';
  • 执行 SQL 后,会查询 tiger_name 等于空字符串的记录 ------ 而你的业务逻辑是 "只查询有具体名称的老虎",这会导致:
    1. 查询场景 :返回不符合预期的空结果(数据库中通常没有 tiger_name 为空字符串的记录),或错误返回所有空名称的记录;
    2. 更新 / 插入场景 :可能把 tiger_name 错误更新为空字符串,破坏数据完整性。

二、举个具体例子(你的代码场景)

假设你传入:

java

运行

复制代码
Tiger tiger = new Tiger();
tiger.setTigerName(""); // 空字符串,不是null
  • 省略 '' → test="tigerName!=null" 为 true → SQL 拼接 tiger_name='' → 查询 tiger_name 为空的记录(大概率无结果);
  • 不省略 '' → test="tigerName!=null and tigerName!=''" 为 false → 不拼接该条件 → 按其他条件查询(符合预期)。

三、补充:是否会报语法错误?

  • ❌ 不会报 XML 解析错误 / MyBatis 运行时错误;
  • ❌ 不会报 SQL 语法错误(tiger_name='' 是合法的 SQL);
  • ✅ 只会报 "业务逻辑错误"(查询 / 更新结果不符合预期)。

总结

  1. 省略 '' 不会触发程序报错,但会导致逻辑漏洞(空字符串被当成有效条件);
  2. tigerName!=null 过滤 null,tigerName!='' 过滤空字符串,两者缺一不可;
  3. 这是 MyBatis 处理字符串参数的经典坑,新手常因省略 '' 导致查询结果异常。
相关推荐
学长毕设1 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
HideF1 小时前
Linux
linux·服务器·网络
zzu123zsw2 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
Ruiery3 小时前
Linux 6.6内核内存管理深度解析(十三):slab/slub 分配器
linux·运维·服务器
源码集结号3 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场4 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
乌恩大侠4 小时前
从 AI-RAN 到 AI Agent:基于 NVIDIA Nemotron 构建 5G/6G 智能网络故障诊断系统
服务器·人工智能·5g·o-ru·ai-ran·电信大模型
啃瓜子的松鼠4 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David5 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放5 小时前
Python基础语法练习题(73)
java·前端·python