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 语句中使用。主要用途:- 简化复杂表达式:将复杂的 OGNL 表达式绑定到一个简单的变量名
- 提高 SQL 可读性:使 SQL 语句更清晰易读
- 避免重复计算:多次使用的表达式只需计算一次
- 处理数据库兼容性问题:例如不同数据库的字符串连接语法
基本语法:
name
:绑定的变量名
value
:基于 OGNL 的表达式,计算结果将被绑定到指定名称
示例:
1、简化模糊查询
2、处理多字段搜索
3、数据库兼容性处理
注意:
<bind>
变量只在当前语句中有效
- 变量绑定发生在 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
)所提供。- Author:mcbilla
- URL:http://mcbilla.com/article/20f85c7d-7c1d-8024-9002-f29b0afbd0ae
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!