MyBatis<choose>动态SQL用法详解
作者:night_gu
MyBatis <choose>动态SQL标签用于多条件分支查询,按顺序判断<when>条件,仅执行第一个匹配项,无匹配则执行<otherwise>,与<if>不同,它不拼接所有满足条件的片段,适用于优先级排序、枚举处理等场景
MyBatis<choose>动态SQL
<choose>
是 MyBatis 动态 SQL 中的一个标签,用于实现类似 Java 中的 switch-case
逻辑。
它通常与 <when>
和 <otherwise>
配合使用,根据条件选择不同的 SQL 片段执行。
基本语法结构
<choose> <when test="condition1"> <!-- SQL 片段1 --> </when> <when test="condition2"> <!-- SQL 片段2 --> </when> <otherwise> <!-- 默认 SQL 片段 --> </otherwise> </choose>
使用示例
假设需要根据不同的查询条件动态生成 SQL:
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = 'ACTIVE' <choose> <when test="title != null"> AND title like #{title} </when> <when test="author != null and author.name != null"> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise> </choose> </select>
工作原理
- 按照
<when>
标签的顺序依次判断条件表达式 - 当某个
<when>
的test
条件为 true 时,会执行对应的 SQL 片段 - 如果所有
<when>
条件都不满足,则执行<otherwise>
中的 SQL - 如果没有
<otherwise>
且所有条件都不满足,则不插入任何 SQL
注意事项
- 每个
<when>
标签的test
属性值是 OGNL 表达式 - 可以使用复杂的条件判断,包括逻辑运算符和对象属性访问
- 只会选择第一个满足条件的
<when>
分支执行 <otherwise>
是可选的,不是必须的
与 if 标签的区别
<if>
标签会检查所有满足条件的片段并拼接,而 <choose>
只会选择第一个满足条件的片段执行。例如:
<!-- if 标签示例:可能拼接多个条件 --> <if test="title != null">AND title = #{title}</if> <if test="author != null">AND author = #{author}</if> <!-- choose 标签示例:只选择第一个满足的条件 --> <choose> <when test="title != null">AND title = #{title}</when> <when test="author != null">AND author = #{author}</when> </choose>
实际应用场景
- 多条件优先级查询
- 根据不同参数值选择不同的排序方式
- 实现类似枚举值的条件分支
- 处理复杂的业务逻辑分支
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。