對MyBatis源碼的理解
ORM框架:CRUD操作
1。SQL解析:
映射文件、注解--》映射器解析 XMLMapperBuilder MapperAnnotationBuilder
2。SQL執行:
SqlSession 接口--》Executor --》 SimpleExecutor ReuseExecutor 【Statement--JDBC】
3。結果映射:
ResultSetHandler
4。插件機制:
Interceptor
5。緩存機制--》
工作中 二級緩存 --》Redis做緩存
談談你對MyBatis中緩存的理解
緩存的作用:
不加緩存 ?1。查詢的效率降低 ?2。增大了數據庫的壓力
一級緩存:會話級別的
二級緩存:進程級別的
1。項目中要使用緩存 ?全局配置文件中 settings 我們需要打開, 在對應的映射文件中 <cache>
2。一級緩存是默認使用的。二級緩存我們需要自己開啟:源碼中是如何設計的?
一級和二級緩存的執行的先后順序:先查二級緩存。二級緩存沒有再看一級緩存。一級緩存如果還是沒有那么走數據庫查詢
作用域:一級緩存的作用域是session級別的,命中率很低
數據同步:DML操作的時候會清空緩存的數據
現在都是分布式環境,MyBatis如何實現三級緩存?
1。我們工作用到了三級緩存。通過Redis。怎么實現呢??
三級緩存的自定義實現。重寫Cache接口的讀寫方法
一級緩存是 MyBatis 默認開啟的,它存在于 SqlSession 級別,對同一個 SqlSession 內的查詢結果進行緩存。
二級緩存是基于 namespace 級別的緩存,可以在多個 SqlSession 之間共享。它需要在配置文件中進行開啟和配置。
要實現三級緩存,你可以考慮以下幾種方法:
- 使用分布式緩存:可以將二級緩存的數據存儲到分布式緩存系統中,如 Redis 或 Memcached。這樣,不同的應用實例或服務器可以共享緩存數據,實現三級緩存的效果。
- 自定義緩存實現:你可以自己開發一個緩存組件,并將其集成到 MyBatis 中。這個緩存組件可以在應用級別或系統級別進行管理,提供更高級別的緩存功能。
- 結合其他緩存框架:除了 MyBatis 的緩存,還可以使用其他專門的緩存框架,如 Spring Cache 等。通過將 MyBatis 的查詢結果與這些緩存框架集成,可以實現更復雜的緩存策略和多級緩存。
談談你對日志模塊的理解
日志模塊使用到了適配器模式,對于MyBatis中的數據庫的相關操作通過代理模式實現了日志的監控
談談你對SqlSessionFactory的理解
SqlSessionFactory:工廠模式:負責SqlSession對象的管理
全局的。我們應該對SqlSessionFactory做單例處理;
完成全局配置文件和映射文件的加載解析--》Configuration對象
談談你對SqlSession的理解
SqlSession具體處理每個CRUD操作
1。生命周期:需要做數據庫操作的時候會創建。不需要操作數據庫就關閉
2。作用:完成數據庫的操作
3。線程安全:SqlSession是線程不安全的 --》 單純的MyBatis的應用。我們就不能把SqlSession作用成員變量來使用 在Spring環境中怎么處理的 ?SqlSessionTemplate
談談你對MyBatis中的Executor的源碼理解
Executor:執行器。具體執行SQL操作
Executor:Simple Reuse Batch
CachingExecutor:緩存的裝飾
MyBatis中是如何對占位符進行賦值的?
SQL解析 # $ ==> ParameterHandler
- 定義占位符:在 SQL 語句中使用占位符,通常以
#{}
的形式表示。例如:SELECT * FROM table WHERE id = #{id}
。 - 設置參數:在執行 SQL 語句之前,需要通過 MyBatis 的接口或方法設置相應的參數值。這可以通過傳遞參數對象或使用參數映射來完成。
- 參數綁定:MyBatis 會將設置的參數與占位符進行綁定。它會根據參數的類型和名稱,將實際的值替換到占位符的位置。
- 執行 SQL 語句:當執行帶有占位符的 SQL 語句時,MyBatis 會將綁定后的參數值代入 SQL 中,并執行該語句。
Spring中是如何解決MySQL的SqlSession的線程安全問題的?
- 使用?
SqlSessionFactory
:Spring 會配置一個?SqlSessionFactory
,它負責創建和管理?SqlSession
?對象。SqlSessionFactory
?是線程安全的,可以在多個線程中共享使用。 - 依賴注入?
SqlSession
:通過 Spring 的依賴注入機制,將?SqlSession
?注入到需要使用數據庫操作的類中。這樣,每個類在使用?SqlSession
?時都可以獲得一個獨立的實例。 - 控制?
SqlSession
?的生命周期:Spring 可以管理?SqlSession
?的創建和關閉,確保在合適的時機創建和釋放?SqlSession
,避免資源泄漏。 - 線程隔離:每個使用?
SqlSession
?的線程都會獲得自己獨立的?SqlSession
?實例,從而避免了線程之間的競爭和數據不一致性問題。
通過以上方式,Spring 能夠有效地管理?SqlSession
?的線程安全問題,使得在多線程環境下使用 MyBatis 進行數據庫操作更加可靠和安全。
你對MyBatis中的Configuration的源碼的理解
- 配置信息存儲:
Configuration
?類中包含了眾多屬性,用于存儲各種配置項,如數據庫連接信息、映射文件路徑、插件配置等。這些配置信息通常通過 XML 配置文件或 Java 代碼進行設置。 - 映射解析:
Configuration
?負責解析映射文件(如 XML 格式的 mapper 文件),將其中的 SQL 語句、結果映射等信息加載到內存中,以便后續執行。 - 對象工廠和類型別名:它管理對象工廠,用于創建 MyBatis 中的各種對象,如?
SqlSession
。此外,還定義了類型別名,方便在配置中使用簡潔的名稱來引用 Java 類型。 - 插件管理:
Configuration
?支持插件機制,允許開發者注冊自定義插件來擴展 MyBatis 的功能。插件可以在執行過程中的特定點進行攔截和處理。 - 環境配置:包含了對數據庫環境的配置,如數據源、事務管理器等。可以根據不同的環境設置不同的配置。
- 緩存管理:管理 MyBatis 的緩存機制,包括一級緩存和二級緩存的配置。
- SQL 語句構建和執行:根據配置信息和映射文件,構建 SQL 語句,并通過執行器執行這些語句,返回結果。
Configuration:全局配置。映射文件解析的內容都保存在Configuration中
談談MyBatis中的插件原理
 1。插件的作用: 分頁 ?SQL檢查
2。插件的原理
- 攔截器接口:MyBatis 定義了一些攔截器接口,例如?
Interceptor
?接口。插件需要實現這些接口,以便在特定的執行點進行攔截。 - 插件注冊:在 MyBatis 的配置文件中,可以注冊插件。通過配置插件的相關信息,告訴 MyBatis 在哪些執行點應用插件。
- 執行點攔截:當 MyBatis 執行特定的操作時,如執行 SQL 語句、參數設置、結果映射等,會觸發相應的攔截器。插件可以在這些執行點之前或之后執行自定義的邏輯。
- 上下文傳遞:MyBatis 會將執行上下文傳遞給插件,插件可以通過這個上下文獲取相關的信息,如 SQL 語句、參數、結果等,并根據需要進行處理。
- 修改執行行為:插件可以根據自己的邏輯修改執行行為。例如,可以修改 SQL 語句、添加額外的參數、處理結果集等。
- 返回結果:插件執行完自定義邏輯后,可以選擇返回修改后的結果,或者將控制權交回給 MyBatis 繼續執行。