Mybatis學習筆記(5)-高級映射之多對多映射 敬請期待...post
這一節緊跟上一節MyBatis學習筆記(3)—高級映射之一對一映射,用的數據表也是同樣的。回憶上一節的數據表,想一想哪些表之間是一對多的關係。學習
很明顯訂單表(orders)和訂單項(orderitems)是一對多的關係:測試
orders
表的
order_num
是惟一的,可是同一個
orders
表能夠對應多個
orderitems
,這些
orderitems
的
order_num
都與對應的
orders
的
order_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;
...
複製代碼
由於上一節咱們已經定義了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
。
因爲繼承了上一節的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中的各個屬性也是有值的。