type
status
date
slug
summary
tags
category
password

1、概览

MyBatis 的动态 SQL 功能是其最强大的特性之一,它允许你在 XML 映射文件中编写灵活的 SQL 语句,根据不同条件动态生成不同的 SQL。
主要动态 SQL 元素如下:
  • if:根据条件包含 SQL 片段。
  • choose、when、otherwise:类似于 Java 中的 switch-case 语句。
  • trim、where、set:用于处理 SQL 语句中的前缀、后缀和 WHERE/UPDATE 子句。
  • foreach:用于遍历集合,常用于 IN 条件。
  • bind:创建一个变量并将其绑定到上下文。
  • script:适用于在注解中使用动态 SQL(@Select@Update 等注解)

2、动态 SQL 元素

if

<if> 元素根据条件包含 SQL 片段。

choose、when、otherwise

<case> 、<choose>、 <when> 和 <otherwise> 一起使用,用于在动态 SQL 中实现条件分支逻辑,类似于编程语言中的 switch-case 结构。
<if> 的区别:
  • <if> 是独立的条件判断,所有符合条件的 <if> 都会执行
  • <choose> 内部的 <when> 是互斥的,只会执行第一个满足条件的
基本语法:
1、if-else 等效语法
2、if-else if-else 等效语法
3、在 <if> 中嵌套 <choose>
4、在 <choose> 中嵌套 <if>
通过合理嵌套 <choose> 和 <if>,可以构建出灵活且强大的动态 SQL 查询。

trim、where、set

<trim><where> 和  <set> 标签,它们可以优雅地处理 SQL 语句中的前缀、后缀以及条件判断。
  • <where>:用于 WHERE 子句,会自动删除开头的 AND 或 OR,如果所有条件都不满足,则不会生成 WHERE 关键字。
  • <set>:用于 UPDATE 语句,会自动删除结尾的逗号,如果所有条件都不满足,则不会生成 SET 子句。
  • <trim>:可以自定义前缀、后缀以及要删除的内容。它可以替代 <where> 和 <set> 标签。
    • prefix:添加前缀
    • suffix:添加后缀
    • prefixOverrides:删除匹配的前缀
    • suffixOverrides:删除匹配的后缀
示例:
1、<where> 标签使用
2、<set> 标签使用
3、<trim> 替代 <where>示例
4、<trim> 替代 <set> 示例
5、<trim> 复杂使用

foreach

<foreach> 用于在 SQL 语句中迭代集合,常用于 IN 条件语句或批量操作。
基本语法:
  • collection: 指定要迭代的集合或数组
    • 如果是 List 类型,可以使用 list 作为键
    • 如果是数组,可以使用 array 作为键
    • 如果是 Map 或自定义对象中的集合属性,直接使用属性名
  • item: 迭代时每个元素的别名
  • index: 迭代的索引(可选)
  • open: 整个循环内容开头的字符串(可选)
  • separator: 每次迭代之间的分隔符(可选)
  • close: 整个循环内容结尾的字符串(可选)
示例:
1、IN 条件查询
2、批量插入
3、批量更新
写法一:需要确保数据库支持多条语句执行(在JDBC URL中添加allowMultiQueries=true参数)
写法二:配合 CASE WHEN 语句(推荐,性能较好):

bind

<bind> 元素允许你在 OGNL 表达式以外创建一个变量,并将其绑定到当前的上下文,以便在后续的 SQL 语句中使用。主要用途:
  1. 简化复杂表达式:将复杂的 OGNL 表达式绑定到一个简单的变量名
  1. 提高 SQL 可读性:使 SQL 语句更清晰易读
  1. 避免重复计算:多次使用的表达式只需计算一次
  1. 处理数据库兼容性问题:例如不同数据库的字符串连接语法
基本语法:
  • name:绑定的变量名
  • value:基于 OGNL 的表达式,计算结果将被绑定到指定名称
示例:
1、简化模糊查询
2、处理多字段搜索
3、数据库兼容性处理
注意:
  1. <bind> 变量只在当前语句中有效
  1. 变量绑定发生在 SQL 执行前,因此不能用于动态表名、列名等

script

<script> 适用于在注解中使用动态 SQL(@Select@Update 等注解)。可以在 <script> 内使用所有 MyBatis 的动态 SQL 标签。因为 XML 映射文件本身就支持动态 SQL,所以一般不会在 XML 映射文件中使用 <script> 标签。
示例:
1、@Select 注解中使用
2、@Update 注解中使用

3、高级应用

多数据库支持

如果配置了 databaseIdProvider,你就可以在动态代码中使用名为 “_databaseId” 的变量来为不同的数据库构建特定的语句。比如下面的例子:

动态 SQL 中的插入脚本语言

MyBatis 从 3.2 版本开始支持插入脚本语言,这允许你插入一种语言驱动,并基于这种语言来编写动态 SQL 查询语句。
可以通过实现以下接口来插入一种语言:
实现自定义语言驱动后,你就可以在 mybatis-config.xml 文件中将它设置为默认语言:
或者,你也可以使用 lang 属性为特定的语句指定语言:
或者,在你的 mapper 接口上添加 @Lang 注解:
提示 可以使用 Apache Velocity 作为动态语言,更多细节请参考 MyBatis-Velocity 项目。
你前面看到的所有 xml 标签都由默认 MyBatis 语言提供,而它由语言驱动 org.apache.ibatis.scripting.xmltags.XmlLanguageDriver(别名为 xml)所提供。
JVM系列:JVM参数汇总JVM系列:SafePoint与Stop The World详解
Loading...