MyBatis 中的动态 SQL 标签提供了一种强大的方式来根据不同的条件动态生成 SQL 语句,增强了 SQL 语句的灵活性和可维护性。以下是一些主要的动态 SQL 标签的讲解:
<if>
标签:
- 用途:用于进行条件判断。如果满足指定的条件,就会将
<if>
标签内部的 SQL 片段添加到最终生成的 SQL 语句中。 - 语法:
<if test="条件表达式">SQL 片段</if>
。 - 示例:
<select id="selectUsers" resultType="User"> SELECT * FROM users <if test="username!= null"> WHERE username = #{username} </if> </select>
在这个例子中,如果传入的参数
username
不为null
,那么就会在生成的 SQL 语句中添加WHERE username = #{username}
这个条件。
<choose>
、<when>
、<otherwise>
标签组合:
- 用途:类似于 Java 中的
switch
语句。可以根据不同的条件选择不同的 SQL 片段执行。 - 语法:
<select id="selectUsers" resultType="User"> SELECT * FROM users <choose> <when test="condition1">SQL 片段 1</when> <when test="condition2">SQL 片段 2</when> <otherwise>默认 SQL 片段</otherwise> </choose> </select>
示例:假设根据不同的角色来查询用户,若角色为 “admin” 则查询所有管理员用户,若角色为 “user” 则查询普通用户,否则查询所有用户。
<select id="selectUsersByRole" resultType="User"> SELECT * FROM users <choose> <when test="role == 'admin'"> WHERE role = 'admin' </when> <when test="role == 'user'"> WHERE role = 'user' </when> <otherwise> WHERE 1 = 1 </otherwise> </choose> </select>
<where>
标签: - 用途:用于自动添加
WHERE
关键字,并处理条件中多余的AND
或OR
。如果<where>
标签内部的条件都不满足,它会忽略整个WHERE
子句。 - 语法:
<where>条件 SQL 片段</where>
。 - 示例:
<select id="selectUsersWithConditions" resultType="User"> SELECT * FROM users <where> <if test="username!= null"> AND username = #{username} </if> <if test="age > 0"> AND age = #{age} </if> </where> </select>
在这个例子中,如果传入的参数既没有
username
也没有指定age
,那么最终生成的 SQL 语句中不会包含WHERE
子句。
<set>
标签:
- 用途:用于动态地构建
UPDATE
语句中的SET
子句。它会自动处理多余的逗号,并在条件不满足时忽略整个SET
子句。 - 语法:
<set>设置 SQL 片段</set>
。 - 示例:
<update id="updateUser" parameterType="User"> UPDATE users <set> <if test="username!= null"> username = #{username}, </if> <if test="age > 0"> age = #{age}, </if> </set> WHERE id = #{id} </update>
在这个例子中,如果传入的
User
对象的username
或age
属性为null
,那么在生成的UPDATE
语句中就不会包含对应的设置项。
<foreach>
标签:
- 用途:用于循环遍历集合,并根据集合中的元素动态生成 SQL 片段。通常用于构建
IN
条件或批量插入、更新等操作。 - 语法:
<foreach collection="集合参数" item="元素变量名" separator="分隔符" open="开头字符" close="结尾字符">SQL 片段</foreach>
。 - 示例:
<select id="selectUsersByIds" resultType="User"> SELECT * FROM users WHERE id IN <foreach collection="ids" item="id" separator="," open="(" close=")"> #{id} </foreach> </select>
在这个例子中,如果传入一个包含多个用户 ID 的集合,
<foreach>
标签会动态生成一个IN
条件的 SQL 片段。
<trim>
标签:
- 用途:可以自定义在 SQL 片段的开头和结尾添加或删除特定的字符。可以用于替代
<where>
和<set>
标签在某些复杂场景下的使用。 - 语法:
<trim prefix="开头添加的字符" suffix="结尾添加的字符" prefixOverrides="开头删除的字符" suffixOverrides="结尾删除的字符">SQL 片段</trim>
。 - 示例:
<select id="selectUsersWithTrim" resultType="User"> SELECT * FROM users <trim prefix="WHERE" suffix="" prefixOverrides="AND |OR"> <if test="username!= null"> AND username = #{username} </if> <if test="age > 0"> OR age = #{age} </if> </trim> </select>
在这个例子中,
<trim>
标签会根据条件动态添加WHERE
关键字,并处理开头多余的AND
或OR
。
这些动态 SQL 标签使得 MyBatis 在处理复杂的数据库查询和操作时更加灵活和强大,可以根据不同的条件动态生成合适的 SQL 语句,提高了代码的可维护性和可扩展性。