java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis<choose>动态SQL

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>

工作原理

  1. 按照 <when> 标签的顺序依次判断条件表达式
  2. 当某个 <when>test 条件为 true 时,会执行对应的 SQL 片段
  3. 如果所有 <when> 条件都不满足,则执行 <otherwise> 中的 SQL
  4. 如果没有 <otherwise> 且所有条件都不满足,则不插入任何 SQL

注意事项

与 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>

实际应用场景

  1. 多条件优先级查询
  2. 根据不同参数值选择不同的排序方式
  3. 实现类似枚举值的条件分支
  4. 处理复杂的业务逻辑分支

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文