Mybatis中resultMap的基础配置

本文深入探讨MyBatis中的resultMap元素,解释其如何简化从数据库结果集中抽取数据的过程,并介绍resultType与resultMap的区别。通过具体配置示例,详细讲解constructor、id、result、association、collection及discriminator等关键节点的应用。
一、概述
resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西,而且在一些情形下允许你做一些 JDBC 不支持的事情。事实上,编写相似于对复杂语句联合映射这些等同的代码,也许可以跨过上千行的代码。ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
resultType和resultMap的关系:
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

二、配置详解
1、可配置情况
<resultMap>
        <constructor>
            <idArg/>
            <arg/>
        </constructor>
        <id/>
        <result/>
        <association property=""/>
        <collection property=""/>
        <discriminator javaType="">
            <case value=""></case>
        </discriminator>
</resultMap>


节点简介:
constructor – 类在实例化时,用来注入参数值到构造方法中。
idArg – ID 参数;标记结果作为 ID 可以帮助提高整体效能。
arg – 注入到构造方法的一个普通参数。
id – 一个 ID 结果; 标记结果作为 ID 可以帮助提高整体效能。
result – 注入到字段或 JavaBean 属性的普通参数。
association – 一个复杂的类型关联;许多结果将包成这种类型。
collection – 复杂类型的集合。
discriminator – 使用参数值来决定使用哪个参数来进行映射。
case – 基于某些值的结果映射。


2、constructor
构造方法注入允许你在初始化时为类设置属性的值,而不用暴露出公有方法。 MyBatis 也支持私有属性和私有 JavaBeans 属性来达到这个目的,但是一些人更青睐构造方法注入。 Constructor( 构造方法)元素支持这个。默认情况下mybatis会调用实体类的无参构造方法创建一个实体类,然后再给各个属性赋值,但是有的时候我们可能为实体类生成了有参的构造方法,并且也没有给该实体类生成无参的构造方法,这个时候如果不做特殊配置,resultMap在生成实体类的时候就会报错,因为它没有找到无参构造方法。
使用示例:
假设User实体类的构造方法如下:
public User(Long id, String username, String password, String address) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.address = address;
    }

在resultMap中配置constructor节点,如下:
<resultMap id="userResultMap" type="com.kang.pojo.User">
        <constructor>
            <idArg column="id" javaType="long"/>
            <arg column="username" javaType="string"/>
            <arg column="password" javaType="string"/>
            <arg column="address" javaType="string"/>
        </constructor>
</resultMap>
在constructor中指定相应的参数,这样resultMap在构造实体类的时候就会按照这里的指定的参数寻找相应的构造方法去完成了。


3、id, result
这两个属性是结果映射最基本内容。 id 和 result 都映射一个单独列的值到简单数据类型(字符
串,整型,双精度浮点数,日期等)的单独属性或字段。
这两者之间的唯一不同是 id 表示的结果将是当比较对象实例时用到的标识属性。这帮
助来改进整体表现,特别是缓存和嵌入结果映射(也就是联合映射)。
使用示例:
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
其中的property表示映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的 JavaBeans的属性,那么就会使用。否则 MyBatis 将会寻找给定名称。的字段。这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一些东西:“ username”,或者映射到一些复杂的东西:“ address.street.number”。
column表示从数据库中得到的列名,或者是列名的重命名标签。


4、association和collection
association是mybatis支持级联的一部分,我们知道在级联中有一对一、一对多、多对多等关系,association主要是用来解决一对一关系的,collection是用来解决一对多级联的。这里先不做详述,待梳理到关联查询时再详细叙述。


5、discriminator
discriminator既不是一对多也不是一对一,这个我们称之为鉴别器级联,使用它我们可以在不同的条件下执行不同的查询匹配不同的实体类。鉴别器非常容易理解,因为它的表现很像 Java 语言中的 switch 语句。
定义鉴别器需要指定了 column 和 javaType 属性。column表示用数据表的哪一个字段参与比较, JavaType是参与比较的字段类型。
比如:
<resultMap id="vehicleResult" type="Vehicle">
<id property=”id” column="id" />
<result property="vin" column="vin"/>
<result property="year" column="year"/>
<result property="make" column="make"/>
<result property="model" column="model"/>
<result property="color" column="color"/>
<discriminator javaType="int" column="vehicle_type">
<case value="1" resultMap="carResult"/>
<case value="2" resultMap="truckResult"/>
<case value="3" resultMap="vanResult"/>
<case value="4" resultMap="suvResult"/>
</discriminator>
</resultMap>

在这个示例中,MyBatis 会从结果集中得到每条记录,然后比较它的 vehicle 类型的值。如果它匹配任何一个鉴别器的实例,那么就使用这个实例指定的结果映射。 



转载于:https://www.cnblogs.com/kangsir/p/6653216.html

