Mybatis 學習筆記之 高級映射(六)

數據模型分析

1.useryee 和 orders:

訂單表:orders

記錄了用戶創建的訂單,訂單號(主鍵),創建用戶:user_id(外鍵),創建時間,訂單狀態……

useryee ——> orders:一個用戶可以創建多個訂單,一對多;
orders ——> user:一個訂單隻由一個用戶創建,一對一。

 

2.orders 和 orderdetail:

訂單明細表:orderdetail (訂單和商品的關聯表)

記錄了用戶購買信息,所屬訂單:orders_id(外鍵),商品 id : items_id(外鍵),商品數量……

orders ——> orderdetail:一個訂單可以包括 多個訂單明細,因爲一個訂單可以購買多個商品,每個商品的購買信息在orderdetail 記錄,一對多關係;
orderdetail ——> orders:一個訂單明細只能包括在一個訂單中,一對一。

 

3.orderdetail 和 products:

orderdetail ——> products:一個訂單明細只對應一個商品信息,一對一
products ——> orderdetail:  一個商品可以包括在多個訂單明細 ,一對多

 

4.數據庫級別沒有關係的表

再分析數據庫級別沒有直接關係的表之間是否有業務關係:
orders 和 products 之間可以通過 orderdetail 表建立 關係: orders 和 orderdetail 爲一對多,products 和 orderdetail 爲 一對多,則 orders ——> products 爲 一對多;同理: products ——> orders 爲 一對多,綜合 orders 和 products 的關係爲 多對多。

user 和 products 是多對多關係。

 

 

5.各個數據表數據

 

一對一查詢

1.Orders 類中添加 User 屬性:

 

2.userMapper.xml:

 

3.UserMapper.java:

 

4.UserMapperTest.java:

 

5.測試結果:

[Orders [id=1, userId=1, number=1000010, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=1, name=Lawxf, sex=male, address=null]], Orders [id=2, userId=1, number=1000011, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=1, name=Lawxf, sex=male, address=null]], Orders [id=3, userId=2, number=1000012, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=2, name=Yellia, sex=femal, address=null]]]

 

 

一對多查詢

1. Orders 添加 orderDetail 屬性:

 

2. userMapper.xml:

 

3.UserMapper.java:

 

4. UserMapperTest.java:

 

5.測試結果:

[Orders [id=2, userId=1, number=1000011, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=1, name=Lawxf, sex=male, address=null], orderDetails=[OrderDetail [id=3, ordersId=2, productsId=3, productsNum=4], OrderDetail [id=4, ordersId=2, productsId=2, productsNum=3]]], Orders [id=3, userId=2, number=1000012, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, user=User [id=2, name=Yellia, sex=femal, address=null], orderDetails=[OrderDetail [id=1, ordersId=3, productsId=1, productsNum=1], OrderDetail [id=2, ordersId=3, productsId=2, productsNum=3]]]]

 

 

多對多查詢

1.需求

查詢用戶及用戶購買產品信息。

2. sql 語句

查詢主表是: user 表;

關聯表:由於用戶和產品沒有直接關聯,是通過訂單和訂單明細進行關聯,所以關聯表是:orders、orderdetail、products。

SELECT 
  orders.*,
  useryee.name,
  useryee.sex,
  useryee.address,
  orderdetail.id orderdetail_id,
  orderdetail.products_id,
  orderdetail.products_num,
  orderdetail.orders_id,
  products.name products_name,
  products.price  products_price,
  products.detail products_detail
FROM
  orders,
  useryee,
  orderdetail,
  products
WHERE orders.user_id = useryee.id AND orderdetail.orders_id=orders.id AND orderdetail.products_id=products.id

數據庫查詢結果:

 

 

3.映射思路

  • 將用戶信息映射到 user 中。
  • 在 user 類中添加訂單列表屬性 List<Orders> orderslist,將用戶創建的訂單映射到 orderslist;
  • 在 Orders 中添加訂單明細列表屬性 List<OrderDetail>orderdetails ,將訂單的明細映射到 orderdetails;
  • 在 OrderDetail 中添加 products 屬性,將訂單明細所對應的產品映射到 products;

 

4.userMapper.xml:

 

 

5. pojo 類:

 

6.UserMapper.java:

 

7. UserMapperTest.java: (測試類)

 

8.測試結果:

跟數據庫查詢結果一樣。

[
User [id=2, name=Yellia, sex=femal, address=null, 
orderslist=[Orders [id=3, userId=null, number=1000012, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, 
orderDetails=[OrderDetail [id=1, ordersId=null, productsId=null, productsNum=1,
products=Products [id=1, name=iphone, detail=stupid果蛆, pic=null, price=10000.0, createTime=null]],
OrderDetail [id=2, ordersId=null, productsId=null, productsNum=3,
products=Products [id=2, name=Lennov, detail=PC not bad, pic=null, price=6000.0, createTime=null]]], user=null]]], 

User [id=1, name=Lawxf, sex=male, address=null, 
orderslist=[Orders [id=2, userId=null, number=1000011, createTime=Thu Apr 19 17:30:29 CST 2018, note=null, 
orderDetails=[OrderDetail [id=3, ordersId=null, productsId=null, productsNum=4, 
products=Products [id=3, name=bitcoin, detail=amazing!, pic=null, price=88888.0, createTime=null]],
OrderDetail [id=4, ordersId=null, productsId=null, productsNum=3,
products=Products [id=2, name=Lennov, detail=PC not bad, pic=null, price=6000.0, createTime=null]]], user=null]]]
]

 

總結:

 

 

1. resultType:

作用:
將查詢結果按照 sql 列名 pojo 屬性名一致性映射到 pojo 中。
場合:
常見一些明細記錄的展示,比如用戶購買商品明細,將關聯查詢信息全部展示在頁面時,此時可直接使用 resultType 將每一條記錄映射到 pojo 中,在前端頁面遍歷 list( list 中是 pojo )即可。
 

2. resultMap:

使用 association collection 完成一對一一對多高級映射(對結果有特殊的映射要求)。
 

2.1 association:

作用:
將關聯查詢信息映射到一個 pojo 對象中。
場合:
爲了方便查詢關聯信息可以使用 association 將關聯訂單信息映射爲用戶對象的 pojo 屬性中,比如:查詢訂單及關聯用戶信息。
使用 resultType 無法將查詢結果映射到 pojo 對象的 pojo 屬性中,根據對結果集查詢遍歷的需要選擇使用 resultType 還是resultMap。
 

2.2 collection:

作用:
將關聯查詢信息映射到一個 list 集合中。
場合:
爲了方便查詢遍歷關聯信息可以使用 collection 將關聯信息映射到 list 集合中,比如:查詢用戶權限範圍模塊及模塊下的菜單,可使用 collection 將模塊映射到模塊 list 中,將菜單列表映射到模塊對象的菜單 list 屬性中,這樣的作的目的也是方便對查詢結果集進行遍歷查詢。

如果使用 resultType 無法將查詢結果映射到 list 集合中。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章