1. 程式人生 > >mybatis 一對多,多對多等關係xml檔案中sql的寫法以及快取、延遲載入的配置寫法

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掃描包的關係