Skip to content

嵌套映射


在企业级 Java 项目中,我们经常会遇到数据库表和 Java 对象属性不一致的情况,尤其是存在一对一、一对多关系时。MyBatis 提供了 <resultMap><association> 标签,能够高效地解决复杂对象映射问题。本文将结合实例详细讲解。

<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 对象属性名。

当一个对象中包含另一个对象(一对一关系)时,可以用 <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 列
└─ ...其他属性

如果一个对象中有一个集合属性,需要映射数据库中的多条记录,可以使用 <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 对象。

结构可理解为:

Terminal window
UserVo
├─ id <- 数据库 user_id
├─ name <- 数据库 user_name
└─ orders <- 一个 `OrderVo` 类型的集合
├─ id <- 数据库 order_id
├─ amount <- 数据库 order_amount
└─ ...其他属性

orders 是一个集合属性,包含多个 OrderVo 对象。