嵌套映射
在企业级 Java 项目中,我们经常会遇到数据库表和 Java 对象属性不一致的情况,尤其是存在一对一、一对多关系时。MyBatis 提供了 <resultMap> 和 <association> 标签,能够高效地解决复杂对象映射问题。本文将结合实例详细讲解。
1. 什么是 <resultMap>
Section titled “1. 什么是 <resultMap>”<resultMap> 是 MyBatis 的核心功能之一,用来 定义数据库查询结果与 Java 对象属性的映射关系。
基本结构如下:
<resultMap id="exampleMap" type="com.example.domain.ExampleVo"> <result column="db_column" property="javaProperty"/></resultMap>-
id:映射名字,可在
<select>中引用。 -
type:最终映射成的 Java 对象类型。
-
column:数据库列名。
-
property:Java 对象属性名。
2. 一对一关系映射<association>
Section titled “2. 一对一关系映射<association>”当一个对象中包含另一个对象(一对一关系)时,可以用 <association>。
示例:
<resultMap id="AbandonRecordDetailVoMap" type="com.ruoyi.publiclowrent.domain.vo.AbandonRecordDetailVo"> <association property="abandonRecordDetailDto" javaType="com.ruoyi.publiclowrent.dto.AbandonRecordDetailDto"> <result column="relationship" property="relationship"/> <result column="name" property="applicant"/> <result column="identity_number" property="identityNumber"/> <result column="bzzg_status" property="bzzgStatus"/> <result column="application_date" property="applicationDate"/> <result column="family_num" property="familyNum"/> <result column="villa_name" property="villageName"/> <result column="building_num" property="buildingNum"/> <result column="unit" property="unit"/> <result column="floor_num" property="floorNum"/> <result column="room_num" property="roomNum"/> </association></resultMap>解析:
-
AbandonRecordDetailVo对象中有一个属性abandonRecordDetailDto,类型为AbandonRecordDetailDto。 -
<association>用来将数据库列映射到嵌套对象的属性上。 -
数据库列名可能是下划线风格(
snake_case),Java 属性是驼峰风格(camelCase),MyBatis 会自动映射。
结构可理解为:
AbandonRecordDetailVo └─ abandonRecordDetailDto (AbandonRecordDetailDto) ├─ relationship <= 数据库 relationship 列 ├─ applicant <= 数据库 name 列 ├─ identityNumber<= 数据库 identity_number 列 └─ ...其他属性3. 一对多关系映射<collection>
Section titled “3. 一对多关系映射<collection>”如果一个对象中有一个集合属性,需要映射数据库中的多条记录,可以使用 <collection> 标签。这通常用于 一对多关系,比如用户和用户的多个订单。
<resultMap id="UserWithOrdersMap" type="UserVo"> <id column="user_id" property="id"/> <result column="user_name" property="name"/> <collection property="orders" ofType="OrderVo"> <id column="order_id" property="id"/> <result column="order_amount" property="amount"/> </collection></resultMap>解析:
-
UserVo对象有一个属性orders,类型是List<OrderVo>。 -
<collection>用来表示UserVo中的一个 集合属性(即orders)。 -
ofType="OrderVo"指定了集合中元素的类型(OrderVo类),MyBatis 会将查询结果中的每条记录映射为OrderVo对象。
结构可理解为:
UserVo ├─ id <- 数据库 user_id 列 ├─ name <- 数据库 user_name 列 └─ orders <- 一个 `OrderVo` 类型的集合 ├─ id <- 数据库 order_id 列 ├─ amount <- 数据库 order_amount 列 └─ ...其他属性
orders是一个集合属性,包含多个OrderVo对象。