mybatis动态sql标签(如、、)用于运行时智能组装sql片段,避免字符串拼接导致的语法错误、sql注入和空值问题;通过ognl表达式控制条件分支,自动处理where关键字及多余and/or,安全生成update语句并去除末尾逗号。

MyBatis 的动态 SQL 标签(如 <if></if>、<where></where>、<set></set>)不是用来“拼接字符串”生成 SQL,而是让 MyBatis 在运行时根据参数条件智能组装 SQL 片段,避免手写字符串拼接带来的语法错误、SQL 注入和空值问题。
用 控制条件分支
<if></if> 是最常用的动态标签,通过 test 表达式判断是否包含该 SQL 片段。表达式使用 OGNL 语法,可访问参数对象属性、集合、静态方法等。
例如查询用户,支持按用户名、邮箱、状态任意组合筛选:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
用 自动处理 WHERE 和 AND
直接写 WHERE 1=1 虽然可行,但不够优雅。<where></where> 标签会自动:
- 如果内部有至少一个条件成立,才插入 WHERE 关键字
- 自动去除第一个条件前多余的 AND 或 OR
上面的查询可优化为:
用 安全生成 UPDATE 语句
更新操作常需动态设置字段,<set></set> 会:
- 只在有字段需要更新时才添加 SET 关键字
- 自动去掉最后一个逗号(,)
例如只更新非空字段:
UPDATE user
username = #{username},
email = #{email},
status = #{status},
WHERE id = #{id}
其他实用技巧
- 多个条件用
and/or连接,注意括号:用test="(a!=null) and (b!=null)"更清晰 - 判断集合非空:用
test="list != null and list.size() > 0"或更简洁的test="list != null and !list.isEmpty()" - 避免 NPE:对可能为 null 的对象属性,先判空再取属性,如
test="user != null and user.username != null" - 需要复杂逻辑时,可用
<choose><when><otherwise></otherwise></when></choose>替代 if-else 链
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










