【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 处理字符串参数的经典坑,新手常因省略 '' 导致查询结果异常。
相关推荐
·薯条大王6 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO9 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
小小、码农10 小时前
Linux进程控制:从fork到exec,手写一个简易Shell
linux·运维·服务器
程序员黑豆10 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光10 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
凤山老林10 小时前
Spring Boot @Async 线上实战:从默认配置到生产级线程池治理
java·spring boot·后端
不会就选b10 小时前
Linux之进程间通信(二)---模拟进程池
linux·运维·服务器
marvelyu11 小时前
每天10分钟学会OceanBase系列(Day 20):跨机房容灾实战——构建多数据中心高可用架构
java·大数据·数据库
NeilYuen11 小时前
用UDP实现向DNS服务器请求IP地址
服务器·tcp/ip·udp
AI人工智能+电脑小能手12 小时前
大白话说Java设计模式-04-工厂方法模式(业务实战篇)
java·设计模式·工厂方法模式·架构设计·代码解耦