在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
属性来指定集合中元素的类型。