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

相关推荐
nbsaas-boot几秒前
探索 JSON 数据在关系型数据库中的应用:MySQL 与 SQL Server 的对比
数据库·mysql·json
cmdch20172 分钟前
Mybatis加密解密查询操作(sql前),where要传入加密后的字段时遇到的问题
数据库·sql·mybatis
程序员学习随笔4 分钟前
PostgreSQL技术内幕21:SysLogger日志收集器的工作原理
数据库·postgresql
Sun_12_24 分钟前
SQL注入(SQL lnjection Base)21
网络·数据库
秦时明月之君临天下5 分钟前
PostgreSQL标识符长度限制不能超过63字节
数据库·postgresql
woshilys7 分钟前
sql server 备份恢复
数据库·sqlserver
CodeCraft Studio7 分钟前
【实用技能】如何在 SQL Server 中处理 Null 或空值?
数据库·oracle·sqlserver
武汉联从信息16 分钟前
浅谈ORACLE中间件SOA BPM,IDM,OID,UCM,WebcenterPortal服务器如何做迁移切换
oracle
撒呼呼27 分钟前
# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)
数据库·spring boot·spring·mvc·springboot
程序员shen16161134 分钟前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法