Mybatis一对一,一对多关联查询
一对一 <association>
<association>
元素用于处理一对一的关联关系。当查询结果中包含一个对象与另一个对象之间的关联,且这种关联是一对一时,可以使用 <association>
来映射这种关系。<association>
元素内部可以定义多个 <id>
、<result>
或其他 <association>
、<collection>
元素,以映射关联对象的属性。
一对多<collection>
<collection>
元素用于处理一对多的关联关系。当查询结果中包含一个对象与多个对象之间的关联,且这种关联是一对多时,可以使用 <collection>
来映射这种关系。<collection>
元素内部同样可以定义多个 <id>
、<result>
或其他 <association>
、<collection>
元素,以映射集合中每个元素的属性。
场景举例:
<association>
示例详解
场景描述
假设有一个用户(User)系统,每个用户都有一个与之关联的地址(Address)。在这个系统中,用户和地址之间是一对一的关系,即一个用户只有一个地址,而一个地址也只属于一个用户。
数据库表结构
- 用户表(User)
user_id
(用户ID,主键)username
(用户名)- ...(其他用户相关字段)
- 地址表(Address)
address_id
(地址ID,主键)user_id
(用户ID,外键,关联到用户表的user_id)street
(街道)city
(城市)- ...(其他地址相关字段)
ResultMap 配置
在MyBatis的Mapper XML文件中,我们可以使用<association>
来映射用户和地址之间的一对一关系。
<resultMap id="userWithAddressMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="username" />
<!-- 使用<association>映射地址信息 -->
<association property="address" javaType="Address">
<id property="id" column="address_id" />
<result property="street" column="street" />
<result property="city" column="city" />
</association>
</resultMap>
- property="address":指定User对象中的哪个属性用于存放Address对象。
- javaType="Address":指定关联对象的类型,这里是Address。
- 在
<association>
内部,通过<id>
和<result>
标签映射Address对象的各个属性。
SQL 查询
<select id="selectUserWithAddress" resultMap="userWithAddressMap">
SELECT u.user_id, u.username, a.address_id, a.street, a.city
FROM User u
LEFT JOIN Address a ON u.user_id = a.user_id
WHERE u.user_id = #{userId}
</select>
这个查询通过左连接(LEFT JOIN)将用户表和地址表连接起来,并通过resultMap
属性指定了结果映射规则。
<collection>
示例详解
场景描述
继续上面的用户系统,这次我们考虑用户和订单(Order)之间的关系。每个用户可以有多个订单,即用户和订单之间是一对多的关系。
数据库表结构
- 订单表(Order)
order_id
(订单ID,主键)user_id
(用户ID,外键,关联到用户表的user_id)order_number
(订单号)order_date
(订单日期)- ...(其他订单相关字段)
ResultMap 配置
在MyBatis的Mapper XML文件中,我们可以使用<collection>
来映射用户和订单之间的一对多关系。
<resultMap id="userWithOrdersMap" type="User">
<id property="id" column="user_id" />
<result property="username" column="username" />
<!-- 使用<collection>映射订单集合 -->
<collection property="orders" ofType="Order">
<id property="id" column="order_id" />
<result property="orderNumber" column="order_number" />
<result property="orderDate" column="order_date" />
</collection>
</resultMap>
- property="orders":指定User对象中的哪个属性用于存放Order对象的集合。
- ofType="Order":指定集合中元素的类型,这里是Order。注意,这里使用的是
ofType
而不是javaType
,因为javaType
用于指定整个集合的类型(通常是List、Set等),而ofType
用于指定集合中元素的类型。 - 在
<collection>
内部,同样通过<id>
和<result>
标签映射Order对象的各个属性。
SQL 查询
<select id="selectUserWithOrders" resultMap="userWithOrdersMap">
SELECT u.user_id, u.username, o.order_id, o.order_number, o.order_date
FROM User u
LEFT JOIN Order o ON u.user_id = o.user_id
原文地址:https://blog.csdn.net/ansmallwhite/article/details/140355853
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!