映射原文件中嵌套映射和嵌套查询并不完全相同,以下是一个示例来说明二者之间的区别。
假设有两个表:订单表(orders)和订单详情表(order_details),它们之间是一对多关系,即一个订单对应多个订单详情。表结构如下:
orders表:
| id | order_no | user_id | create_time |
| --- | -------- | ------- | ------------------ |
| 1 | 20210101 | 1001 | 2021-01-01 10:00:00 |
| 2 | 20210102 | 1002 | 2021-01-02 11:00:00 |
order_details表:
| id | order_id | product_name | price |
| --- | -------- | ------------ | ----- |
| 1 | 1 | 商品1 | 100 |
| 2 | 1 | 商品2 | 200 |
| 3 | 2 | 商品3 | 300 |
现在需要查询订单及其所有订单详情,并将结果封装到对象中。
使用嵌套查询的方式可以定义两个查询语句,其中一个查询订单,另一个查询订单详情,并通过 \<collection> 标签实现关联查询。配置文件如下:
```
<select id="selectOrders" resultMap="orderMap">
SELECT * FROM orders
</select>
<select id="selectOrderDetails" parameterType="long" resultMap="orderDetailMap">
SELECT * FROM order_details WHERE order_id=#{id}
</select>
<resultMap id="orderMap" type="Order">
<id property="id" column="id"/>
<result property="orderNo" column="order_no"/>
<result property="userId" column="user_id"/>
<result property="createTime" column="create_time"/>
<collection property="details" ofType="OrderDetail" resultMap="orderDetailMap"/>
</resultMap>
<resultMap id="orderDetailMap" type="OrderDetail">
<id property="id" column="id"/>
<result property="orderId" column="order_id"/>
<result property="productName" column="product_name"/>
<result property="price" column="price"/>
</resultMap>
```
使用嵌套映射的方式可以在订单对象中定义一个嵌套的订单详情对象,然后通过 \<collection> 或 \<association> 标签将查询结果映射到订单对象和订单详情对象中。配置文件如下:
```
<select id="selectOrders" resultMap="orderMap">
SELECT o.*, d.id as detail_id, d.product_name, d.price
FROM orders o LEFT JOIN order_details d ON o.id=d.order_id
</select>
<resultMap id="orderMap" type="Order">
<id property="id" column="id"/>
<result property="orderNo" column="order_no"/>
<result property="userId" column="user_id"/>
<result property="createTime" column="create_time"/>
<association property="detail" resultMap="orderDetailMap">
<id property="id" column="detail_id"/>
<result property="productName" column="product_name"/>
<result property="price" column="price"/>
</association>
</resultMap>
<resultMap id="orderDetailMap" type="OrderDetail">
<result property="id" column="detail_id"/>
<result property="orderId" column="id"/>
<result property="productName" column="product_name"/>
<result property="price" column="price"/>
</resultMap>
```
可以看到,嵌套查询和嵌套映射的方式都可以实现关联查询,但是它们的实现方式略有不同。嵌套查询需要定义额外的查询语句,并通过 \<collection> 标签实现关联查询,而嵌套映射则可以在一个查询语句中完成,通过 \<association> 或 \<collection> 标签将查询结果映射到对象和嵌套对象中。