MyBatis 的 <if> 标签是条件开关,需兼顾空值与空白字符串判断,字符串推荐 test="str != null and str.trim() != ''",数字/布尔判非空,<where> 自动处理 SQL 语法,多条件应独立 <if> 并用 AND/OR 组合,XML 中特殊符号须转义。

MyBatis 的 `
test 表达式要覆盖空值与空白两种情况
多数业务字段允许为空(null)或为空字符串(""),但两者含义不同,数据库行为也不同。若只判 `!= null`,遇到 `" "` 或 `""` 就会误入条件;若只判 `!= ''`,遇到 null 会报 OGNL 异常。
- 字符串类型推荐写法:
test="username != null and username.trim() != ''" - 数字/布尔类型只需判非空:
test="age != null"或test="gender == 0 or gender == 1" - 避免直接用
== "",因为 null 调用 trim() 会抛异常;必须先判 null 再 trim
WHERE 子句开头必须用 标签兜底
多个 `
- 正确写法:
<where><if test="...">name = #{name}</if><if test="...">and age > #{age}</if></where> - 不要手动写
WHERE 1=1——它虽能绕过语法错误,但污染执行计划,影响数据库优化器判断 - 当所有 `
` 都不成立时,` ` 整体被忽略,SQL 中不出现 WHERE 子句,这是安全的
多条件组合逻辑要显式拆解,别堆在一个 test 里
比如“按姓名模糊查,且职业匹配”,不能写成 test="username != null and jobs != null" 就完事——这只能控制是否启用整个条件块,无法支持“只填姓名”“只填职业”“两个都填”三种组合。
立即学习“Java免费学习笔记(深入)”;
- 每个字段独立 `
`,各自判断是否参与查询 - 字段间关系靠 SQL 逻辑词(AND/OR)表达,不是靠 test 表达式嵌套
- 像“姓名模糊 + 职业精确”这种常见组合,直接写:
<if test="username != null and username.trim() != ''">and t_username like concat('%', #{username}, '%')</if>和<if test="jobs != null and jobs.trim() != ''">and t_jobs = #{jobs}</if>
特殊符号要在 XML 中转义,别硬写 < 或 >
XML 解析器会把 ` 18"` 会解析失败。必须使用实体字符。
- 大于:用
>(不是 >) - 小于:用
<(不是 - 大于等于:
>=;小于等于:<= - OGNL 支持三元运算、方法调用(如
list.size() > 0),但建议保持简单,可读性优先


















