Mybatis學習筆記(4)-高階對映之一對多對映

卡巴拉的樹發表於2018-02-04

Mybatis學習筆記(4)-高階對映之一對多對映
MyBatis學習筆記(1)—使用篇

MyBatis學習筆記(2)—對映關係篇

MyBatis學習筆記(3)—高階對映之一對一對映

Mybatis學習筆記(4)-高階對映之一對多對映

Mybatis學習筆記(5)-高階對映之多對多對映 敬請期待...

這一節緊跟上一節MyBatis學習筆記(3)—高階對映之一對一對映,用的資料表也是一樣的。回憶上一節的資料表,想想哪些表之間是一對多的關係。

很明顯訂單表(orders)和訂單項(orderitems)是一對多的關係:

Mybatis學習筆記(4)-高階對映之一對多對映
orders表的order_num是唯一的,但是同一個orders表可以對應多個orderitems,這些orderitemsorder_num都與對應的ordersorder_num一致。

首先準備查詢的SQL語句:

SELECT o.*, oi.order_item, oi.prod_id, oi.quantity, oi.item_price
FROM orders AS o, orderitems AS oi
WHERE o.order_num=oi.order_num
複製程式碼

如果按照上一節的套路,那首先應該講解返回值使用resultType,但是如果返回值是resultType定義的POJO的話,那麼無疑查詢出來的POJO資訊的前半段都會包含大量重複的訂單資訊,所以這時候我們最好返回resultMap,主要思路就是在Orders類中新增List orderitems屬性,這樣查詢一個訂單資訊,它所包含的訂單項也會反映在它的orderitems屬性中。

所以此時的Orders包含以下屬性:

public class Orders {
    private Integer orderNum;
    private Date orderDate;
    private Integer custId;
    private Customer customer;
    private List<OrderItems> orderItems;
    ...
複製程式碼

定義ResultMap

因為上一節我們已經定義了OrdersCustomerResultMap,現在我們僅僅新增了一個orderItems屬性,所以我們可以繼承上一節的ResultMap,定義如下:

<resultMap id="OrderAndOrderItemsResultMap" type="com.shuqing28.pojo.Orders" extends="OrdersCustomerResultMap">
        <collection property="orderItems" ofType="com.shuqing28.pojo.OrderItems">
            <id column="order_num" property="orderNum" />
            <id column="order_item" property="orderItem"/>
            <result column="prod_id" property="prodId"/>
            <result column="quantity" property="quantity"/>
            <result column="item_price" property="itemPrice"/>
        </collection>
</resultMap>
複製程式碼

因為新增的orderItems是一個List集合物件,所以這裡用collection定義新元素,第一行最後extends也反映我們是繼承的上一節的OrdersCustomerResultMap

定義select語句

由於繼承了上一節的resultMap,所以我們的查詢還是附帶Customer資訊,所以最終的SQL如下:

<select id="findOrderAndItemsMap" resultMap="OrderAndOrderItemsResultMap">
    SELECT o.order_num,o.order_date, c.*, oi.order_item, oi.prod_id, oi.quantity, oi.item_price
    FROM orders AS o, customers AS c, orderitems AS oi
    WHERE o.cust_id = c.cust_id
    AND o.order_num=oi.order_num
</select>
複製程式碼

這樣就是3表聯查,也稍微擴充了下我們的場景。

當然我們還得在DAO類中宣告介面

宣告介面:

public List<Orders> findOrderAndItemsMap();
複製程式碼

測試

 @Test
    public void findOrderAndItemsMap(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            OrdersDao ordersDao = sqlSession.getMapper(OrdersDao.class);
            List<Orders> orders = ordersDao.findOrderAndItemsMap();
            System.out.println(orders);
        } finally {
            sqlSession.close();
        }
    }
複製程式碼

測試結果

Mybatis學習筆記(4)-高階對映之一對多對映

可以發現orders還是有5個,檢視第一個orders,包含了4個orderItems,然後具體的orderItems中的各個屬性也是有值的。

相關文章