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到資料庫去執行,返回結果。
一級快取失效
-
sqlSession不同
-
當sqlSession物件相同的時候,查詢的條件不同,原因是第一次查詢時候一級快取中沒有第二次查詢所需要的資料
-
當sqlSession物件相同,兩次查詢之間進行了插入的操作
-
當sqlSession物件相同,手動清除了一級快取中的資料
二級快取
為了克服這個問題,需要開啟二級快取,是的快取zaiSqlSessionFactory層面給各個SqlSession 物件共享。預設二級快取是不開啟的,需要手動進行配置。
一級快取可能存在髒讀情況,預設的二級快取畢竟也是儲存在本地快取,所以對於微服務下是可能出現髒讀的情況的,所以這時候我們可能會需要自定義快取,比如利用redis來儲存快取,而不是儲存在本地記憶體當中。
自定義快取
MyBatis官方也提供了一些第三方快取的支援,如:encache和redis。
如果要實現一個自己的快取的話,那麼我們只需要新建一個類實現Cache介面就好了 。