詳解Mybatis核心類SqlSessionFactory的構(gòu)建
請(qǐng)大家搬好小板凳,指北君將會(huì)用最通俗易懂,圖文并茂的方式,給大家深入剖析 Mybatis 的實(shí)現(xiàn)原理。
本篇文章我們首先解析 SqlSessionFactory 的創(chuàng)建過程。
1、實(shí)例代碼
在實(shí)例代碼中,我們?cè)跍y(cè)試類中寫了一個(gè) init() 方法,里面包括了 SqlSessionFactory 的構(gòu)建,分為兩步。
第一步:讀取配置文件 mybatis-config.xml 輸入流
第二步:根據(jù)輸入流構(gòu)建 SqlSessionFactory;
public?void?init()?{
????//定義mybatis全局配置文件
????String?resource?=?"mybatis-config.xml";
????//加載?mybatis?全局配置文件
????InputStream?inputStream?=?null;
????try?{
????????inputStream?=?Resources.getResourceAsStream(resource);
????}?catch?(IOException?e)?{
????????e.printStackTrace();
????}
????//構(gòu)建sqlSession的工廠
????sessionFactory?=?new?SqlSessionFactoryBuilder().build(inputStream);
}
沒什么難的,去掉 try-catch,也就兩行代碼。
InputStream?inputStream?=?Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory?sessionFactory?=?new?SqlSessionFactoryBuilder().build(inputStream);
是的,那只是你以為的兩行代碼,其實(shí)......

話不多說,指北君就來給大家揭秘這冰山下面的東西。
2、代碼剖析
根據(jù)上面的時(shí)序圖,我們分析根據(jù)源碼分析每個(gè)步驟。
①、獲取配置文件輸入流
InputStream?inputStream?=?Resources.getResourceAsStream("mybatis.config.xml");
這里沒什么好說的,就是獲取配置文件的輸入流。
②、build(in)
這里的 in 就是上一步獲取的輸入流 inputStream。
??public?SqlSessionFactory?build(InputStream?inputStream)?{
????return?build(inputStream,?null,?null);
??}
在進(jìn)入到 build 方法:
??public?SqlSessionFactory?build(InputStream?inputStream,?String?environment,?Properties?properties)?{
????try?{
??????XMLConfigBuilder?parser?=?new?XMLConfigBuilder(inputStream,?environment,?properties);
??????return?build(parser.parse());
????}?catch?(Exception?e)?{
??????throw?ExceptionFactory.wrapException("Error?building?SqlSession.",?e);
????}?finally?{
??????ErrorContext.instance().reset();
??????try?{
????????inputStream.close();
??????}?catch?(IOException?e)?{
????????//?Intentionally?ignore.?Prefer?previous?error.
??????}
????}
??}
③、XMLConfigBuilder(in)
這一段代碼是為了解析我們的配置文件,配置文件是 XML形式 ,我在之前的博客介紹過解析 XML 的幾種方式。
一種是基于樹的結(jié)構(gòu)來解析的稱為DOM;另一種是基于事件流的形式稱為SAX和(StAX)
兩者各有優(yōu)缺點(diǎn),我這里不做詳細(xì)說明,想了解的可以看我之前的文章。
而 Mybatis 使用的是 DOM 形式,并結(jié)合 XPath 來解析配置文件。
④、parse()
????public?Configuration?parse()?{
????????if?(this.parsed)?{
????????????throw?new?BuilderException("Each?XMLConfigBuilder?can?only?be?used?once.");
????????}?else?{
????????????this.parsed?=?true;
????????????this.parseConfiguration(this.parser.evalNode("/configuration"));
????????????return?this.configuration;
????????}
????}
從 /configuration 標(biāo)簽處開始解析。然后我們進(jìn)入到 this.parseConfiguration() 方法中:
????private?void?parseConfiguration(XNode?root)?{
????????try?{
????????????this.propertiesElement(root.evalNode("properties"));
????????????Properties?settings?=?this.settingsAsProperties(root.evalNode("settings"));
????????????this.loadCustomVfs(settings);
????????????this.loadCustomLogImpl(settings);
????????????this.typeAliasesElement(root.evalNode("typeAliases"));
????????????this.pluginElement(root.evalNode("plugins"));
????????????this.objectFactoryElement(root.evalNode("objectFactory"));
????????????this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
????????????this.reflectorFactoryElement(root.evalNode("reflectorFactory"));
????????????this.settingsElement(settings);
????????????this.environmentsElement(root.evalNode("environments"));
????????????this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));
????????????this.typeHandlerElement(root.evalNode("typeHandlers"));
????????????this.mapperElement(root.evalNode("mappers"));
????????}?catch?(Exception?var3)?{
????????????throw?new?BuilderException("Error?parsing?SQL?Mapper?Configuration.?Cause:?"?+?var3,?var3);
????????}
????}
看到這是不是很熟悉了,這不就是mybatis-config.xml 配置文件里面的各個(gè)標(biāo)簽名嘛,是的,這就是解析該文件,然后全部放在 configuration 對(duì)象中。需要注意的是,這里的 configuration 對(duì)象不僅包括 mybatis-config.xml 文件內(nèi)容,也包括 xxxMapper.xml 文件內(nèi)容。

