在 MyBatis 中进行多表查询可以使用 SQL 的关联查询语句来实现。同时,针对一对多和多对多的关系,MyBatis 提供了 ResultMap 的配置来处理结果集的映射。
以下是示例代码,演示了如何进行多表查询和处理一对多和多对多的关系:
1. 一对多关系:
假设有两个表:`users`(用户表)和 `orders`(订单表),一个用户可以拥有多个订单。
```xml
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
<resultMap id="userWithOrdersResultMap" type="com.example.User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<!-- 一对多关系 -->
<collection property="orders" ofType="com.example.Order">
<id property="id" column="order_id"/>
<result property="amount" column="order_amount"/>
<!-- 其他订单属性 -->
</collection>
</resultMap>
<select id="getUserWithOrders" resultMap="userWithOrdersResultMap">
SELECT u.id AS user_id, u.name AS user_name,
o.id AS order_id, o.amount AS order_amount
FROM users u LEFT JOIN orders o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
</mapper>
```
上述示例中,我们通过 SQL 语句 `SELECT u.id AS user_id, u.name AS user_name, ...` 进行多表关联查询,并使用 `<collection>` 标签配置 `orders` 字段的映射关系,建立了一对多关系。
2. 多对多关系:
假设有两个表:`users`(用户表)和 `roles`(角色表),一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。
```xml
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
<resultMap id="userWithRolesResultMap" type="com.example.User">
<id property="id" column="user_id"/>
<result property="name" column="user_name"/>
<!-- 多对多关系 -->
<collection property="roles" ofType="com.example.Role">
<id property="id" column="role_id"/>
<result property="name" column="role_name"/>
<!-- 其他角色属性 -->
</collection>
</resultMap>
<select id="getUserWithRoles" resultMap="userWithRolesResultMap">
SELECT u.id AS user_id, u.name AS user_name,
r.id AS role_id, r.name AS role_name
FROM users u
LEFT JOIN user_role ur ON u.id = ur.user_id
LEFT JOIN roles r ON r.id = ur.role_id
WHERE u.id = #{id}
</select>
</mapper>
```
上述示例中,我们通过 SQL 语句 `SELECT u.id AS user_id, u.name AS user_name, ...` 进行多表关联查询,并使用 `<collection>` 标签配置 `roles` 字段的映射关系,建立了多对多关系。
在使用 ResultMap 进行一对多和多对多关系的映射时,可以根据实际情况配置更多的属性,例如使用嵌套查询、关联查询等方式,来满足不同的查询需求。
通过合理配置 ResultMap,可以方便地处理多表查询和一对多、多对多关系的结果映射,简化了数据操作的编写和维护工作。