首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

MyBatis 一對一/一對多關聯映射實戰:resultMap、collection、association 完整配置指南

     編輯:DB2 教學

MyBatis 一對一/一對多關聯映射實戰:resultMap、collection、association 完整配置指南

業務場景與數據模型

三表關聯:orders(訂單) 1:N orderdetail(訂單詳情) N:1 items(商品)。

  • 訂單包含多個詳情(一對多)
  • 詳情關聯單個商品(一對一)

ER 圖

實體類設計(扩展模式)

// 主實體
public class OrdersCustom extends Orders {
    private List orderDetails;  // 一對多
}

// 詳情實體
public class OrderDetailCustom extends OrderDetail {
    private ItemsCustom items;  // 一對一
}

// 商品實體
public class ItemsCustom extends Items { }
採用「Custom 繼承基礎 POJO + 關聯屬性」模式,不侵入原始 POJO,便於擴展與維護。

Mapper 接口

public interface OrdersMapper {
    List findOrders() throws Exception;
}

Mapper XML 核心配置

1. 可復用 SQL 片段

<sql id="orders_columns">
  orders.id orders_id, orders.user_id orders_user_id, orders.number orders_number,
  orders.createtime orders_createtime, orders.note orders_note
</sql>

<sql id="orderdetail_columns">
  orderdetail.id orderdetail_id, orderdetail.orders_id orderdetail_orders_id,
  orderdetail.items_id orderdetail_items_id, orderdetail.items_num orderdetail_items_num
</sql>

<sql id="items_columns">
  items.id items_id, items.name items_name, items.price items_price,
  items.detail items_detail, items.pic items_pic, items.createtime items_createtime
</sql>

2. 主查詢 SQL(三表 JOIN)

<select id="findOrders" resultMap="OrderResultMap">
  SELECT
    <include refid="orders_columns"/>,
    <include refid="orderdetail_columns"/>,
    <include refid="items_columns"/>
  FROM orders
  INNER JOIN orderdetail ON orders.id = orderdetail.orders_id
  INNER JOIN items ON orderdetail.items_id = items.id
</select>

3. resultMap 關聯映射(核心)

<resultMap id="OrderResultMap" type="OrdersCustom">
  <id column="orders_id" property="id"/>
  <result column="orders_user_id" property="userId"/>
  <result column="orders_number" property="number"/>
  <result column="orders_createtime" property="createTime"/>
  <result column="orders_note" property="note"/>

  <!-- 一對多:collection,屬性名 orderDetails,泛型 ofType -->
  <collection property="orderDetails" ofType="OrderDetailCustom">
    <id column="orderdetail_id" property="id"/>
    <result column="orderdetail_orders_id" property="ordersId"/>
    <result column="orderdetail_items_id" property="itemsId"/>
    <result column="orderdetail_items_num" property="itemsNum"/>

    <!-- 一對一:association,屬性名 items,類型 javaType -->
    <association property="items" javaType="ItemsCustom">
      <id column="items_id" property="id"/>
      <result column="items_name" property="name"/>
      <result column="items_price" property="price"/>
      <result column="items_detail" property="detail"/>
      <result column="items_pic" property="pic"/>
      <result column="items_createtime" property="createTime"/>
    </association>
  </collection>
</resultMap>

關鍵區別速記

標簽關係屬性類型關鍵屬性
<collection>一對多List/集合ofType 指定泛型類型
<association>一對一單個對象javaType 指定對象類型
核心原理:MyBatis 按 <id> 列分組,相同主鍵值的行合併為一個主對象,集合屬性累加元素,關聯對象按主鍵去重賦值。

測試驗證

@Test
public void testFindOrders() {
    OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);
    List list = mapper.findOrders();
    for (OrdersCustom order : list) {
        System.out.println("訂單: " + order.getNumber());
        for (OrderDetailCustom detail : order.getOrderDetails()) {
            System.out.println("  詳情: " + detail.getItemsNum() + " x " + detail.getItems().getName());
        }
    }
}

進階優化建議

  1. 分頁查詢:主表分頁後再關聯詳情,避免 JOIN 擴大結果集導致分頁錯誤。或使用「子查詢分頁 + 關聯」模式。
  2. 延遲加載:詳情/商品非必須時,配置 select 屬性實現按需加載(參考延遲加載文章)。
  3. 去重優化:大結果集時,考慮拆分為多次查詢 + 內存組裝,減少數據庫傳輸量。
  4. 列名衝突:多表同名列必須別名(如 orders.id AS orders_id),否則映射錯誤。

掌握 collection/ofType 與 association/javaType 的精準配置,是 MyBatis 處理複雜對象圖映射的核心技能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved