MyBatis 联合查询 一对一 或 一对多 resultMap 怎么写
时间: 2024-09-09 17:08:32 浏览: 86
MyBatis 中的联合查询通常用于一次性获取关联表的数据,常见的场景是一对一或一对多的关系。在 resultMap 的编写上,你需要根据不同情况分别处理:
1. **一对一(One-to-One)**:
如果你想通过一个主键关联到一个唯一的子实体,例如 User 和 Profile 之间的一对一关系,可以在 resultMap 中设置子实体的结果映射,像这样:
```xml
<resultMap id="UserResultMap" type="com.example.User">
<id property="id" column="user_id"/>
<association property="profile" javaType="com.example.Profile" select="getProfileByUserId">
<id property="userId" column="user_id"/>
<!-- 子查询结果中需要的字段 -->
<result property="name" column="profile_name"/>
</association>
</resultMap>
<!-- Mapper 接口中的 SQL 语句 -->
<select id="getProfileByUserId" parameterType="int" resultType="com.example.Profile">
SELECT * FROM profile WHERE user_id = #{userId}
</select>
```
这里假设 `User` 类有一个 `Profile` 属性,通过 `getUserProfile` 方法获取对应的 `Profile` 对象。
2. **一对多(OneToMany)**:
对于一对多关系,比如 Order 和 OrderItems,你可以这样设置:
```xml
<resultMap id="OrderResultMap" type="com.example.Order">
<id property="id" column="order_id"/>
<collection property="items" ofType="com.example.OrderItem">
<id property="itemId" column="item_id"/>
<result property="itemName" column="item_name"/>
</collection>
</resultMap>
<!-- Mapper 接口中的 SQL 通常包含分组查询子句 -->
<select id="getOrdersWithItems" parameterType="int" resultType="com.example.Order">
SELECT o.*, oi.* FROM order o LEFT JOIN order_item oi ON o.id = oi.order_id
WHERE o.user_id = #{userId}
</select>
```
这会返回一个 Order 对象列表,每个对象都有一个 OrderItems 集合。
阅读全文