mybatis 一对两张多表查询
时间: 2023-10-19 14:25:24 浏览: 61
在 MyBatis 中进行一对多表查询,可以通过使用嵌套查询或者关联映射来实现。以下是两种常见的方法:
1. 嵌套查询(Nested Queries):
在这种方式下,我们可以定义两个独立的 SQL 查询语句,然后在 XML 映射文件中使用嵌套查询将它们连接起来。下面是一个示例:
```xml
<select id="getUserWithOrders" resultMap="UserWithOrdersResultMap">
SELECT * FROM users WHERE id = #{id}
</select>
<resultMap id="UserWithOrdersResultMap" type="User">
<id property="id" column="id" />
<result property="name" column="name" />
<collection property="orders" ofType="Order">
<id property="id" column="order_id" />
<result property="orderName" column="order_name" />
</collection>
</resultMap>
```
在这个示例中,我们通过 `getUserWithOrders` 查询获取一个用户,并使用 `resultMap` 定义了 `User` 对象及其关联的 `Order` 对象列表。`collection` 标签用于指定关联关系,并指定了关联对象的类型。
2. 关联映射(Association Mapping):
这种方式下,我们可以使用 MyBatis 的关联映射特性,直接在一个 SQL 查询语句中完成多表查询和结果映射。下面是一个示例:
```xml
<select id="getUserWithOrders" resultMap="UserWithOrdersResultMap">
SELECT u.id, u.name, o.id as order_id, o.name as order_name
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.id = #{id}
</select>
<resultMap id="UserWithOrdersResultMap" type="User">
<id property="id" column="id" />
<result property="name" column="name" />
<collection property="orders" ofType="Order">
<id property="id" column="order_id" />
<result property="orderName" column="order_name" />
</collection>
</resultMap>
```
在这个示例中,我们通过一条 SQL 查询语句同时获取用户和订单信息,并使用 `resultMap` 定义了 `User` 对象及其关联的 `Order` 对象列表。`LEFT JOIN` 用于连接两张表,`AS` 关键字用于为查询结果指定别名。
无论哪种方式,都需要合理地定义映射关系,确保查询结果正确映射到对应的实体对象中。注意替换示例中的表名、列名和对象属性名,以适应你的具体数据结构。