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>:引用其他的语句片段。

相关推荐
齐 飞30 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
云空31 分钟前
《Python 与 SQLite:强大的数据库组合》
数据库·python·sqlite
暮毅35 分钟前
10.Node.js连接MongoDb
数据库·mongodb·node.js
wowocpp38 分钟前
ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS
服务器·数据库·ubuntu
成富1 小时前
文本转SQL(Text-to-SQL),场景介绍与 Spring AI 实现
数据库·人工智能·sql·spring·oracle
songqq271 小时前
SQL题:使用hive查询各类型专利top 10申请人,以及对应的专利申请数
数据库·sql
计算机学长felix1 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
小码的头发丝、2 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Karoku0662 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
周全全3 小时前
MySQL报错解决:The user specified as a definer (‘root‘@‘%‘) does not exist
android·数据库·mysql