1、一級緩存和二級緩存
一級緩存是SqlSession級別的緩存,隨着SqlSession的創建而存在,隨着SqlSession的銷燬而銷燬。
二級緩存是命名空間級別的緩存,可以在同一個命名空間中的多個SqlSession之間通用,默認關閉。當查詢數據庫時,會先查詢二級緩存,然後查詢一級緩存,最後查詢數據庫。需要注意的是,如果結果即是自定義的Java bean,則需要該bean實現序列化接口,才能實現二級緩存。
2、插入如何獲取自增主鍵
insert操作有三個特有屬性:
- keyProperty:指定哪個列是主鍵,如果是聯合主鍵可以用逗號隔開;
- keyColumn:指定第幾列是主鍵,不能和keyProperty共用;
- useGeneratedKeys:是否使用自動增長,默認爲false;
將useGeneratedKeys設置爲true,在插入的時候,會回填Java Bean的id值,通過返回的對象可獲取主鍵值。
3、級聯
在查詢中配置查詢結果的某個或某幾個字段的值,來自於其他查詢語句。級聯有一對一、一對多、多對一、多對多這四種。
參考文章:https://zhuanlan.zhihu.com/p/40621891
4、延遲加載
級聯的優勢是能夠方便地獲取數據,但有時不需要獲取所有數據,這樣會多執行幾條SQL,性能下降,爲了解決這個問題,需要使用延遲加載,只要使用相關級聯數據時,纔會發送SQL去取回數據。
5、resultMap和resultType
resultType是返回的結果類型,可以是基本類型、自定義的java bean。如果是自定義的Java bean,要求取出的數據庫的數據的字段名必須和bean的字段名一致,才能進行映射;如果所有表字段和bean的字段都不一致,則獲得的bean實例爲空。
resultMap是最複雜的元素,可以配置映射規則、級聯、typeHandler等,與ResultType不能同時存在。如果表字段使用了下劃線命名,而Bean用駝峯命名,可以使用resultMap進行字段的映射。
6、二級緩存失效
- SqlSession未提交時,這個SqlSession查詢到的結果在緩存中是不存在的;
- 更新操作會導致緩存被清空;
- 多表關聯時,當前namespace無法感知其他namespace中對錶的修改,導致緩存數據變成髒數據。可以通過讓當前namespace引用其他namespace來共享二級緩存來解決。