一、动态 SQL 标签
MyBatis 提供了一系列标签来处理动态 SQL,它们能够根据传入的参数生成不同的 SQL 语句。这些标签包括:
1. **`<if>` 标签**
`<if>` 标签用于根据条件判断是否包含某段 SQL 语句。可以使用它来实现动态拼接 SQL。
```xml
<select id="findUsers" 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>
```
在上面的例子中,只有当 `name` 或 `age` 参数不为空时,相关的 SQL 片段才会被拼接到最终的查询语句中。
2. **`<choose>`、`<when>` 和 `<otherwise>` 标签**
这些标签用于实现类似于 `switch-case` 的逻辑选择。
<select id="findUsersByCondition" resultType="User">
SELECT * FROM users WHERE 1=1
<choose>
<when test="name != null">
AND name = #{name}
</when>
<when test="age != null">
AND age = #{age}
</when>
<otherwise>
AND status = 'active'
</otherwise>
</choose>
</select>
在上面的例子中,MyBatis 会选择第一个满足条件的 `<when>` 块。如果没有任何 `<when>` 条件满足,则会执行 `<otherwise>` 块。
3. **`<trim>` 标签**
`<trim>` 标签用于在动态 SQL 中添加或删除特定的前缀或后缀。
<update id="updateUser">
UPDATE users
<set>
<trim suffixOverrides=",">
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</trim>
</set>
WHERE id = #{id}
</update>
`<trim>` 标签在这里用于去除最后多余的逗号。
4. **`<set>` 标签**
`<set>` 标签用于动态地生成 `SET` 子句,在构造 `UPDATE` 语句时特别有用。
<update id="updateUser">
UPDATE users
<set>
<if test="name != null">name = #{name},</if>
<if test="age != null">age = #{age},</if>
</set>
WHERE id = #{id}
</update>
`<set>` 标签会自动去除 `SET` 语句中最后多余的逗号。
5. **`<where>` 标签**
`<where>` 标签用于处理 `WHERE` 子句的动态生成。如果内部的条件没有生成任何内容,则 `WHERE` 子句不会被包含。此外,它还会自动处理 AND/OR 的前置情况。
<select id="findUsers" 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` 子句;如果有多个条件满足,`<where>` 会自动添加 `AND` 关键字。
6. **`<foreach>` 标签**
`<foreach>` 标签用于遍历集合,生成一系列的 SQL 片段,通常用于处理 `IN` 子句或批量插入操作。
<select id="findUsersByIds" resultType="User">
SELECT * FROM users WHERE id IN
<foreach item="id" collection="idList" open="(" separator="," close=")">
#{id}
</foreach>
</select>
`<foreach>` 标签会遍历 `idList` 集合,将每个 `id` 插入到 SQL 中。
二、参数映射与结果映射标签
MyBatis 提供了一些标签用于自定义 SQL 参数的传递和结果的映射处理。
1. **`<resultMap>` 标签**
`<resultMap>` 标签是 MyBatis 中非常强大且常用的标签,用于定制查询结果集到 Java 对象的映射。它允许你更精细地控制结果集的映射,包括嵌套映射、复杂对象结构等。
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
</resultMap>
<select id="findUserById" resultMap="userResultMap">
SELECT * FROM users WHERE id = #{id}
</select>
在这个例子中,`<resultMap>` 定义了如何将 SQL 查询的结果映射到 `User` 对象中。
2. **`<parameterMap>` 标签**(已过时)
`<parameterMap>` 是 MyBatis 的早期版本中用于参数映射的标签,但它已经过时并且在现代 MyBatis 开发中很少使用。通常建议使用参数类型直接在 SQL 标签中定义,例如 `parameterType="java.lang.Integer"`。
3. **`<association>` 和 `<collection>` 标签**
这些标签用于在 `resultMap` 中定义复杂的映射关系,如一对一和一对多关系。
-
**`<association>`**:用于映射一对一关系。
-
**`<collection>`**:用于映射一对多关系。
<resultMap id="userResultMap" type="User"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="age" column="age"/> <association property="address" javaType="Address"> <id property="id" column="address_id"/> <result property="street" column="street"/> </association> </resultMap>
在这个例子中,`<association>` 用于将 `address` 映射到 `User` 对象的一个嵌套属性上。
三、SQL 片段重用标签
为了减少重复的 SQL 代码,MyBatis 提供了一些标签,用于定义和重用 SQL 片段。
1. **`<sql>` 标签**
`<sql>` 标签用于定义可以在多个地方重用的 SQL 片段。你可以在一个 `<sql>` 中定义公共的 SQL 语句,然后在其他地方引用它。
<sql id="userColumns">
id, name, age, address
</sql>
<select id="findAllUsers" resultType="User">
SELECT
<include refid="userColumns"/>
FROM users
</select>
2. **`<include>` 标签**
`<include>` 标签用于在 SQL 语句中引用由 `<sql>` 标签定义的 SQL 片段。
<select id="findUserById" resultType="User">
SELECT
<include refid="userColumns"/>
FROM users WHERE id = #{id}
</select>
四、其他常用标签
1. **`<bind>` 标签**
`<bind>` 标签用于创建一个新的绑定变量,可以在 SQL 语句中引用。这个功能在需要处理复杂的表达式或避免重复计算时非常有用。
<select id="findUsersByNameLike" resultType="User">
<bind name="pattern" value="'%' + name + '%'" />
SELECT * FROM users WHERE name LIKE #{pattern}
</select>
在这个例子中,`<bind>` 标签用于创建一个新的绑定变量 `pattern`,并在后续的 SQL 语句中使用它。
2. **`<cache>` 和 `<cache-ref>` 标签**
MyBatis 支持二级缓存,`<cache>` 标签用于在映射文件中配置缓存。
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
`<cache-ref>` 标签用于引用另一个命名空间中的缓存配置,允许多个映射文件共享同一个缓存配置。
<cache-ref namespace="com.example.mapper.UserMapper"/>
五、总结
常见的XML映射文件标签如下:
<mapper>
:定义一个映射文件。<resultMap>
:定义一个结果映射。<result>
:定义一个查询结果的映射关系。<select>
:定义一个查询语句。<insert>
:定义一个插入语句。<update>
:定义一个更新语句。<delete>
:定义一个删除语句。<include>
:引入其他的映射文件或者语句片段。<association>
:定义一个关联对象的映射关系。<collection>
:定义一个集合对象的映射关系。<if>
:条件判断标签。<choose>
:选择标签,根据条件选择执行其中的一个分支。<when>
:<choose>
标签中的分支条件判断。<otherwise>
:<choose>
标签中的默认分支。<trim>
:动态拼接SQL语句时去除多余的逗号或者其他标点符号。<set>
:动态拼接更新语句时使用。<foreach>
:用于循环遍历集合,并将集合中的元素拼接到SQL语句中。<bind>
:用于在SQL语句中绑定一个变量。<sql>
:定义一个可复用的语句片段。<include>
:引用其他的语句片段。
、