前言
MyBatis框架中使用的5種設計模式分別是:1、建造者模式(生成器模式)。2、工廠模式。3、單例模式。4、代理模式。5、適配器模式。
1、建造者模式(生成器模式)
在MyBatis環境的初始化過程中,SqlSessionFactoryBuilder
會調用?XMLConfigBuilder
讀取
所有的MyBatisMapConfig.xml
和所有的 *Mapper.xml
文件,構建MyBatis運行的核心對象
Configuration
對象,然后將該Configuration
對象作為參數構建一個SqlSessionFactory
對
象。
2、工廠模式
-
在MyBatis中比如
SqlSessionFactory
使用的是工廠模式,該工廠沒有那么復雜的邏輯,是一個簡單工廠模式。 -
SqlSession
可以認為是一個MyBatis工作的核心的接口,通過這個接口可以執行執行SQL語句、獲取Mappers、管理事務。類似于連接MySQL的Connection
對象。
3、單例模式
-
在MyBatis中有兩個地方用到單例模式,
ErrorContext
和LogFactory
,其中ErrorContext
???????是用在每個線程范圍內的單例,用于記錄該線程的執行環境錯誤信息,而LogFactory
則是提供給整個MyBatis使用的日志工廠,用于獲得針對項目配置好的日志對象。
?public class ErrorContext {/*** 每個線程各自的數據*/private static final ThreadLocal<ErrorContext> LOCAL = new ThreadLocal<>();?private ErrorContext() {}?public static ErrorContext instance() {ErrorContext context = LOCAL.get();if (context == null) {context = new ErrorContext();LOCAL.set(context);}return context;}?}
-
構造函數是private修飾,具有一個static的局部instance變量和一個獲取instance變量的方法,在獲取實例的方法中,先判斷是否為空如果是的話就先創建,然后返回構造好的對象。
-
只是這里有個有趣的地方是,LOCAL的靜態實例變量使用了
ThreadLocal
修飾,也就是說它屬于每個線程各自的數據,而在instance()
方法中,先獲取本線程的該實例,如果沒有就創建該線程獨有的ErrorContext
。
4、代理模式
代理模式可以認為是MyBatis的核心使用的模式,正是由于這個模式,我們只需要編寫 Mapper.java
接口,不需要實現,由MyBatis后臺幫我們完成具體SQL的執行。
5、適配器模式
-
在MyBatis的logging包中,有一個Log接口:
該接口定義了MyBatis直接使用的日志方法,而Log接口具體由誰來實現呢?
-
MyBatis提供了多種日志框架的實現,這些實現都匹配這個Log接口所定義的接口方法,最終實現了所有外部日志框架到MyBatis日志包的適配。