在 MyBatis 中,动态 SQL 是构建灵活且高效的 SQL 语句的重要工具。通过使用动态 SQL 标签,开发者可以根据不同的条件动态生成 SQL 语句的各个部分,从而避免手动拼接字符串带来的复杂性和潜在的错误。MyBatis 提供了一系列动态 SQL 标签,下面将详细介绍这些标签及其相关语法。
1. <if>
标签
用途
根据条件判断是否包含某部分 SQL 片段。
属性
test
:一个 OGNL 表达式,用于判断是否包含该部分 SQL。
语法示例
<select id="selectUsers" parameterType="map" resultType="com.example.User">
SELECT id, username, email
FROM users
WHERE 1=1
<if test="username != null">
AND username = #{username}
</if>
<if test="email != null">
AND email = #{email}
</if>
</select>
解释
- 当
username
或email
参数不为null
时,相应的条件将被包含在 SQL 语句中。 1=1
是一个常用的技巧,用于简化后续条件的拼接,避免首个条件前需要特殊处理。
2. <choose>
, <when>
, <otherwise>
标签
用途
类似于 Java 的 switch
语句,根据多个条件选择其中一个执行。
属性
<choose>
:包含多个<when>
和一个<otherwise>
标签。<when>
:定义具体的条件,包含test
属性。<otherwise>
:定义默认的 SQL 片段,当所有<when>
条件都不满足时执行。
语法示例
<select id="selectUsersByCondition" parameterType="map" resultType="com.example.User">
SELECT id, username, email
FROM users
WHERE
<choose>
<when test="username != null">
username = #{username}
</when>
<when test="email != null">
email = #{email}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</select>
解释
- 如果
username
不为null
,则按username
查询。 - 否则,如果
email
不为null
,则按email
查询。 - 如果以上条件都不满足,则返回所有记录(
1=1
)。
3. <trim>
标签
用途
用于动态添加或删除 SQL 片段的前缀、后缀及指定的前缀/后缀。
属性
prefix
:添加到修剪后的 SQL 片段前。prefixOverrides
:要去除的前缀(如AND
、OR
)。suffix
:添加到修剪后的 SQL 片段后。suffixOverrides
:要去除的后缀。
语法示例
<select id="selectUsersWithTrim" parameterType="map" resultType="com.example.User">
SELECT id, username, email
FROM users
<trim prefix="WHERE" prefixOverrides="AND |OR ">
<if test="username != null">
AND username = #{username}
</if>
<if test="email != null">
OR email = #{email}
</if>
</trim>
</select>
解释
- 自动添加
WHERE
关键字。 - 去除多余的
AND
或OR
前缀,确保生成的 SQL 语句语法正确。
4. <where>
标签
用途
自动添加 WHERE
关键字,并去除多余的 AND
或 OR
。
属性
- 无需特定属性,通常结合
<if>
标签使用。
语法示例
<select id="selectUsersWithWhere" parameterType="map" resultType="