MyBatis之關聯查詢

MyBatis之關聯查詢

mybatis實現表與表之間的查詢,將查詢結果集進行映射,主要是resultMap完成高級映射,瞭解resultMap的使用方法。

1.數據模型

訂單商品模型:
這裏寫圖片描述
目標:分析表與表之間的關係。

分析步驟:
1、按模塊去分析表,不要將系統全部表一次性分析
2、瞭解每個表存儲了什麼業務數據
3、瞭解表中關鍵字段(主鍵、外鍵、索引字段、非空字段)
4、瞭解表與表之間數據庫級別的關係(外鍵關係)
5、表與表之間的業務關係(一對一、一對多、多對多)
注意:分析表與表之間的業務關係時一定要建立 在某種業務意義基礎上
這裏寫圖片描述

user表:存儲了購買用戶信息
網民,在電商系統中註冊成爲購買用戶

orders表:存儲了用戶創建的訂單信息
用戶購買東西,一次不管購買多少商品只會創建一個訂單
比如:張三一次購買手機、電腦,在orders表插入一條訂單記錄

orderdetail表:存儲用戶創建訂單的詳細信息,記錄當時用戶購買商品的購買信息
比如:張三一次購買手機、電腦,在orders表插入一條訂單記錄,在訂單明細表插入兩條記錄,訂單明細表每條記錄對應一個商品信息

items商品表:存儲了電商系統中的商品信息,用戶在網站查看的商品信息就是來源與這張表
比如:網站銷售手機,在這個表中插入很多的不同型號手機商品信息

orders—>user:
一個訂單隻能由一個用戶創建,一對一關係
user—>orders:
一個用戶可以創建多個訂單,一對多關係

2.一對一查詢

2.1.需求

查詢訂單關聯查詢用戶信息

2.2.分析

使用mybatis開發持久層的dao接口時,要分析的重點就是sql語句如何實現?

主查詢表:orders訂單表
關聯查詢表:user用戶信息
確定關聯查詢方法:包括內連接、外連接
由於orders表有外鍵user_id,根據user_id去查詢user只能查詢到一條記錄的。就可以使用內鏈接。

SELECT 
  orders.*,
  user.username,
  user.address 
FROM
  orders,
  USER 
WHERE orders.user_id = user.id

2.3基本數據模型po

一個表對應一個po類,表名和po類名一致,表的屬性和po的屬性一致。
這裏寫圖片描述

2.4.resultType實現

resultType映射規則:sql查詢出幾條記錄,只要保證sql列名和resulttype指定的pojo類型的屬性一致,可以映射成功,sql查詢出幾條記錄最終映射生成的List<pojo>就有幾個對象。

2.4.1.自定義pojo
由於與表對應的po類的屬性不能夠全部包括下邊列名,所以自定義pojo,屬性名和下邊的列名保持一致

這裏寫圖片描述

這裏寫圖片描述

2.4.2.mapper.xml

這裏寫圖片描述

2.4.3.mapper.java

這裏寫圖片描述

2.5.resultMap實現

2.5.1.需求

主查詢是訂單信息,要將主查詢訂單信息映射到orders對象中,在orders中創建user屬性,讓關聯查詢出來的用戶信息映射到orders對象中的user屬性中。其主要目標爲了獲取信息方便,如果想獲取用戶的信息,調用orders對象的getUser()方法即可。

2.5.2.在orders中創建user屬性

這裏寫圖片描述

2.5.3.mapper.xml

這裏寫圖片描述

2.5.4.resultMap

這裏寫圖片描述

2.5.5.mapper.java

這裏寫圖片描述

2.6.小結
如果沒有特殊的要求,使用resultType是比較方便,只要能夠保證sql查詢的列和pojo屬性名一致可以映射成功,如果pojo中屬性少了,添加屬性即可。

特殊的要求:
如果需要將關聯查詢的信息映射到pojo的pojo屬性中, 爲了獲取數據方便,可以使用resultMap。
如果使用延遲加載,只能使用resultMap。

建議是使用resultMap即可,在實際中,數據庫中查詢處來的字段名與實體類的屬性名不一定一樣。當一樣的也可以不用去定義,resultMap會自動封裝。

3.一對多查詢

3.1.需求

查詢訂單關聯查詢明細信息

3.2.分析

主查詢表:orders訂單表
關聯查詢表:orderdetail訂單明細表
使用內連接