⑤、build(configuration)
??public?SqlSessionFactory?build(Configuration?config)?{
????return?new?DefaultSqlSessionFactory(config);
??}
就是去 new 了一個(gè) DefaultSqlSessionFactory 對(duì)象,將 configuration 作為參數(shù)。
⑥、DefaultSqlSessionFactory(configuration)
????public?DefaultSqlSessionFactory(Configuration?configuration)?{
????????this.configuration?=?configuration;
????}
3、總結(jié)
自此,SqlSessionFactory 的創(chuàng)建過程就講完了,總的來說就是一個(gè)封裝了配置文件的工廠類。那么得到了 SqlSessionFactory 這個(gè)工廠對(duì)象,接下來干嘛?生產(chǎn) SqlSession,然后通過 SqlSession 進(jìn)行數(shù)據(jù)庫的增刪改查操作
沒錯(cuò),接下來,指北君將給大家介紹 SqlSession 的交互過程,這也是 Mybatis 里面最重要的一個(gè)對(duì)象。
到此這篇關(guān)于詳解Mybatis核心類SqlSessionFactory的構(gòu)建的文章就介紹到這了,更多相關(guān)Mybatis SqlSessionFactory內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解析Mybatis SqlSessionFactory初始化原理
- mybatis初始化SqlSessionFactory失敗的幾個(gè)原因分析
- MyBatis源碼解析——獲取SqlSessionFactory方式
- 使用Mybatis-Plus時(shí)的SqlSessionFactory問題及處理
- Mybatis SqlSessionFactory與SqlSession詳細(xì)講解
- Mybatis中自定義實(shí)例化SqlSessionFactoryBean問題
- MyBatis-plus報(bào)錯(cuò)Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required的解決方法
- 使用Mybatis時(shí)SqlSessionFactory對(duì)象總是報(bào)空指針
相關(guān)文章
elasticsearch分布式及數(shù)據(jù)的功能源碼分析
這篇文章主要為大家介紹了elasticsearch分布式及數(shù)據(jù)功能源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
java如何調(diào)用kettle設(shè)置變量和參數(shù)
文章簡(jiǎn)要介紹了如何在Java中調(diào)用Kettle,并重點(diǎn)討論了變量和參數(shù)的區(qū)別,以及在Java代碼中如何正確設(shè)置和使用這些變量,避免覆蓋Kettle中已設(shè)置的變量,作者分享了個(gè)人經(jīng)驗(yàn),并鼓勵(lì)大家參考和使用腳本之家2025-01-01
利用Spring?boot+LogBack+MDC實(shí)現(xiàn)鏈路追蹤
這篇文章主要介紹了利用Spring?boot+LogBack+MDC實(shí)現(xiàn)鏈路追蹤,MDC?可以看成是一個(gè)與當(dāng)前線程綁定的哈希表,可以往其中添加鍵值對(duì),下文詳細(xì)介紹需要的小伙伴可以參考一下2022-04-04
Java 創(chuàng)建線程的3種方法及各自的優(yōu)點(diǎn)
這篇文章主要介紹了Java 創(chuàng)建線程的3種方法及各自的優(yōu)點(diǎn),文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
詳解JavaEE 使用 Redis 數(shù)據(jù)庫進(jìn)行內(nèi)容緩存和高訪問負(fù)載
本篇文章主要介紹了JavaEE 使用 Redis 數(shù)據(jù)庫進(jìn)行內(nèi)容緩存和高訪問負(fù)載,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08
SpringBoot如何處理@KafkaListener消息
Spring通過KafkaMessageListenerContainer、ConcurrentMessageListenerContainer等組件實(shí)現(xiàn)Kafka消息的監(jiān)聽和處理,并通過@KafkaListener注解將業(yè)務(wù)邏輯與Kafka消費(fèi)者連接起來,Spring?Boot自動(dòng)配置Kafka相關(guān)組件,簡(jiǎn)化了Kafka的使用2024-12-12
你的Idea還有BUG嗎不妨試試另一個(gè)開發(fā)神器
Spring Tool Suite(STS)就是一個(gè)基于Eclipse的開發(fā)環(huán)境, 用于開發(fā)Spring應(yīng)用程序。本文給大家給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-12-12
SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼生成的方法
驗(yàn)證碼可以有效防止其他人對(duì)某一個(gè)特定的注冊(cè)用戶用特定的程序暴力 破解方式進(jìn)行不斷的登錄嘗試,斷的登錄嘗試2025-03-03
我們其實(shí)很經(jīng)??吹?登錄一些網(wǎng)站其實(shí)是需要驗(yàn)證碼的,本文給大家介紹了SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼生成的方法,需要的朋友可以參考下
SpringCloud動(dòng)態(tài)配置注解@RefreshScope與@Component的深度解析
在現(xiàn)代微服務(wù)架構(gòu)中,動(dòng)態(tài)配置管理是一個(gè)關(guān)鍵需求,本文將為大家介紹Spring Cloud中相關(guān)的注解@RefreshScope與@Component的使用,需要的小伙伴可以參考下2025-04-04

