MyBatis 原始碼分析

2021-10-23 00:09:26 字數 4273 閱讀 2057

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...