select
  orders.*,
  user.username,
  user.address,
  orderdetail.id orderdetail_id,
  orderdetail.items_id,
  orderdetail.items_num
FROM
  orders,
  USER ,
  orderdetail
WHERE orders.user_id = user.id  AND orderdetail.orders_id = orders.id

3.3.映射需求

將主查詢的訂單信息映射到orders對象中,將訂單關聯的明細信息映射到orders對象中List<Orderdetail>

根據此需求分析使用resultType不能實現,只能使用resultMap

3.4.修改orders類添加List屬性

這裏寫圖片描述

3.5.mapper.xml

這裏寫圖片描述

3.6.resultMap

這裏寫圖片描述

3.7.mapper.java

這裏寫圖片描述

4.association和collection小結

association:用於將關聯查詢信息映射到單個對象中。
標籤注意使用javaType指定關聯映射的對象類型

collection:用於將關聯查詢信息映射到集合對象中。
標籤注意使用ofType指定關聯映射的List中pojo的類型。

5.多對多查詢

5.1.需求
查詢用戶信息及用戶購買的商品信息

5.2.分析
主查詢表:user用戶信息

關聯查詢表:orders訂單、orderdetail訂單明細、items商品信息

採用內鏈接關聯。

SELECT 
  orders.*,
  user.username,
  user.address,
  orderdetail.id orderdetail_id,
  orderdetail.items_id,
  orderdetail.items_num,
  items.name items_name,
  items.pic items_pic
FROM
  orders,
  USER,
  orderdetail,
  items
WHERE orders.user_id = user.id 
  AND orderdetail.orders_id = orders.id 
  AND items.id = orderdetail.items_id

5.3.映射需求

在user中設置一個List orders屬性,在order對象中設置List<Orderdetail> orderdeils 屬性,在Orderdetail中設置Items屬性。
最終查詢出來的用戶列表,用戶信息映射到List<User>中,用戶創建的訂單信息映射到user中的List<Orders> orders屬性,訂單下的明細映射到order對象中List<Orderdetail> orderdeils 屬性,訂單明細所對應的商品信息映射到Orderdetail中Items屬性

5.4.修改po類

這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

5.5.mapper.xml
這裏寫圖片描述

5.6.resultMap
這裏寫圖片描述

5.7.mapper.java
這裏寫圖片描述

6.resultMap總結

resultMap實現高級映射,如果對結果有高級映射的需求可以使用reusltMap,需求比如:將一個列表數據映射到pojo的list屬性中採用resultmap。
如果僅僅是將查詢列表簡單映射爲List<pojo>方式,列表中每個pojo對應一條記錄,採用resultType即可。

7.延遲加載

  • 如果剛開始僅僅查詢一些簡單的數據能夠 滿足用戶的需求時,只需要查詢簡單的數據(儘量從單表中取數據),當用戶需要查詢關聯信息時,此時我們再關聯查詢關聯信息,叫延遲加載,對關聯查詢的信息進行延遲加載。

  • 延遲加載其目的爲了提高查詢性能,減輕數據的壓力。

7.1.需求

查詢訂單關聯查詢用戶信息,對關聯查詢用戶進行延遲加載。

7.2.實現方式一

定義兩個mapper:
1、查詢訂單列表(只從訂單表查詢),單表查詢
2、根據用戶id查詢用戶信息。

service調用第一個mapper查詢出訂單信息在頁面顯示出來
當用戶在頁面點擊“查看用戶”鏈接時通過service調用第二個mapper查詢用戶信息。

7.3.resultMap實現延遲加載

7.3.1.打開延遲加載的開關
在SqlMapConfig.xml中配置:

這裏寫圖片描述

7.3.2.sql語句

查詢訂單的sql:
單表查詢:
select * from orders;

查詢用戶信息:
根據用戶id查詢用戶信息
select * from user where id=?

7.3.3.mapper.xml
這裏寫圖片描述

7.3.4.resultMap定義延遲加載

這裏寫圖片描述

7.3.5.mapper.java

這裏寫圖片描述

7.3.6.測試延遲加載

這裏寫圖片描述

7.3.7.總結

  • resultMap提供延遲加載,通過association可以延遲加載一個對象,通過collection可以延遲加載多個對象即集合對象。

  • 延遲加載要注意實現的方法多種多樣,主要目的是提高查詢性能,減輕數據庫壓力,先查詢簡單數據,按 需查詢關聯數據。

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