MyBatis<choose>动态SQL用法详解

 更新时间:2025年09月21日 15:59:33   作者: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

注意事项

  • 每个 <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>

实际应用场景

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

总结

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

相关文章

  • 简单说说Java SE、Java EE、Java ME三者之间的区别

    简单说说Java SE、Java EE、Java ME三者之间的区别

    本篇文章小编就为大家简单说说Java SE、Java EE、Java ME三者之间的区别。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • Spring Boot Web 开发注解篇

    Spring Boot Web 开发注解篇

    在 Spring Boot 快速入门中,只要在 pom.xml 加入了 spring-boot-starter-web 依赖,即可快速开发 web 应用。下文给大家详细介绍了spring boot web 开发注解,感兴趣的朋友参考下吧
    2017-08-08
  • Reactive Programming入门概念详解

    Reactive Programming入门概念详解

    这篇文章主要为大家介绍了Reactive Programming入门概念详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 手把手教你搭建第一个Spring Batch项目的步骤

    手把手教你搭建第一个Spring Batch项目的步骤

    这篇文章主要介绍了手把手教你搭建第一个Spring Batch项目的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java中的Optional处理方法

    Java中的Optional处理方法

    在我们日常的开发中,我们经常会遇到 NullPointerException,如何才能优雅的处理NPE?这里告诉大家一个较为流行的方法,这篇文章主要介绍了Java中的Optional处理方法,需要的朋友可以参考下
    2022-09-09
  • SpringBoot实现接口防刷的五种方案

    SpringBoot实现接口防刷的五种方案

    接口防刷是保障系统安全与稳定性的重要措施,恶意的高频请求不仅会消耗服务器资源,还可能导致数据异常,甚至系统瘫痪,本文将介绍在SpringBoot框架下实现接口防刷的5种技术方案,需要的朋友可以参考下
    2025-04-04
  • Java的类型擦除式泛型详解

    Java的类型擦除式泛型详解

    Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw Type),并且会在相应的地方插入强制转型的代码。这篇文章主要介绍了Java的类型擦除式泛型,需要的朋友可以参考下
    2021-08-08
  • SpringBoot 如何根据不同profile选择不同配置

    SpringBoot 如何根据不同profile选择不同配置

    这篇文章主要介绍了SpringBoot 如何根据不同profile选择不同配置的操作方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • JSP安全开发之XSS漏洞详解

    JSP安全开发之XSS漏洞详解

    XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码,而程序对于用户输入内容未过滤,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。
    2016-09-09
  • 关于Java中数组切片的几种方法(获取数组元素)

    关于Java中数组切片的几种方法(获取数组元素)

    这篇文章主要介绍了关于Java中数组切片的几种方法(获取数组元素),切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制,需要的朋友可以参考下
    2023-05-05

最新评论