MyBatis 提供了以下 9 种动态 SQL 标签,它们用于在 XML 映射文件中编写动态 SQL 语句:
-
<trim>
:通过修剪 SQL 语句的开头和结尾来动态生成 SQL 片段。它可以用于去除不必要的 SQL 关键字或条件语句,并提供了一些属性来定义修剪规则。 -
<where>
:用于在生成的 SQL 语句中添加 WHERE 子句。它可以自动处理条件语句的前缀,并在有条件语句存在时添加 WHERE 关键字。 -
<set>
:用于在生成的 SQL 语句中添加 SET 子句。它主要用于更新操作,可以根据条件来动态生成需要更新的列。 -
<foreach>
:用于在生成的 SQL 语句中进行循环操作。它可以遍历集合或数组,并根据指定的模板将集合元素或数组元素插入到 SQL 语句中。 -
<if>
:用于在生成的 SQL 语句中添加条件判断。可以根据指定的条件决定是否包含某个 SQL 语句片段。 -
<choose>
:类似于 Java 中的 switch 语句,根据条件选择执行不同的 SQL 语句片段。它可以包含多个<when>
和一个可选的<otherwise>
标签。 -
<when>
:用于在<choose>
标签中定义条件分支。可以根据指定的条件判断是否执行特定的 SQL 语句片段。 -
<otherwise>
:在<choose>
标签中可选的标签,用于定义当没有任何<when>
条件匹配时执行的 SQL 语句片段。 -
<bind>
:用于将表达式的结果绑定到一个变量上。可以在 SQL 语句中使用这个变量,避免重复计算表达式。
这些动态 SQL 标签在 MyBatis 中提供了灵活的查询和更新操作的能力,可以根据不同的条件动态生成 SQL 语句,使 SQL 映射文件更具可读性和可维护性。
在 MyBatis 中使用这些动态 SQL 标签的方法如下:
-
<trim>
标签示例:<trim prefix="WHERE" prefixOverrides="AND |OR "> ... </trim> ``` 这个示例中,`<trim>` 标签用于修剪生成的 SQL 片段的开头和结尾。`prefix` 属性定义了修剪后添加的前缀,`prefixOverrides` 属性定义了要移除的前缀。
-
<where>
标签示例:<select id="getUserList" resultType="User"> SELECT * FROM users <where> <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </where> </select> ``` 在这个示例中,`<where>` 标签用于在生成的 SQL 语句中添加 WHERE 子句。`<if>` 标签用于根据条件判断是否包含特定的 SQL 语句片段。
-
<set>
标签示例:<update id="updateUser" parameterType="User"> UPDATE users <set> <if test="name != null"> name = #{name}, </if> <if test="age != null"> age = #{age}, </if> </set> WHERE id = #{id} </update> ``` 在这个示例中,`<set>` 标签用于在生成的 SQL 语句中添加 SET 子句。`<if>` 标签用于根据条件判断是否包含特定的更新语句片段。
-
<foreach>
标签示例:<select id="getUserByIdList" resultType="User"> SELECT * FROM users WHERE id IN <foreach collection="idList" item="id" open="(" separator="," close=")"> #{id} </foreach> </select> ``` 这个示例中,`<foreach>` 标签用于在生成的 SQL 语句中进行循环操作。`collection` 属性指定了要遍历的集合或数组,`item` 属性指定了集合元素或数组元素的变量名。
-
<if>
标签示例:<select id="getUserByNameAndAge" resultType="User"> SELECT * FROM users WHERE 1=1 <if test="name != null"> AND name = #{name} </if> <if test="age != null"> AND age = #{age} </if> </select> ``` 在这个示例中,`<if>` 标签用于根据条件判断是否包含特定的 SQL 语句片段。
-
<choose>
、<when>
和<otherwise>
标签示例:<select id="getUserByCondition" resultType="User"> SELECT * FROM users <choose> <when test="name != null"> WHERE name = #{name} </when> <when test="age != null"> WHERE age = #{age} </when> <otherwise> WHERE 1=1 </otherwise> </choose> </select> ``` 在这个示例中,`<choose>` 标签类似于 Java 中的 switch 语句,根据条件选择执行不同的 SQL 语句片段。`<when>` 标签用于定义条件分支,`<otherwise>` 标签定义了当没有任何条件匹配时执行的 SQL 语句片段。
-
<bind>
标签示例:<select id="getUserByAgeRange" resultType="User"> <bind name="minAge" value="20"/> <bind name="maxAge" value="30"/> SELECT * FROM users WHERE age >= #{minAge} AND age <= #{maxAge} </select> ``` 在这个示例中,`<bind>` 标签用于将表达式的结果绑定到一个变量上。在 SQL 语句中可以使用这个变量来避免重复计算表达式。
以上是对这些动态 SQL 标签在 MyBatis 中的基本使用示例。通过合理地组合和嵌套这些标签,你可以根据需要生成灵活的动态 SQL 语句,以满足不同的查询和更新需求。