MyBatis多表查询实现方式
MyBatis 的多表查询主要涉及关联查询(如一对一、一对多、多对多),可以通过 ResultMap 嵌套映射实现。
1. 嵌套ResultMap (关联查询)
通过 <association> (一对一)和 <collection> (一对多)标签嵌套映射关联对象。
示例:订单(Order)与用户(User)的一对一关系:
<resultMap id="OrderWithUserMap" type="Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<!-- 一对一映射用户 -->
<association property="user" javaType="User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
</association>
</resultMap>
<select id="getOrderWithUser" resultMap="OrderWithUserMap">
SELECT
o.id AS order_id, o.order_no,
u.id AS user_id, u.name AS user_name
FROM orders o
LEFT JOIN user u ON o.user_id = u.id
</select>
2. 一对多关系(如订单与订单项)
使用 <collection> 标签映射子对象集合。
<resultMap id="OrderWithItemsMap" type="Order">
<id property="id" column="order_id"/>
<result property="orderNo" column="order_no"/>
<!-- 一对多映射订单项 -->
<collection property="items" ofType="OrderItem">
<id property="id" column="item_id"/>
<result property="productName" column="product_name"/>
</collection>
</resultMap>
<select id="getOrderWithItems" resultMap="OrderWithItemsMap">
SELECT
o.id AS order_id, o.order_no,
i.id AS item_id, i.product_name
FROM orders o
LEFT JOIN order_item i ON o.id = i.order_id
</select>
3. 多对多关系(如用户与角色)
通过中间表关联,结合 <collection> 实现。
<resultMap id="UserWithRolesMap" type="User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<collection property="roles" ofType="Role">
<id property="id" column="role_id"/>
<result property="name" column="role_name"/>
</collection>
</resultMap>
<select id="getUserWithRoles" resultMap="UserWithRolesMap">
SELECT
u.id AS user_id, u.name AS user_name,
r.id AS role_id, r.name AS role_name
FROM user u
LEFT JOIN user_role ur ON u.id = ur.user_id
LEFT JOIN role r ON ur.role_id = r.id
</select>