<think> 首先,用户的问题是关于MyBatisResultMap中的属性。用户想了解MyBatis ResultMap中的属性介绍。 我需要参考用户提供的引用内容,这些引用是关于MyBatisResultMap的: - 引用[1]:描述了resultMap用于处理复杂数据映射,提高灵活性和可维护性。 - 引用[2]:详细解释了resultMap元素的属性,如id和type,以及子元素id、result、association、collection。 - 引用[3]:展示了resultMap的基本用法,包括<id>和<result>标签的property和column属性。 - 引用[4]:介绍了collection标签的使用,包括property、ofType等参数。 用户的上一次问题是:"我想了解MyBatisResultMap中的属性 请问MyBatis ResultMap中的属性介绍",这很直接。我的回答需要结构清晰,帮助用户逐步解决问题。 系统指令要求: - 使用中文回答。 - 结构清晰,帮助用户逐步解决问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 生成相关问题。 此外,对于数学表达式格式有要求,但在这个上下文中,可能不涉及数学表达式,所以我可以忽略那部分,除非必要。 回答结构: 1. **介绍ResultMap**:简要解释ResultMap是什么及其作用。 2. **主要属性介绍**:基于引用,详细介绍ResultMap属性: - id:映射规则集的唯一标识。 - type:映射的结果类型。 3. **子元素介绍**:ResultMap包含的子元素: - id:映射主键字段。 - result:映射普通字段。 - association:用于一对一关联。 - collection:用于一对多关联。 每个子元素都有其属性,如property、column等。 4. **用法示例**:提供简单的代码示例来展示如何使用。 5. **引用标识**:在适当的地方添加引用[^1], [^2]等。 6. **生成相关问题**:在回答结束时,添加相关问题。 引用来源: - [^1] 来自引用[1] - [^2] 来自引用[2] - [^3] 来自引用[3] - [^4] 来自引用[4] 我将参考这些内容来构建回答。 大纲: - 开头:介绍ResultMap。 - 主体:分点介绍属性和子元素。 - 结尾:总结并添加相关问题。 确保回答真实可靠,基于提供的引用。 </think> ### MyBatis ResultMap 属性详解 在 MyBatis 框架中,`resultMap` 是用于处理数据库结果集与 Java 对象之间映射的核心元素。它能灵活应对字段命名不一致、复杂关联关系(如一对一或一对多)等场景,显著提升数据访问层的可维护性和灵活性[^1][^2]。下面我将逐步介绍 `resultMap` 的主要属性及其用法,确保内容基于可靠的引用来源。 #### 1. **resultMap 元素的基本属性** `resultMap` 标签定义在 Mapper XML 文件中,包含以下几个核心属性: - **id**:映射规则集的唯一标识符。在 `select` 语句中通过 `resultMap` 属性引用此 ID,以应用映射规则。例如,`<select resultMap="UserResultMap">`。[^2] - **type**:指定映射的目标 Java 类型(通常是实体类的全限定名)。例如,`type="com.example.User"` 表示将结果集映射到 `User` 类的实例。[^2][^3] 这些属性确保了映射规则的唯一性和类型安全性,是 `resultMap` 的基础配置。 #### 2. **resultMap 的子元素及其属性** `resultMap` 包含多个子元素,用于定义字段到属性的具体映射。每个子元素都有特定属性,以下是关键介绍: - **`<id>` 元素**:映射数据库主键字段到 Java 对象的标识属性。 - **property**:指定 Java 对象中的属性名(如 `userId`)。 - **column**:指定数据库表中的字段名(如 `user_id`)。 - **作用**:提升 MyBatis 性能(尤其在缓存和嵌套映射中),因为它标识了对象的唯一性[^2][^3]。 ```xml <resultMap id="UserResultMap" type="User"> <id property="userId" column="user_id"/> <!-- 主键映射 --> </resultMap> ``` - **`<result>` 元素**:映射普通字段(非主键)。 - **property** 和 **column**:与 `<id>` 类似,分别映射 Java 属性名和数据库字段名。 - **作用**:处理简单数据类型映射,例如字符串或整数。[^2][^3] ```xml <resultMap id="UserResultMap" type="User"> <result property="userName" column="user_name"/> <!-- 普通字段映射 --> </resultMap> ``` - **`<association>` 元素**:处理“一对一”关联关系(如用户关联角色)。 - **property**:指定 Java 对象中的复杂属性名(如 `role`)。 - **javaType**:指定该属性的 Java 类型。 - **作用**:用于嵌套映射另一个 JavaBean,支持结果集合并。[^2][^3] ```xml <association property="role" javaType="Role"> <id property="roleId" column="role_id"/> <result property="roleName" column="role_name"/> </association> ``` - **`<collection>` 元素**:处理“一对多”关联关系(如用户关联多个商品)。 - **property**:指定 Java 对象中的集合属性名(如 `goodsList`)。 - **ofType**:指定集合内元素的 Java 类型(如 `Goods`)。 - **注意**:避免字段名冲突(例如,如果多个表有 `id` 字段,需使用 SQL 别名 `as` 区分)。[^2][^4] ```xml <collection property="goodsList" ofType="Goods"> <id property="goodId" column="good_id"/> <result property="goodName" column="good_name"/> </collection> ``` #### 3. **自动映射行为与最佳实践** MyBatis 支持三种自动映射行为(通过 `autoMappingBehavior` 配置): - **NONE**:禁用自动映射,完全依赖 `resultMap` 定义。 - **PARTIAL**:默认值,仅自动映射未在 `resultMap` 中定义的简单字段(忽略嵌套关联)。 - **FULL**:尝试自动映射所有字段(包括嵌套对象),但容易出错,不推荐用于复杂场景[^2]。 最佳实践:对于简单映射,可使用自动映射;但对于关联关系或字段名不一致的情况,手动定义 `resultMap` 更可靠[^1][^3]。例如: ```xml <!-- 完整示例:用户映射包含角色和商品列表 --> <resultMap id="UserDetailMap" type="User"> <id property="userId" column="user_id"/> <result property="userName" column="user_name"/> <association property="role" javaType="Role" ... /> <collection property="goodsList" ofType="Goods" ... /> </resultMap> ``` 正确使用 `resultMap` 的属性,能有效简化 SQL 查询,并处理数据库与对象模型的差异[^1][^3]。 ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值