【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 处理字符串参数的经典坑,新手常因省略 '' 导致查询结果异常。
相关推荐
咖啡八杯2 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育2 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵2 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影4 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
一叶龙洲4 小时前
wslg打开Ubuntu24.04默认打开图形界面
linux·服务器·数据库·ubuntu
Miao121315 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔5 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城6 小时前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience7 小时前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu