Xml 映射文件中常见的标签

devtools/2025/1/15 18:08:45/

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


http://www.ppmy.cn/devtools/105666.html

相关文章

iOS 中,用户点击一个按钮到响应的全部流程

在 iOS 中&#xff0c;当用户点击一个按钮&#xff08;或其他 UI 控件&#xff09;时&#xff0c;会触发一系列复杂的操作流程&#xff0c;从硬件到软件&#xff0c;再到应用层的事件处理。以下是从用户点击一个按钮到应用响应的完整流程&#xff1a; 硬件层&#xff1a;触摸事…

Java导出图片到excel

1、例如你有这样一个集合&#xff0c;具体结合你的业务场景 Data public class Student {/*** 姓名*/private String xh;/*** 学号*/private String xm;/*** 照片*/private byte[] zp; }2、相关代码 RequestMapping(value "/quereImgByPkid/{pkid}",method Requ…

C++ 满足某些条件可以当成rust 用

c 内存安全性较差&#xff0c;但是满足某些条件其实也挺安全的 1.所有堆上分配的内存包裹在容器里&#xff0c;弃用指针。感觉容器的栈挂堆&#xff08;stack point to heap&#xff09;的结构就是和rust学的 2.灵活使用std::move()转移所有权(ownership)提高效率。 3.引用注意…

2.SpringBoot项目pom.xml文件配置

1.pom.xml示例&#xff08;初始项目创建时生成&#xff09; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schem…

VS2022使用指定的LLVM版本

LLVM下载地址&#xff1a;Releases llvm/llvm-project GitHub LLVM/Clang toolsets for Visual Studio 2022, 2019, 2017, 2015, 2013, 2012 and 2010. GitHub - zufuliu/llvm-utils: LLVM/Clang toolsets for Visual Studio 2022, 2019, 2017, 2015, 2013, 2012 and 2010.…

Docker 数据卷管理及优化

目录 1 数据卷实现的目的 2 为什么要用数据卷 3 docker的两种数据卷 3.1 bind mount 数据卷 实践实例&#xff1a; 3.2 docker managed 数据卷 实验实例&#xff1a; 3.3 bind mount 数据卷和docker managed 数据卷的对比 3.3.1 相同点&#xff1a; 3.3.2 不同点&#xff1a; …

设计模式 18 备忘录模式

设计模式 18 创建型模式&#xff08;5&#xff09;&#xff1a;工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式结构型模式&#xff08;7&#xff09;&#xff1a;适配器模式、桥接模式、组合模式、装饰者模式、外观模式、享元模式、代理模式行为型模式&#xff…

DPDK基础入门(二):Cache与大页优化

Cache简介 目前Cache主要由三级组成: L1 Cache, L2 Cache和Last Level Cache(LLC)。 L1最快&#xff0c;但容量小&#xff0c;可能只有几十KB。LLC慢&#xff0c;但容量大&#xff0c;可能多达几十MB。 L1和L2 Cache一般集成在CPU内部。另外,&#xff0c;L1和L2 Cache是每个处…