Skip to content

choose标签


在日常的数据库操作中,很多时候我们需要根据不同的条件动态调整查询或更新的语句。MyBatis 提供了丰富的动态 SQL 功能,其中 <choose> 标签就是一个非常实用的工具,它类似于编程语言中的 switch-case 语句,可以根据不同的条件选择不同的 SQL 片段。

<choose> 是 MyBatis 提供的一种 动态 SQL 标签,用于根据不同的条件选择执行不同的 SQL 片段。它通过结合多个 <when> 子标签,实现条件判断,并且可以通过 <otherwise> 提供一个默认的 SQL 片段。

基本语法:

<choose>
<when test="condition1">
<!-- SQL 片段 1 -->
</when>
<when test="condition2">
<!-- SQL 片段 2 -->
</when>
<otherwise>
<!-- 默认 SQL 片段 -->
</otherwise>
</choose>
  • <choose>:包含所有的条件判断逻辑。

  • <when>:每个 <when> 标签表示一个条件,如果条件成立,执行对应的 SQL 片段。

  • <otherwise>:默认的 SQL 片段,如果没有任何条件成立时执行。

假设我们有一个业务需求,根据传入的 type 参数,决定不同的条件删除某些记录。我们希望通过 type 参数决定删除条件,而不需要写多个 SQL 语句。此时,<choose> 就可以派上用场。

int deleteByIdAndType(@Param("id") String id, @Param("type") int type);
<update id="deleteByIdAndType">
UPDATE lfp_housing_group_community c
LEFT JOIN sys_files f
ON c.id = f.master_id
AND f.master_name = 'lfp_housing_group_community'
AND f.del_flag = '0'
SET c.del_flag = '1', f.del_flag = '1'
WHERE c.del_flag = '0'
<choose>
<when test="type == 1">
AND c.id = #{id}
</when>
<when test="type == 2">
AND c.housing_activity_group_id = #{id}
</when>
<otherwise>
AND c.housing_volunteer_activity_id = #{id}
</otherwise>
</choose>
</update>

解析:

在上面的 SQL 语句中,<choose> 标签根据 type 的不同值,动态修改 WHERE 子句的条件:

  • <when test="type == 1">:如果 type1,则添加条件 AND c.id = #{id}

  • <when test="type == 2">:如果 type2,则添加条件 AND c.housing_activity_group_id = #{id}

  • <otherwise>:如果 type 既不是 1 也不是 2,则使用默认条件 AND c.housing_volunteer_activity_id = #{id}

通过这种方式,我们可以根据 type 参数的不同,动态调整 SQL 查询的条件,而不需要编写多个复杂的 SQL 查询。

3. <choose> 标签与其他动态 SQL 标签的区别

Section titled “3. <choose> 标签与其他动态 SQL 标签的区别”

MyBatis 提供了多个动态 SQL 标签,如 <if><where><trim> 等。它们各自有不同的适用场景。

  • <if>:在某些条件成立时执行指定的 SQL 片段。适用于简单的条件判断。

  • <choose>:用于多个条件之间的选择,相当于编程中的 switch-case 语句。它可以包含多个 <when> 标签,并通过 <otherwise> 提供默认行为。

  • <where>:用于在 SQL 中自动添加 WHERE 关键字,并去除多余的 ANDOR

  • <trim>:用于去除 SQL 中的多余字符,如多余的逗号、空格等。

<choose> 可以包含多个 WHEN 语句,用于选择多种情况中的一种,而 if 语句通常用于处理单一条件。比如,如果你只需要根据一个条件判断来决定是否添加某个 SQL 片段,可以使用 <if>;如果有多个条件需要判断,则使用 <choose> 更为简洁。

  • 顺序问题<choose> 中的 <when> 标签是有顺序的,MyBatis 会按顺序检查每个条件,直到找到第一个成立的条件。如果所有 <when> 都不成立,则会执行 <otherwise> 部分。

  • 避免过多的条件判断:如果 when 中有多个复杂的条件,考虑是否可以通过其他方式优化 SQL 查询,避免过多的条件判断导致性能问题。

MyBatis 的 <choose> 标签非常适合用于 复杂的条件判断多条件选择,它帮助我们根据不同的条件动态构建 SQL 查询或更新语句,避免了多条 SQL 查询的重复编写。

  • <choose>:用于选择多个条件中的一个,并提供默认行为。

  • <when>:指定某个条件成立时执行的 SQL 片段。

  • <otherwise>:指定所有条件都不成立时执行的默认 SQL 片段。

通过使用 <choose>,我们能够让 SQL 查询更具灵活性和可读性,使得代码更加简洁,维护更加方便。