Mybatis一对一,一对多关联查询

在MyBatis中,<association><collection>是映射文件中非常重要的元素,用于处理对象之间的关联关系。<association>通常用于一对一的关联映射,而<collection>则用于一对多或多对多的关联映射。

<association> 示例

假设我们有两个表:user 和 user_detail,其中user_detail表中包含user_id作为外键,指向user表的主键。我们想要在用户查询时同时加载用户的详细信息。

User.java


public class User {
private Integer id;
private String name;
private UserDetail userDetail;
// getters and setters
}

UserDetail.java


public class UserDetail {
private Integer id;
private Integer userId;
private String address;
// getters and setters
}

Mapper XML 示例


<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userResultMap" type="User">
<id column="id" property="id" />
<result column="name" property="name" />
<association property="userDetail" javaType="UserDetail">
<id column="detail_id" property="id" />
<result column="user_id" property="userId" />
<result column="address" property="address" />
</association>
</resultMap>
<select id="selectUserWithDetail" resultMap="userResultMap">
SELECT u.id, u.name, ud.id AS detail_id, ud.user_id, ud.address
FROM user u
LEFT JOIN user_detail ud ON u.id = ud.user_id
WHERE u.id = #{id}
</select>
</mapper>

<collection> 示例

假设我们还有一个表order,用于存储订单信息,其中user_id是外键,指向user表。现在,我们想要在用户查询时同时加载用户的所有订单。

Order.java


public class Order {
private Integer id;
private Integer userId;
private String orderNumber;
// getters and setters
}

修改 User.java 以包含订单列表


public class User {
// ... 其他字段 ...
private List<Order> orders;
// getters and setters
}

Mapper XML 示例


<mapper namespace="com.example.mapper.UserMapper">
<resultMap id="userWithOrdersResultMap" type="User">
<id column="id" property="id" />
<result column="name" property="name" />
<collection property="orders" ofType="Order">
<id column="order_id" property="id" />
<result column="user_id" property="userId" />
<result column="order_number" property="orderNumber" />
</collection>
</resultMap>
<select id="selectUserWithOrders" resultMap="userWithOrdersResultMap">
SELECT u.id, u.name, o.id AS order_id, o.user_id, o.order_number
FROM user u
LEFT JOIN `order` o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
</mapper>

在上述例子中,<association>用于将user_detail信息映射到User对象的userDetail属性,而<collection>则用于将多个order记录映射到User对象的orders列表属性中。注意,在<collection>中使用了ofType属性来指定集合中元素的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值