Xml 映射文件中常见的标签

一、动态 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映射文件标签如下:

  1. &lt;mapper>:定义一个映射文件。
  2. &lt;resultMap>:定义一个结果映射。
  3. &lt;result>:定义一个查询结果的映射关系。
  4. &lt;select>:定义一个查询语句。
  5. &lt;insert>:定义一个插入语句。
  6. &lt;update>:定义一个更新语句。
  7. &lt;delete>:定义一个删除语句。
  8. &lt;include>:引入其他的映射文件或者语句片段。
  9. &lt;association>:定义一个关联对象的映射关系。
  10. &lt;collection>:定义一个集合对象的映射关系。
  11. &lt;if>:条件判断标签。
  12. &lt;choose>:选择标签,根据条件选择执行其中的一个分支。
  13. &lt;when>&lt;choose>标签中的分支条件判断。
  14. &lt;otherwise>&lt;choose>标签中的默认分支。
  15. &lt;trim>:动态拼接SQL语句时去除多余的逗号或者其他标点符号。
  16. &lt;set>:动态拼接更新语句时使用。
  17. &lt;foreach>:用于循环遍历集合,并将集合中的元素拼接到SQL语句中。
  18. &lt;bind>:用于在SQL语句中绑定一个变量。
  19. &lt;sql>:定义一个可复用的语句片段。
  20. &lt;include>:引用其他的语句片段。

相关推荐
王小小鸭3 分钟前
【开发小技巧11】用经典报表实现badge list效果,根据回显内容用颜色加以区分
oracle·oracle apex
大白要努力!3 分钟前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix1 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98763 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发