1. 程式人生 > 其它 >Docker學習筆記3 -- 資料卷

Docker學習筆記3 -- 資料卷

Mybatis 面試題

MyBatis-Plus 優點

Mybatis-Plus是一個Mybatis的增強工具,只是在Mybatis的基礎上做了增強卻不做改變,MyBatis-Plus支援所有Mybatis原生的特性,所以引入Mybatis-Plus不會對現有的Mybatis構架產生任何影響。

1、依賴少:僅僅依賴 Mybatis 以及 Mybatis-Spring 。

2、損耗小:啟動即會自動注入基本 CURD,效能基本無損耗,直接面向物件操作 。

3、預防Sql注入:內建 Sql 注入剝離器,有效預防Sql注入攻擊 。

4、通用CRUD操作:內建通用 Mapper、通用 Service,僅僅通過少量配置即可實現單表大部分 CRUD 操作,更有強大的條件構造器,滿足各類使用需求 。

5、多種主鍵策略:支援多達4種主鍵策略(內含分散式唯一ID生成器),可自由配置,完美解決主鍵問題 。

6、支援熱載入:Mapper 對應的 XML 支援熱載入,對於簡單的 CRUD 操作,甚至可以無 XML 啟動

7、支援ActiveRecord:支援 ActiveRecord 形式呼叫,實體類只需繼承 Model 類即可實現基本 CRUD 操作

8、支援程式碼生成:採用程式碼或者 Maven 外掛可快速生成 Mapper 、 Model 、 Service 、 Controller 層程式碼(生成自定義檔案,避免開發重複程式碼),支援模板引擎、有超多自定義配置等。

9、支援自定義全域性通用操作:支援全域性通用方法注入( Write once, use anywhere )。

10、支援關鍵詞自動轉義:支援資料庫關鍵詞(order、key…)自動轉義,還可自定義關鍵詞 。

11、內建分頁外掛:基於 Mybatis 物理分頁,開發者無需關心具體操作,配置好外掛之後,寫分頁等同於普通List查詢。

12、內建效能分析外掛:可輸出 Sql 語句以及其執行時間,建議開發測試時啟用該功能,能有效解決慢查詢 。

13、內建全域性攔截外掛:提供全表 delete 、 update 操作智慧分析阻斷,預防誤操作。

14、預設將實體類的類名查詢資料庫中的表,使用@TableName(value="table1")註解指定表名,@TableId指定表主鍵,若欄位與表中欄位名保持一致可不加註解。

#{}與${}的區別

井{}實現了預編譯,預防了SQL注入的問題,${}是字串的替換。

Mybatis的傳值方式

單個傳值
順序傳值
物件傳值
Map傳值
列表傳值

Mybatis中的標籤

【cache】:給定名稱空間的快取配置。
【cache-ref】:引用其他名稱空間的快取配置。
【resultMap】:描述如何從資料庫結果集中來載入物件。
【sql】:定製SQL片段。id為唯一標識,使用“引入sql片段。”
【insert】:對映插入語句。
【update】:對映更新語句。
【delete】:對映刪除語句。
【select】:對映查詢語句。
【動態sql,主要由if、where、foreach、set等動態標籤組成】

Mybatis的三級快取

Mybatis快取可以大大提升系統的效能,Mybatis提供一級快取和二級快取。

MyBatis的快取分為一級快取和二級快取,兩種快取的快取粒度是一樣的,都是對應一條sql查詢語句,但是二者的生命週期是不一樣的,一級快取的生命週期是SqlSession物件的使用期間,隨著SqlSession物件的死亡而消失;二級快取的生命週期是同MyBatis應用一樣長。

一級快取

MyBatis 預設開啟了一級快取,一級快取是在SqlSession 層面進行快取的。即,同一個SqlSession ,多次呼叫同一個Mapper和同一個方法的同一個引數,只會進行一次資料庫查詢,然後把資料快取到緩衝中,以後直接先從快取中取出資料,不會直接去查資料庫。

但是不同的SqlSession物件,因為不用的SqlSession都是相互隔離的,所以相同的Mapper、引數和方法,他還是會再次傳送到SQL到資料庫去執行,返回結果。

一級快取失效

  1. sqlSession不同

  2. 當sqlSession物件相同的時候,查詢的條件不同,原因是第一次查詢時候一級快取中沒有第二次查詢所需要的資料

  3. 當sqlSession物件相同,兩次查詢之間進行了插入的操作

  4. 當sqlSession物件相同,手動清除了一級快取中的資料

二級快取

為了克服這個問題,需要開啟二級快取,是的快取zaiSqlSessionFactory層面給各個SqlSession 物件共享。預設二級快取是不開啟的,需要手動進行配置。

一級快取可能存在髒讀情況,預設的二級快取畢竟也是儲存在本地快取,所以對於微服務下是可能出現髒讀的情況的,所以這時候我們可能會需要自定義快取,比如利用redis來儲存快取,而不是儲存在本地記憶體當中。

自定義快取

MyBatis官方也提供了一些第三方快取的支援,如:encache和redis。

如果要實現一個自己的快取的話,那麼我們只需要新建一個類實現Cache介面就好了 。

參考資料