mybatis 的 标签实现“多选一”条件逻辑,类似 switch-case-default,确保仅一个分支生效;从上到下匹配 的 test 表达式,命中即执行并跳过后续分支,未命中且含 则执行其内容,否则不生成 sql。

MyBatis 的 `
基本写法和执行规则
- 如果所有
都不满足,且存在 ,则执行 中的内容 - 如果所有
都不满足,又没有 ,整个 块不生成任何 SQL 中的 test 支持 OGNL 表达式,如 id != null、status == 'ACTIVE'、name != null and name != ''
常搭配的 SQL 元素
- 用在
内:适合构建 WHERE 子句中的单条件筛选(例如按 ID、用户名、邮箱三者之一查询) - 用在 SELECT 列表中:可动态选择返回哪些字段(比如不同状态返回不同列)
- 用在 ORDER BY 后:实现动态排序字段(如按注册时间、最后登录、活跃度排序)
字符串非空要显式判断
OGNL 中 null 和 '' 不等价,所以对字符串参数不能只写 username != null,否则传入空字符串会误触发。
- 正确写法:username != null and username != ''
- 错误写法:username != null(空字符串也会进入该分支)
- 也可用 !StringUtils.isEmpty(username)(需引入工具类并配置 OGNL 变量)
默认分支 的实用技巧
- 示例:
1 = 1 —— 让查询返回全表(慎用,注意性能) - 示例:
status = 'NORMAL' —— 设定默认筛选条件 - 不写
时,务必确认业务允许“无条件”情况,否则可能查不到数据或报错











