【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中。