Mybatis學習筆記(5)-高階對映之多對多對映 敬請期待...
這一節緊跟上一節MyBatis學習筆記(3)—高階對映之一對一對映,用的資料表也是一樣的。回憶上一節的資料表,想想哪些表之間是一對多的關係。
很明顯訂單表(orders)和訂單項(orderitems)是一對多的關係:
orders
表的order_num
是唯一的,但是同一個orders
表可以對應多個orderitems
,這些orderitems
的order_num
都與對應的orders
的order_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();
}
}
複製程式碼
測試結果
可以發現orders還是有5個,檢視第一個orders,包含了4個orderItems,然後具體的orderItems中的各個屬性也是有值的。