嵌套映射和嵌套查询

映射原文件中嵌套映射和嵌套查询并不完全相同,以下是一个示例来说明二者之间的区别。

假设有两个表:订单表(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> 标签将查询结果映射到对象和嵌套对象中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值