Mybatis:常見面試題

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、二級緩存失效

  1. SqlSession未提交時,這個SqlSession查詢到的結果在緩存中是不存在的;
  2. 更新操作會導致緩存被清空;
  3. 多表關聯時,當前namespace無法感知其他namespace中對錶的修改,導致緩存數據變成髒數據。可以通過讓當前namespace引用其他namespace來共享二級緩存來解決。

 

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