首页 > 数据库 >MyBatis 动态 SQL:<choose> 与 <if>`的优雅实践

MyBatis 动态 SQL:<choose> 与 <if>`的优雅实践

时间:2025-01-04 17:33:32浏览次数:5  
标签:标签 SQL 优雅 互斥 条件 MyBatis 分支

MyBatis 动态 SQL:<choose><if> 的优雅实践

在实际开发中,我们经常需要根据不同的条件动态生成 SQL 查询语句。MyBatis 提供了强大的动态 SQL 功能,能够帮助我们轻松实现这一需求。本文将结合一个实际案例,详细讲解如何使用 MyBatis 的 <choose><if> 标签来实现多条件查询,并分析它们的适用场景和优缺点。


需求描述

我们需要编写一个查询方法,根据以下条件查询所有男性用户:

  1. 如果输入了用户名,则按照用户名模糊查找。
  2. 如果没有输入用户名但输入了住址,则按照住址精确查找。
  3. 如果既没有输入用户名也没有输入住址,则查找用户名为“孙悟空”的用户。

此外,查询条件之间是互斥的,即只能有一个条件生效。


实现方案

1. 使用 <choose><when><otherwise> 实现

<choose> 标签类似于 Java 中的 switch-case 结构,适合处理多分支条件。以下是实现代码:

