MyBatis 提供了丰富的动态标签,这些标签能让开发者根据不同的条件动态生成 SQL 语句,极大地增强了 SQL 语句的灵活性和可维护性。以下是对 MyBatis 中常见动态标签的详细讲解:
1. <if>
标签
- 功能:
<if>
标签是最基础且常用的动态标签,它用于条件判断。根据传入参数的不同情况,决定是否将某部分 SQL 语句添加到最终生成的 SQL 中。 - 使用方式:通过
test
属性指定一个 OGNL(对象图导航语言)表达式,当该表达式的结果为true
时,<if>
标签内的 SQL 语句会被包含在最终的 SQL 里;若为false
,则这部分 SQL 会被忽略。 - 2.
<choose>
、<when>
和<otherwise>
标签 - 功能:这组标签组合起来的作用类似于 Java 中的
switch - case - default
语句。<choose>
标签是外层标签,内部可以包含多个<when>
标签和一个可选的<otherwise>
标签。MyBatis 会按顺序检查每个<when>
标签的条件,一旦某个<when>
标签的条件成立,就会执行该<when>
标签内的 SQL 语句,并且不再检查后续的<when>
标签和<otherwise>
标签。若所有<when>
标签的条件都不成立,则执行<otherwise>
标签内的 SQL 语句。 - 使用方式:每个
<when>
标签都有一个test
属性,用于指定条件判断的 OGNL 表达式;<otherwise>
标签无需指定条件。 -
3.
<where>
标签 - 功能:在动态 SQL 中,当使用多个
<if>
标签组合查询条件时,可能会出现WHERE
子句中AND
或OR
关键字多余的问题。<where>
标签的作用就是自动处理这种情况,它会智能地添加WHERE
关键字,并且去除多余的AND
或OR
关键字。 - 使用方式:将需要动态生成条件的
<if>
等标签放在<where>
标签内部。 -
4.
<set>
标签 - 功能:主要用于动态更新语句(
UPDATE
)中,它的作用类似于<where>
标签,会自动处理SET
子句中的逗号(,
),去除多余的逗号,确保 SQL 语句的正确性。 - 使用方式:将需要动态更新的字段和值的
<if>
等标签放在<set>
标签内部。 -
5.
<foreach>
标签 - 功能:用于遍历集合(如
List
、Set
等)或数组,将集合或数组中的元素逐个取出,生成动态的 SQL 语句。常用于IN
条件查询或批量插入等操作。 - 使用方式:需要指定几个重要的属性,包括
collection
(指定要遍历的集合或数组)、item
(指定集合或数组中每个元素的别名)、open
(指定遍历开始时的字符串)、close
(指定遍历结束时的字符串)、separator
(指定元素之间的分隔符)。 -
6.
<trim>
标签 - 功能:
<trim>
标签是一个通用的动态 SQL 标签,它可以自定义前缀、后缀以及需要去除的前缀和后缀字符串。<where>
和<set>
标签其实都是基于<trim>
标签实现的。 - 使用方式:通过
prefix
属性指定要添加的前缀,suffix
属性指定要添加的后缀,prefixOverrides
属性指定要去除的前缀字符串,suffixOverrides
属性指定要去除的后缀字符串。