sqlsession: inte***ce, 代表乙個連線資料庫的會話, 提供了乙個預設的 defaultsqlsession
sqlsessionfactory: inte***ct, 建立 sqlsessionfactory 的工廠, 提供了預設的 defaultsqlsessionfactory建立 defaultsqlsession, (這裡使用工廠方法設計模式)
sqlsessionfactorybuilder: 構建sqlsessionfactory的構建類, 內部讀取預設的 configuration預設配置和讀取xml 配置, (此處使用外觀設計模式, 將內部組合操作封裝, 對外提供統一的操作)
sqlsessionmanager: 實現了 sqlsession, sqlsessionfactory兩個介面; sqlsession 管理類, 從sqlsessionfactory的建立 到 factory 建立 sqlsession 到 sqlsession執行 sql 都封裝在內, 對外提供了操作方法
public
class
sqlsessionmanager
implements
sqlsessionfactory
, sqlsession
,new
sqlsessioninterceptor()
);}public
static sqlsessionmanager newinstance
(reader reader)..
....
public
void
startmanagedsession()
....
..@override
public sqlsession opensession
(boolean autocommit)..
....
private
class
sqlsessioninterceptor
implements
invocationhandler
@override
public object invoke
(object proxy, method method, object[
] args)
throws throwable
catch
(throwable t)
}else
catch
(throwable t)}}}}}
sqlsessionmanager 維護了三個屬性:
sqlsessionfactory sqlsessionfactory、
sqlsessionproxy sqlsessionproxy、
threadlocal localsqlsession
sqlsessionproxy 是 jdk 實現的動態**例項, **的目標物件是執行的 sqlsession, 如果在執行 sql 前沒有呼叫startmanagedsession()方法, 則每次sqlsessionfactory建立乙個 sqlsession , 如果呼叫了, localsqlsession獲取當前執行緒的 sqlsession 執行, (這裡使用了動態**設計模式)
executor: inte***ce, 執行器介面, sqlsessionmanager 實現了 sqlsession 的介面, 所有可以提供運算元據庫的方法, 內部使用 sqlsessionproxy ** sqlsession 執行, sqlsession 的預設實現類是 defaultsqlsession 類, 內部執行 sql 實際是由 executor 實現的, 並且提供了多種執行器, 這裡多種執行器策略實現(使用了策略設計模式)
事務管理有兩個實現類, jdbctransaction 和 managedtransaction 內部封裝了 connection 和 datasource
事務管理器的建立使用 transactionfactory建立, (此處也使用了工廠方法設計模式)
事務管理也是在 sqlsession中提供的, 預設使用transaction_none, 客戶端不指定事務隔離級別, 使用資料庫的預設事務隔離級別
四個執行器實現類 ******executor, reuseexecutor, batchexecutor 和 cachingexecutor
******executor提供簡單的 statement 執行方法, 每次獲取新的 statement, 操作完關閉
reuseexecutor 提供快取 statement, 內部維護乙個statementmap 以 sql 字串為 key, 以 statement 為 value 的 hashmap
batchexecutor 提供以 jdbc提供的executebatch的批量執行功能
cachingexecutor 快取執行器, 內部維護了乙個 executor delegate, 這是最終真正執行操作的執行器, cachingexecutor執行器提供了二級快取的功能, 更新操作重新整理快取, 查詢操作使用快取, 在 query 方法內, statement 檢查是否開啟快取, 如果沒開啟直接執行delegate.query, 如果開啟了 txm 檢視是否有快取, 拿到快取, 返回, 如果沒有執行delegate.query, (這裡使用了裝飾設計模式)
提供datasourcefactory 資料來源工廠介面, mybatis 在使用 sqlsessionmanager 構建 session 前, sqlsessionfactorybuilder會讀取 configuration, 配置內包含資料來源的配置, 使用配置內的資料來源建立 datasource
預設 mybatis 提供了unpooleddatasourcefactory , pooleddatasourcefactory, jndidatasourcefactory三個工廠類, unpooleddatasource和pooleddatasource兩個資料來源類, (這裡使用了工廠方法設計模式)
在 sqlsessionfactorybuilder 中使用 datasourcefactory 類讀取配置中的工廠類, 所以可以實現datasourcefactory介面自定義工廠類建立相應的資料來源
unpooleddatasource 提供基本的資料來源功能, 管理連線, 驅動使用者名稱密碼等資訊, pooleddatasource 繼承unpooleddatasource, 內部維護unpooleddatasource, 並且內部管理的資料也是由 unpooleddatasource管理的, 差別是pooleddatasource還維護了乙個 poolstate的池, 管理多個連線
public
class
public
void
(class
type)
boolean loadcompleted =
false
;try
finally}}
}}
這裡使用了工廠方法設計模式和動態**設計模式mybatis 對外提供 sqlsessionmanager 的統一操作,
sqlsessionfactorybuilder通過讀取的配置建立 sqlsessionfactory
此時初始化完成, 通過 sqlsessionmanager運算元據庫, 包括獲取 session, 執行 sql 等
sqlsessionmanager 通過 sqlsessionfactory建立 sqlsession, 為每個執行緒提供乙個 session
sqlsessionmanager呼叫執行 sqlsessionproxy **當前執行緒的 sqlsession操作 executor 執行 statement
最後返回結果
Mybatis 原始碼分析
mybatis解析 2 sqlsessionfactorybean 繼承了 initializingbean 介面,在bean解析的finishbeanfactoryinitialization 的方法對 initializingbean介面中的 afterpropertiesset 方法進行呼叫,...
Mybatis原始碼分析
我們都知道mybatis它是一款優秀的持久層框架,它支援定製化sql 儲存過程以及高階對映,幫我們節省了許多時間與精力,今天我們主要來對mybatis的底層原始碼進行分析,主要是以下4行 首先呼叫resources中的單個string引數的getresuorceasstream string res...
MyBatis原始碼分析
將mybatis config.xml加載入inputstream中。呼叫sqlsessionfactotybuilder build 方法,將流傳入其中。sqlsessionfactotybuilder build 方法中有乙個xmlconfigbuilder類解析xml中的內容,封裝為乙個con...