<select id="queryUserByUserNameOrAddressOrGender" resultType="User">
    SELECT * FROM tb_user_v2
    WHERE gender = '男'
    <choose>
        <when test="userName != null and userName.trim() != ''">
            AND userName LIKE CONCAT('%', #{userName}, '%')
        </when>
        <when test="address != null and address.trim() != ''">
            AND address = #{address}
        </when>
        <otherwise>
            AND userName = '孙悟空'
        </otherwise>
    </choose>
</select>

代码解析

  1. <choose> 标签

    • 用于包裹多个 <when> 和一个 <otherwise> 分支。
    • 只会执行第一个满足条件的 <when> 分支,后续分支不会执行。
  2. <when> 标签

    • 每个 <when> 对应一个条件分支。
    • test 属性用于指定条件表达式。
  3. <otherwise> 标签

    • 当所有 <when> 条件都不满足时,执行 <otherwise> 分支。

优点

  • 逻辑清晰,代码简洁。
  • 适合处理互斥的多分支条件。

适用场景

  • 当条件之间存在互斥关系时(例如,只能有一个条件生效)。
  • 当需要明确的默认逻辑时。

2. 使用 <if> 标签实现

<if> 标签用于根据条件动态拼接 SQL 片段。以下是实现代码:

<select id="queryUserByUserNameOrAddressOrGender" resultType="User">
    SELECT * FROM tb_user_v2
    WHERE gender = '男'
    <if test="userName != null and userName.trim() != ''">
        AND userName LIKE CONCAT('%', #{userName}, '%')
    </if>
    <if test="(userName == null or userName.trim() == '') and (address != null and address.trim() != '')">
        AND address = #{address}
    </if>
    <if test="(userName == null or userName.trim() == '') and (address == null or address.trim() == '')">
        AND userName = '孙悟空'
    </if>
</select>

代码解析

  1. <if> 标签

    • 每个 <if> 独立判断条件,如果满足则拼接对应的 SQL 片段。
  2. 条件表达式

    • 通过 test 属性指定条件表达式。
    • 需要显式处理默认逻辑。

优点

  • 灵活,适合处理独立的、非互斥的条件。

缺点

  • 当条件之间存在互斥关系时,逻辑可能变得复杂。
  • 需要显式处理默认逻辑。

适用场景

  • 当条件之间没有互斥关系时。
  • 当需要处理多个独立条件时。

<choose><if> 的对比

特性 <choose><when><otherwise> <if>
适用场景 多分支条件,且条件之间互斥 独立的条件判断
默认逻辑 通过 <otherwise> 直接处理 需要显式处理
条件关系 条件之间互斥,只会执行第一个满足的分支 条件之间可以独立,也可以有依赖关系
代码复杂度 逻辑清晰,代码简洁 条件较多时,代码可能冗长

最佳实践

  1. 简单条件判断

    • 使用 <if> 标签,适合处理独立的、非互斥的条件。
  2. 多分支条件判断

    • 使用 <choose><when><otherwise>,适合处理互斥的多分支条件。
  3. 默认逻辑处理

    • 如果需要默认逻辑,优先使用 <otherwise>,而不是通过多个 <if> 实现。
  4. 动态 WHERE 子句

    • 结合 <where> 标签,避免手动处理 WHERE 子句的多余 ANDOR

总结

MyBatis 的动态 SQL 功能非常强大,能够帮助我们轻松实现复杂的查询逻辑。通过合理使用 <choose><if> 标签,可以使代码更清晰、更易维护。在实际开发中,应根据具体需求选择合适的动态 SQL 标签,以提高代码的可读性和可维护性。

希望本文对你理解 MyBatis 动态 SQL 有所帮助!如果你有任何问题或建议,欢迎留言讨论!


作者:周政然
日期:2024年1月4日
版权声明:本文为原创文章,转载请注明出处!


如果你觉得这篇文章对你有帮助,欢迎点赞、分享和关注!

标签:标签,SQL,优雅,互斥,条件,MyBatis,分支
From: https://www.cnblogs.com/itcq1024/p/18652143

相关文章

  • MySQL(三)MySQL DML数据库操作语言
    1.MySQLDML数据库操作语言  SQL(StructureQueryLanguage)语言是数据库的核心语言。  SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL。  DML(datamanipulationlanguage)数据操纵语言,以INSERT、UPDATE、DELETE三种指令为核......
  • MYSQL中Join的用法.240430
    1、笛卡尔积(没有加筛选条件的内连接)两表关联,把左表的列和右表的列通过笛卡尔积的形式表达出来。mysql>select*fromt1joint2;或者mysql>select*fromt1innerjoint2;或者mysql>select*fromt1,t2;2、左连接两表关联,左表全部保留,右表关联不上用null表......
  • mysql-触发器
        触发器是与表有关的数据对象,指在insert/update/delete之前或之后,触发并开始执行触发器中定义的SQL语句集合,触发器这种特性可以协助应用在数据库段确保数据的完整性,日志记录,数据校验等操作。语法:  创建createtriggertrigger_namebefore/afterinsert/update......
  • Python高校大学生社交系统(Pycharm Flask Django Vue mysql)
    文章目录开发技术介绍具体实现截图开发技术设计思路系统测试核心代码部分展示文章目录/写作提纲参考开发与测试:源码/演示视频获取方式开发技术介绍语言设计并实现了高校社交系统。该系统基于B/S即所谓浏览器/服务器模式,应用vue框架,选择MySQL作为后台数据库。系统主......
  • MySQL事务(上)
    MySQL事务背景知识一个买票行为可能被多个线程访问,这就有可能造成一些错误,如上图所示一张票就卖出去两次,这是因为买票的过程不是原子的,这个过程会被打断,如何解决上述问题。买票的过程是原子的买票互相应该不能影响买完票是永久有效的前后的状态是确定的这就有点像操作......
  • SQL把字符串按逗号分割成记录
        在SQL中,可以通过以下方法将字符串按逗号分割,并将每个分割的值作为单独的记录插入到结果集中。以下是针对不同数据库系统的实现方法:1.使用STRING_SPLIT(SQLServer2016+)  STRING_SPLIT是SQLServer提供的内置函数,用于将字符串按分隔符拆分。DECLARE@......
  • mysql 使用时需要注意的
    查询常用的查询字段,记得加索引加索引能够提高查询速度。join不要超过两张表join越多,查询越慢。最好用简单的查询语句。分页查询一定要记得加orderbyMYSQL分页查询时没有用ORDERBY,数据量大的时候,有可能会出现数据重复。详情见:https://cloud.tencent.com/develo......
  • MyBatis 核心知识点详解:题目与解析
    MyBatis核心知识点详解:题目与解析MyBatis是一个强大的持久层框架,广泛应用于Java开发中。本文将结合具体的题目,详细解析MyBatis的核心知识点,包括事务控制、自增主键回填、参数获取、结果映射以及动态SQL,帮助大家更好地掌握这些内容。题目1:MyBatis控制事务关于MyBatis......
  • Gin+GORM+Zap+PostgreSQL的Web后端-Gin进阶
    上一篇文章介绍了Gin和Gin的简单使用,本次介绍Gin进阶使用,并和一些常用的库组合使用,最后测试运行并写入数据到PostgreSQL数据库。可配置在configs目录下,新增了config.yml作为配置文件,使用viper库读取配置文件参数,来设置Gin框架和一些其他参数。funcInitConfig(){ viper.AddCo......
  • linux命令行连接Postgresql常用命令
    1.linux系统命令行连接数据库命令psql-hhostname-pport-Uusername-ddatabasename-h 主机名或IP地址  -p 端口  -U 用户名  -d 连接的数据库2.查询数据库表命令selectversion()  #查看版本号\dg     #查看用户\l       #查......