Mybatis原始碼日記(一)

2022-03-30 10:42:49 字數 4018 閱讀 3807

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的理解。然而。個人文筆太差,列出的這些...