【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 处理字符串参数的经典坑,新手常因省略 '' 导致查询结果异常。
相关推荐
摇滚侠9 小时前
Oracle19c 导出 Oracle11g 导入,Oracle19c 导出导入,Oracle11g 导出导入
java·数据库·oracle
Stella Blog10 小时前
狂神Java基础学习笔记Day05
java·笔记·学习
曹牧10 小时前
Spring WebService 的两种主流实现方式‌
java·后端·spring
pqq的迷弟10 小时前
面试整理:HashMap\ConcurrentHashMap原来
java·面试·职场和发展
夕除10 小时前
javaweb--16
java·状态模式
用户游民10 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java
花月C10 小时前
Agent应用开发零基础入门:核心概念、环境配置与首次LLM调用
java·python
曹牧10 小时前
Java Web:DispatcherServlet
java·开发语言·前端
直奔標竿10 小时前
Java开发者AI转型第二十三课!Spring AI个人知识库实战(二):异步ETL流水线搭建与避坑指南
java·人工智能·spring boot·后端·spring
Lyyaoo.10 小时前
TreadLocal和TreadLocalMap
android·java·redis