1. 程式人生 > >【mybatis】一對多查詢

【mybatis】一對多查詢

一對多查詢

需求

查詢訂單及訂單明細的資訊。

sql語句

確定主查詢表:訂單表

確定關聯查詢表:訂單明細表

在一對一查詢基礎上新增訂單明細表關聯即可。

SELECT

  orders.*,

  USER.username,

  USER.sex,

  USER.address,

  orderdetail.id orderdetail_id,

  orderdetail.items_id,

  orderdetail.items_num,

  orderdetail.orders_id

FROM

  orders,

  USER,

  orderdetail

WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id

分析

使用resultType將上邊的 查詢結果對映到pojo中,訂單資訊的就是重複。

要求:

1、對orders對映不能出現重複記錄。

3、最終會將訂單資訊對映到orders中,訂單所對應的訂單明細對映到orders中的orderDetails屬性中。

對映成的orders記錄數為兩條(orders資訊不重複)

每個orders中的orderDetails屬性儲存了該 訂單所對應的訂單明細。

在orders中新增list訂單明細屬性

mapper.xml

resultMap定義

<!-- 訂單及訂單明細的resultMap使用extends繼承,不用在中配置訂單資訊和使用者資訊的對映-->

   <resultMap type="cn.itcast.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">

      <!--查詢中既包含了 訂單資訊 ,也有使用者資訊 -->

      <!-- 訂單明細資訊 一個訂單關聯查詢出了多條明細,要使用collection進行對映

      collection:對關聯查詢到多條記錄對映到集合物件中

      property:將關聯查詢到多條記錄對映到cn.itcast.mybatis.po.Orders哪個屬性

      ofType:指定對映到list集合屬性中pojo的型別

       -->

       <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail">

         <!-- id:訂單明細唯 一標識

         property:要將訂單明細的唯 一標識 對映到cn.itcast.mybatis.po.Orderdetail的哪個屬性

           -->

         <id column="orderdetail_id" property="id"/>

         <result column="items_id" property="itemsId"/>

         <result column="items_num" property="itemsNum"/>

         <result column="orders_id" property="ordersId"/>

       </collection>

   </resultMap>

因為這條查詢中既包含了訂單資訊 也有使用者資訊,還用訂單明細資訊。

訂單與使用者的對映關係我們使用繼承的方式在resultMap中體現。

而一對多的關係,也就是訂單與訂單明細的關係使用collection:

      collection:對關聯查詢到多條記錄對映到集合物件中   

      property:將關聯查詢到多條記錄對映到cn.itcast.mybatis.po.Orders哪個屬性,也就是我們新增的屬性List<Orderdetail>

      ofType:指定對映到list集合屬性中pojo的型別

mapper.java

小結

mybatis使用resultMap的collection對關聯查詢的多條記錄對映到一個list集合屬性中。

使用resultType實現:

將訂單明細對映到orders中的orderdetails中,需要自己處理,使用雙重迴圈遍歷,去掉重複記錄,將訂單明細放在orderdetails中。