mybatis學習筆記(11)-一對多查詢

mybatis學習筆記(11)-一對多查詢

標籤: mybatisjava


[TOC]git


本文實現一對多查詢,查詢訂單及訂單明細的信息github

示例

  • sql

肯定主查詢表:訂單表 肯定關聯查詢表:訂單明細表 在一對一查詢基礎上添加訂單明細表關聯便可。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

注意上面的orderdetail.id (AS) orderdetail_id,這裏須要取別名,不然因爲orders表也有id字段,在後面映射時會衝突mybatis

  • 映射思路

使用resultType將上邊的查詢結果映射到pojo中,訂單信息的就是重複。app

對orders映射不能出現重複記錄。學習

在orders.java類中添加List<orderDetail> orderDetails屬性。 最終會將訂單信息映射到orders中,訂單所對應的訂單明細映射到orders中的orderDetails屬性中。網站

映射成的orders記錄數爲兩條(orders信息不重複),每一個orders中的orderDetails屬性存儲了該訂單所對應的訂單明細。.net

  • 在orders中添加list訂單明細屬性
//訂單明細
private List<Orderdetail> orderdetails;
  • mapper.xml
<!-- 查詢訂單關聯查詢用戶及訂單明細,使用resultmap -->
<select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
   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
</select>
  • resultMap定義
<!-- 訂單及訂單明細的resultMap
使用extends繼承,不用在中配置訂單信息和用戶信息的映射
 -->
<resultMap type="com.iot.mybatis.po.Orders" id="OrdersAndOrderDetailResultMap" extends="OrdersUserResultMap">
    <!-- 訂單信息 -->
    <!-- 用戶信息 -->
    <!-- 使用extends繼承,不用在中配置訂單信息和用戶信息的映射 -->


    <!-- 訂單明細信息
    一個訂單關聯查詢出了多條明細,要使用collection進行映射
    collection:對關聯查詢到多條記錄映射到集合對象中
    property:將關聯查詢到多條記錄映射到com.iot.mybatis.po.Orders哪一個屬性
    ofType:指定映射到list集合屬性中pojo的類型
     -->
    <collection property="orderdetails" ofType="com.iot.mybatis.po.Orderdetail">
        <!-- id:訂單明細惟 一標識
        property:要將訂單明細的惟 一標識 映射到com.iot.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>
  • mapper.java
//查詢訂單(關聯用戶)及訂單明細
public List<Orders>  findOrdersAndOrderDetailResultMap()throws Exception;

小結

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

使用resultType實現:將訂單明細映射到orders中的orderdetails中,須要本身處理,使用雙重循環遍歷,去掉重複記錄,將訂單明細放在orderdetails中。

另外,下面這篇文章對一對多的resultMap機制解釋的很清楚:

MyBatis:一對多表關係詳解(從案例中解析)


做者@brianway更多文章:我的網站 | CSDN | oschina

相關文章
相關標籤/搜索