mybatis 一對多,多對多等關係xml檔案中sql的寫法以及快取、延遲載入的配置寫法
高階功能https://blog.csdn.net/dfsaggsd/article/details/50555583
對映關係
一對一對映
SQL語句:使用者訂單查詢
SELECT
orders.*,
USER.username,
USER.sex,
USER.address
FROM
orders,
USER
WHERE orders.user_id = user.id
resultType方法
1. 定義pojo物件
由於原始的Orders.java不能對映全部欄位,所以需要新建立的pojo。如下:
2. 在mapper.xml相應的sql語句配置中,輸出型別為上邊定義的pojo物件。其他照舊。
resultMap
1. 思路:
1) 使用resultMap將查詢結果中的訂單資訊對映到Orders物件中。
2) 在orders類中新增User屬性,將關聯查詢出來的使用者資訊對映到orders物件中的user屬性中。
2. 方法:
1) 在主表對應類中新增關聯表對應的物件
2) 在mapper.xml中定義resultMap
3) Sql語句的配置
一對多對映
Sql語句:使用者訂單及訂單明細
SELECT
orders.*,
USER.username,
USER.sex,
USER.address,
orderdetail.idorderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id
FROM
orders,
USER,
orderdetail
WHERE orders.user_id = user.id ANDorderdetail.orders_id=orders.id
resultMap方法
1. 主表對應實體類中新增屬性:在orders.java類中新增List<orderDetail> orderDetails屬性。最終會將訂單資訊對映到orders中,訂單所對應的訂單明細對映到orders中的orderDetails屬性中
2. 定義resultMap
多對多對映
sql語句:由於使用者和商品沒有直接關聯,通過訂單和訂單明細進行關聯,所以關聯表:
orders、orderdetail、items
SELECT
orders.*,
USER.username,
USER.sex,
USER.address,
orderdetail.id orderdetail_id,
orderdetail.items_id,
orderdetail.items_num,
orderdetail.orders_id,
items.name items_name,
items.detail items_detail,
items.price items_price
FROM
orders,
USER,
orderdetail,
items
WHERE orders.user_id = user.id ANDorderdetail.orders_id=orders.id AND orderdetail.items_id = items.id
resultMap方法
1. 思路:將使用者資訊對映到user中。
1) 在user類中新增訂單列表屬性List<Orders> orderslist,將使用者建立的訂單對映到orderslist
2) 在Orders中新增訂單明細列表屬性List<OrderDetail>orderdetials,將訂單的明細對映到orderdetials
3) 在OrderDetail中新增Items屬性,將訂單明細所對應的商品對映到Items
2. 定義resultMap
resultType與resultMap小結
|
resultType |
resultMap(常用) |
|
association |
collection |
||
作用 |
將查詢結果按照sql列名與pojo中屬性名,以一致性關係進行對映 |
將關聯查詢資訊對映到一個pojo物件中 |
將關聯查詢資訊對映到一個list集合中 |
場合 |
常見一些明細記錄的展示,比如使用者購買商品明細,將關聯查詢資訊全部展示在頁面時,此時可直接使用resultType將每一條記錄對映到pojo中,在前端頁面遍歷list(list中是pojo)即可 |
為了方便查詢關聯資訊可以使用association將關聯訂單資訊對映為使用者物件的pojo屬性中,比如:查詢訂單及關聯使用者資訊。
|
為了方便查詢遍歷關聯資訊可以使用collection將關聯資訊對映到list集合中 |
延遲載入 |
不可 |
可以 |
延遲載入
1. 延遲載入:先從單表查詢、需要時再從關聯表去關聯查詢,大大提高 資料庫效能,因為查詢單表要比關聯查詢多張錶速度要快。
使用association實現延遲載入(同Collection)
1. Sql語句:
Select order.*,
(select username from user where orders.user_id = user.id)username
(select sex from user whereorders.user_id = user.id)sex
from orders
2. 目的:
1) 首先載入orders表中的滿足orders.user_id = user.id條件的user_id。
2) 然後在需要時載入User表中orders.user_id = user.id項中的username和sex。
3. 方法:
1) 在SqlMapConfig.xml開啟延遲載入
2) 將上面的sql語句拆分成兩個statement,即:
SELECT * FROMorders
3) 關聯查詢使用者資訊,通過上邊查詢到的訂單資訊中user_id去關聯查詢使用者資訊。
4) 將這兩個statement通過resultMap關聯起來:上邊先去執行findOrdersUserLazyLoading,當需要去查詢使用者的時候再去執行findUserById。配置延遲載入的resultMap。
5) 小結:關係圖如下
查詢快取
Mybatis快取模型
1. 一級快取是SqlSession級別的快取。不同的sqlSession之間的快取資料區域(HashMap)是互相不影響的,預設自動開啟。
2. 二級快取是mapper的名稱空間級別的快取,一個名稱空間對應一個二級快取。多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級快取,二級快取是跨SqlSession的
一級快取
原理
1. 第一次發起查詢使用者id為1的使用者資訊,先去找快取中是否有id為1的使用者資訊,如果沒有,從資料庫查詢使用者資訊。得到使用者資訊,將使用者資訊儲存到一級快取中。
2. 第二次發起查詢使用者id為1的使用者資訊,先去找快取中是否有id為1的使用者資訊,快取中有,直接從快取中獲取使用者資訊。
3. 如果sqlSession去執行commit操作(執行插入、更新、刪除),清空SqlSession中的一級快取,這樣做的目的為了讓快取中儲存的是最新的資訊,避免髒讀。
二級快取
原理
使用方法
1. 在Mybatis的全域性配置檔案中(SqlMapconfig.xml檔案)開啟開啟二級快取。
2. 在mapper.xml對映檔案中開啟二級快取
3. 對需要快取的pojo實體類物件實現序列化,這是因為二級快取資料儲存介質多種多樣,為了將快取資料取出執行反序列化操作。
二級快取常用標籤設定
1. useCache配置:在statement中設定useCache=false可以禁用當前select語句的二級快取。針對每次查詢都需要最新的資料sql,要設定成useCache=false,禁用二級快取。
<selectid="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">
2. 重新整理快取(清空快取):設定statement配置中的flushCache="true" 屬性,預設情況下為true即重新整理快取。一般下執行完commit操作都需要重新整理快取,flushCache=true表示重新整理快取,這樣可以避免資料庫髒讀。(一般無需特別設定)
<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User" flushCache="true">
Mybatis整合ehcache
分散式快取
1. 優點:快取的資料在各各服務單獨儲存,不方便系統開發,使用分散式快取對快取資料進行集中管理。
整合方法
mybatis無法實現分散式快取,需要和其它分散式快取框架進行整合。
1. 實質:mybatis提供了一個cache介面,如果要實現自己的快取邏輯,實現cache介面開發即可。
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一個cache介面的實現類。
2. 與ehcache整合步驟
1) 匯入ehcache包
2) 加入ehcache的配置檔案:在classpath下配置ehcache.xml
3) 配置mapper中cache中的type為ehcache對cache介面的實現型別
Spring和Mybatis整合
整合的內容
1. 需要spring通過單例方式管理SqlSessionFactory。
2. spring和mybatis整合生成代理物件,使用SqlSessionFactory建立SqlSession。(spring和mybatis整合自動完成)。
3. 持久層的mapper都需要由spring進行管理。
整合方法
1. 建立整合環境
2. 在spring中配置SQLSessionFactory:(applicationConfig.xml)
3. spring管理mapper的代理物件,即將mapper的代理物件注入的spring容器中
1) 遵循規範:將mapper.java和mapper.xml對映檔名稱保持一致,且在一個目錄中。
2) 自動掃描出來的bean 的id為mapper類名,首字母小寫。
3) Mybatis掃描包與Spring掃描包的關係