MyBatis基础篇之映射文件---如何通过select返回Map

本文介绍了一种减少数据库查询次数的方法:通过预先查询并将结果存入Map集合来优化数据插入过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<think>好的,我现在需要帮助用户理解MyBatis中resultMap的映射含义,特别是association和collection的用法。首先,我得回忆一下自己之前学过的MyBatis知识,以及用户提供的参考资料。 用户提到了两优快云博客,引用1和引用2,都是关于ResultMap的association和collection标签的。根据这些资料,我应该先理清resultMap的基本结构,然后详细说明association和collection的区别和使用场景。 首先,resultMap主要用于将数据库查询结果映射到Java对象,尤其是当数据库字段和Java属性名称不一致,或者存在复杂关系(如一对一、一对多)时。用户可能已经知道基本的resultMap用法,但需要深入理解association和collection。 接下来,association用于处理“一对一”或“多对一”的关系,比如一个订单对应一个用户。而collection则处理“一对多”的关系,比如一个用户有多个订单。需要举例子说明这两种标签的结构和属性,比如如何嵌套使用,如何指定JavaType和ofType等。 还要注意,用户提供的引用中提到了多层嵌套的情况,比如在collection里再嵌套association或者其他collection。这时候可能需要用到多层resultMap定义,或者通过select属性进行延迟加载。比如,在用户对象中嵌套订单合,每个订单又关联商品信息,这时候就需要多层嵌套。 另外,用户可能对column属性的使用有疑问,比如如何传递多个参数,或者在嵌套查询中如何引用外层的结果列。需要解释column可以传递多个值,例如column="{param1=col1, param2=col2}",这样在嵌套查询中可以使用这些参数。 可能还需要提到resultMap的属性,比如id和result的区别,id用于标识主键,提高性能。同时,association和collection中的select属性用于执行额外的查询,这涉及到N+1查询的问题,需要注意性能优化,比如使用联合查询或者开启延迟加载。 用户可能还关心实际应用中的例子,比如如何配置XML文件中的resultMap,如何编写对应的Java实体类。需要给出具体的XML配置示例,比如用户和订单的关系,以及对应的Java类结构。 最后,生成相关问题需要考虑用户可能进一步的问题,比如性能优化、嵌套查询与联合查询的区别、延迟加载的配置等。这些问题可以帮助用户更深入地理解resultMap的高级用法和注意事项。 总结一下,回答的结构应该是先介绍resultMap的基本概念,然后分别详细说明association和collection的用法,给出具体例子,再讨论多层嵌套的情况,最后提到常见问题和注意事项。同时,在回答末尾添加相关问题,引导用户进一步学习。</think>### MyBatis ResultMap映射关系详解 #### 1. ResultMap基础概念 ResultMapMyBatis中**最核心的映射配置工具**,用于将数据库查询结果映射到Java对象。当数据库字段名与实体类属性名不一致,或存在复杂对象关联(如一对一、一对多)时,必须通过ResultMap实现精确映射[^1][^2]。 --- #### 2. 核心映射组件 ##### 2.1 基础字段映射 ```xml <resultMap id="userMap" type="User"> <id property="id" column="user_id"/> <!-- 主键标识 --> <result property="name" column="user_name"/> <!-- 普通字段映射 --> </resultMap> ``` ##### 2.2 一对一映射(association) 用于**嵌套对象**的映射,例如用户与身份证的一对一关系: ```xml <resultMap id="userResult" type="User"> <association property="idCard" javaType="IdCard"> <id property="cardId" column="card_id"/> <result property="number" column="id_number"/> </association> </resultMap> ``` * `property`:实体类中对应的对象属性名 * `javaType`:嵌套对象的Java类型 * 支持嵌套查询:通过`select`属性引用其他Mapper方法 --- ##### 2.3 一对多映射(collection) 处理合类型的关联关系,例如用户与订单的一对多关系: ```xml <resultMap id="userWithOrders" type="User"> <collection property="orders" ofType="Order"> <id property="orderId" column="oid"/> <result property="amount" column="total_amount"/> </collection> </resultMap> ``` * `ofType`:指定合元素的Java类型 * 支持多层嵌套:在collection内可继续嵌套association或其他collection --- #### 3. 多层嵌套示例 用户->订单->商品的三层结构映射: ```xml <resultMap id="userDetailMap" type="User"> <collection property="orders" ofType="Order"> <collection property="items" ofType="Item"> <result property="itemName" column="product_name"/> </collection> </collection> </resultMap> ``` --- #### 4. 高级配置技巧 1. **联合查询优化**:通过`JOIN`查询代替多次简单查询 2. **延迟加载**:在`<settings>`配置`lazyLoadingEnabled=true`实现按需加载 3. **复合列传递**: ```xml <association property="dept" column="{id=dept_id,name=dept_name}" select="selectDept"/> ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值