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

MyBatis學習筆記(1)—使用篇

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

MyBatis學習筆記(3)—高級映射之一對一映射bash

Mybatis學習筆記(4)-高級映射之一對多映射app

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

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

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

orders表的 order_num是惟一的,可是同一個 orders表能夠對應多個 orderitems,這些 orderitemsorder_num都與對應的 ordersorder_num一致。

首先準備查詢的SQL語句:ui

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屬性中。spa

因此此時的Orders包含如下屬性:code

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

定義ResultMap

由於上一節咱們已經定義了OrdersCustomerResultMap,如今咱們僅僅添加了一個orderItems屬性,因此咱們能夠繼承上一節的ResultMap,定義以下:cdn

<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();
        }
    }
複製代碼

測試結果

能夠發現orders仍是有5個,查看第一個orders,包含了4個orderItems,而後具體的orderItems中的各個屬性也是有值的。

相關文章
相關標籤/搜索