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

// 主實體
public class OrdersCustom extends Orders {
private List orderDetails; // 一對多
}
// 詳情實體
public class OrderDetailCustom extends OrderDetail {
private ItemsCustom items; // 一對一
}
// 商品實體
public class ItemsCustom extends Items { }
採用「Custom 繼承基礎 POJO + 關聯屬性」模式,不侵入原始 POJO,便於擴展與維護。
public interface OrdersMapper {
List findOrders() throws Exception;
}
<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>
<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>
<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());
}
}
}
select 屬性實現按需加載(參考延遲加載文章)。orders.id AS orders_id),否則映射錯誤。掌握 collection/ofType 與 association/javaType 的精準配置,是 MyBatis 處理複雜對象圖映射的核心技能。