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

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

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

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

xml

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

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

  • MyBatis 会判定 tigerName!=nulltrue(因为空字符串不是 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 过滤 nulltigerName!='' 过滤空字符串,两者缺一不可;
  3. 这是 MyBatis 处理字符串参数的经典坑,新手常因省略 '' 导致查询结果异常。
相关推荐
Wang's Blog10 小时前
Java 接入Redis: 服务启动停止与后台运行配置
java·服务器·redis
此时不提桶,更待何时10 小时前
01-04-B-垃圾回收面试与生产事故实战
java·jvm·面试
鹿角片ljp12 小时前
KV Cache 解析
java·算法
captain37612 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
EasyGBS12 小时前
终结训推割裂!EasyGBS×EasyAIS×DLTM,实现AI算法训推一体闭环落地!
服务器·深度学习·安全
惊讶的猫13 小时前
意图识别置信度和检索重排的分数
java
caoerzhong13 小时前
仓库管理数字化趋势解读:JeeWMS 开源 Java WMS 视角下的五个演进方向
java·开源
程序员JerrySUN14 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
Doris__HE14 小时前
【元脑服务器NF5476G7-NF5476M7技术规格分享】
运维·服务器·网络·数据库·性能优化