數據模型分析
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 集合中。