mybatis執行對資料庫的操作主要通過sqlsession完成的,sqlsession是個介面,它有兩個實現類,defaultsqlsession和sqlsessionmanager。
sqlsessionmanager有三個成員變數
// 用來建立sqlsession
private final sqlsessionfactory sqlsessionfactory;
// sqlsession的實現通過這個動態**session例項執行
private final sqlsession sqlsessionproxy;
// 先通過threadlocallocalsqlsession獲取sqlsession,如果獲取不到則通過:opensession新開乙個session,如果存在就使用。
private final threadlocallocalsqlsession = new threadlocal<>();
一般情況下,我們通過以下方法可以獲取到sqlsession物件
reader resourceasstream = resources.getresourceasreader("mybatis-config.xml");
sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(resourceasstream);
sqlsession sqlsession = sqlsessionfactory.opensession();
在呼叫sqlsessionfactorybuilder的build()方法時,通過原始碼可以發現,build方法被過載了9次。
org.apache.ibatis.session.sqlsessionfactorybuilder:
public sqlsessionfactory build(reader reader);
public sqlsessionfactory build(reader reader, string environment);
public sqlsessionfactory build(reader reader, properties properties);
// 上面三種方法其實最後都會呼叫這個方法
public sqlsessionfactory build(reader reader, string environment, properties properties);
public sqlsessionfactory build(inputstream inputstream);
public sqlsessionfactory build(inputstream inputstream, string environment);
public sqlsessionfactory build(inputstream inputstream, properties properties);
// 上面這三種方法最後都會呼叫這個方法,和第4行方法的區別是,這裡接收的是乙個位元組流,而第4行接收的是乙個字元流
public sqlsessionfactory build(inputstream inputstream, string environment, properties properties);
// 這個方法最終都會被第4個和第8個方法通過build(parser.parse())方法呼叫
public sqlsessionfactory build(configuration config)
第4行和第8行的具體實現其實都是一樣的,只是接收的流不一樣,乙個是位元組流,乙個是字元流,以第8行方法實現為例:
org.apache.ibatis.session.sqlsessionfactorybuilder:
public sqlsessionfactory build(inputstream inputstream, string environment, properties properties) catch (exception e) finally catch (ioexception e)
}}
先來簡單看下xmlconfigbuilder,可以看到xmlconfigbuilder和sqlsessionfactorybuilder有些類似,xmlconfigbuilder的構造方法被過載了7次。
public xmlconfigbuilder(reader reader);
public xmlconfigbuilder(reader reader, string environment);
// 上面兩個構造方法也是呼叫這個,用的是字元流
public xmlconfigbuilder(reader reader, string environment, properties props);
public xmlconfigbuilder(inputstream inputstream);
public xmlconfigbuilder(inputstream inputstream, string environment);
// 上面兩個構造方法也是呼叫這個,用的是位元組流
public xmlconfigbuilder(inputstream inputstream, string environment, properties props);
// 第3行和第6行方法都是呼叫的這個方法。這個方法被私有化了,應該是作者不允許有人從外部直接呼叫
private xmlconfigbuilder(xpathparser parser, string environment, properties props);
第7行xmlconfigbuilder構造方法實現
org.apache.ibatis.builder.xml.xmlconfigbuilder
private xmlconfigbuilder(xpathparser parser, string environment, properties props)
回到sqlsessionfactorybuilder,接下來是parser.parse()實現,這個方法主要是對mybatis-config.xml配置檔案做了解析
org.apache.ibatis.builder.xml.xmlconfigbuilder:
public configuration parse()
// 接下來要開始解析了,所以提前將它標識為已解析,避免後續呼叫parse時又被解析一遍
parsed = true;
// mybatis-config.xml根節點就是configuration
parseconfiguration(parser.evalnode("/configuration"));
return configuration;
}
mybatis-config.xml配置檔案結構:
<?xml version="1.0" encoding="utf-8" ?>
最後看下parseconfiguration()方法做了哪些事,parseconfiguration()將mybatis-config.xml配置所有的子節點一一解析。
org.apache.ibatis.builder.xml.xmlconfigbuilder:
private void parseconfiguration(xnode root) catch (exception e)
}
最後,parse()方法返回configuration物件,在sqlsessionfactorybuilder中build方法接收這個物件並呼叫,返回defaultsqlsessionfactory物件。通過opensession()方法可以返回defaultsqlsession,defaultsqlsession繼承自sqlsession。
參考:
(一) Mybatis 原始碼解析之原始碼概述
原始碼結構圖 基礎支撐層 技術元件專注於底層技術實現,通用性較強無業務含義 核心處理層 業務元件專注 mybatis 的業務流程實現,依賴於基礎支撐層 介面層 mybatis 對外提供的訪問介面,面向 sqlsession 程式設計 原始碼腦圖結構 原始碼結構圖 建議和腦圖一起看,了解每個包存在的意...
Mybatis 原始碼分析
mybatis解析 2 sqlsessionfactorybean 繼承了 initializingbean 介面,在bean解析的finishbeanfactoryinitialization 的方法對 initializingbean介面中的 afterpropertiesset 方法進行呼叫,...
mybatis原始碼解析
最近閱讀了許久的mybatis原始碼,小有所悟。同時也發現網上有許多優秀的mybatis原始碼講解博文。本人打算把自己閱讀過的 覺得不錯的一些博文列出來。以此進一步加深對mybatis框架的理解。其實還有乙個目的是,本人也想寫一系列博文來分享自己對mybatis的理解。然而。個人文筆太差,列出的這些...