Mybatis原始碼分析(1)

2022-10-11 17:30:15 字數 4767 閱讀 6895

目錄2、從**開始?

3、快取

ognl的三要素

表示式:ognl表示式是功能強大的表示式語言,何解?在ognl中想要執行取值,賦值,呼叫方法等等操作,你都需要用表示式表示。通過表示式,底層會解析出來你的想要操作。它支援鏈式結構

根物件:即root物件,可以理解為ognl的操作物件,表示式規定做什麼,而該物件就指定對誰操作。ognl叫做物件圖導航語言,物件圖就是以任意乙個物件作為根,通過ognl可以訪問到與這個物件相關的其他物件。底層使用list集合做的。

context物件:其實就是ognl的上下文環境。root物件也在ognl的上下文環境裡,底層是乙個map集合。該上下文環境規定了ognl操作在「**進行」,注意訪問context物件時候需要在表示式中加上#。

j**assist是乙個開源的分析、編輯和建立j**a位元組碼的類庫。是由東京工業大學的數學和電腦科學系的 shigeru chiba (千葉 滋)所建立的。它已加入了開放源**jboss

應用伺服器專案,通過使用j**assist對位元組碼操作為jboss實現動態"aop"框架。

核心內容如下:

log4j的1.2版本是乙個通用版本,但是由於2023年的log4j漏洞原因,slf4j-log4j模組在build時,會自動重定向至slf4j-reload4j模組。

如果你想繼續使用log4j 1.x的框架,強烈推薦你使用slf4j-reload4j進行替代。

基於類的動態**

hsqldb是乙個開放源**的j**a資料庫,其具有標準的sql語法和j**a介面,它可以自由使用和分發,非常簡潔和快速的

apache derby是乙個完全用j**a編寫的資料庫

h2是乙個短小精幹的嵌入式資料庫引擎,主要的特性包括: 免費、開源、快速 嵌入式的資料庫伺服器,支援集群 提供jdbc、odbc訪問介面

什麼是mockito

mockito是乙個非常優秀的模擬框架,可以使用它簡潔的api來編寫漂亮的測試**,它的測試**可讀性高同時會產生清晰的錯誤日誌。

velocity是乙個基於j**a的模板引擎,可以通過特定的語法獲取在j**a物件的資料 , 填充到模板中,從而實現介面和j**a**的分離!

postgresql是一種特性非常齊全的自由軟體的物件-關係型資料庫管理系統(ordbms)

j**a連線mysql資料庫

mysql 是最流行的關係型資料庫管理系統,在 web 應用方面 mysql 是最好的 rdbms(relational database management system:關聯式資料庫管理系統)應用軟體之一

用於通過位元組流|字元流構建sqlsessionfactory

內部構建過程:

public sqlsessionfactory build(reader reader, string environment, properties properties)  catch (exception e)  finally 

} catch (ioexception e)

}}

這個類可以被例項化、使用和丟棄,一旦建立了 sqlsessionfactory,就不再需要它了。 因此 sqlsessionfactorybuilder 例項的最佳作用域是方法作用域(也就是區域性方法變數)。 你可以重用 sqlsessionfactorybuilder 來建立多個 sqlsessionfactory 例項,但最好還是不要一直保留著它,以保證所有的 xml 解析資源可以被釋放給更重要的事情

通過一些配置去建立sqlsession,例如:autocommit|connection|transactionisolationlevel|executortype

sqlsessionfactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由丟棄它或重新建立另乙個例項。使用 sqlsessionfactory 的最佳實踐是在應用執行期間不要重複建立多次,因此 sqlsessionfactory 的最佳作用域是應用作用域。 有很多方法可以做到,最簡單的就是使用單例模式或者靜態單例模式。

使用 mybatis 的主要 j**a 介面。通過此介面,您可以執行命令、獲取對映器和管理事務

每個執行緒都應該有它自己的 sqlsession 例項。sqlsession 的例項不是執行緒安全的,因此是不能被共享的,所以它的最佳的作用域是請求或方法作用域。

// 以下非全部方法,只是作為舉例

public inte***ce sqlsession extends closeable

絕對不能將 sqlsession 例項的引用放在乙個類的靜態域,甚至乙個類的例項變數也不行。也絕不能將 sqlsession 例項的引用放在任何型別的託管作用域中,比如 servlet 框架中的 httpsession,如果你現在正在使用一種 web 框架,考慮將 sqlsession 放在乙個和 http 請求相似的作用域中。 換句話說,每次收到 http 請求,就可以開啟乙個 sqlsession,返回乙個響應後,就關閉它。 這個關閉操作很重要,為了確保每次都能執行關閉操作,你應該把這個關閉操作放到 finally 塊中。 下面的示例就是乙個確保 sqlsession 關閉的標準模式:

try (sqlsession session = sqlsessionfactory.opensession())
所有**中都遵循這種使用模式,可以保證所有資料庫資源都能被正確地關閉。

cache:快取的頂級介面,定義了快取的增刪改查、獲取大小,id等行為

perpetualcache:在mybatis裡面,它是一級快取、二級快取的最基本實現 (詳細參見),一下是所有特性的快取模式均在包:org.apache.ibatis.cache.decorators下:

blockingcache:讀阻塞快取,對應的key沒有被快取的話,將會阻塞所有需要獲取該key資料(也可以設定超時時間)的執行緒,直到有其他執行緒在快取中設定該key資料後,阻塞執行緒將繼續執行後續

fifocache:固定大小佇列快取,維護了乙個佇列,可以設定佇列大小(預設1024個位置),如果新進來乙個key值,使得快取集合中長度大於設定的長度,則將根據先進先出(first in, first out)原則,刪除最先進來的key-value鍵值對兒,此佇列只與put方法超過長度時有關,刪除快取元素不影響佇列中的元素

loggingcache:記錄快取命中率日誌快取,獲取快取的命中率日誌(命中快取key的個數與請求快取總數的比率)

lrucache:最近最少使用的快取,內部維護了乙個linkedhashmap,通過removeeldestentry方法找到最近最老的key進行刪除

scheduledcache:定時清空快取,在增刪改查入口做了校驗,該校驗用於檢查定時時間是否超過設定預期時間,超過則清空快取資料

serializedcache:序列化快取,將key對應的value值以物件流的形式存於快取中

softcache:軟引用快取,每次操作都會對應的將原來已被垃圾收集器收集過的物件資料刪除,put操作會put乙個軟引用資料快取

synchronizedcache:同步快取,內部幾乎所有方法均加鎖,是乙個執行緒安全的快取

transactionalcache:事務性快取,內部有兩個方法,commiit以及rollback,在沒有commit之前將所有key-value鍵值對臨時存於乙個內部map中,commit之後,將臨時map以及get的時候的key空資料儲存與真正的快取中

weakcache:若引用快取,沒什麼可解釋的

讓每一種特性的快取都實現了事務的功能

內部維護了乙個map

private final maptransactionalcaches = new hashmap<>();
put是為傳入的型別的快取設定資料,在commit提交方法時,對每中特性快取例項中的資料輪循做一次提交

public void putobject(cache cache, cachekey key, object value) 

private transactionalcache gettransactionalcache(cache cache)

public void commit()

}public void rollback()

}

構造快取用的,內部維護了乙個implementation(預設是:perpetualcache),decorators(預設只有乙個lrucache)

public class cachebuilder 

}

總結:這裡mybatis在快取的設計上用了裝飾器模式、抽象工廠模式

Mybatis 原始碼分析

mybatis解析 2 sqlsessionfactorybean 繼承了 initializingbean 介面,在bean解析的finishbeanfactoryinitialization 的方法對 initializingbean介面中的 afterpropertiesset 方法進行呼叫,...

Mybatis原始碼分析

我們都知道mybatis它是一款優秀的持久層框架,它支援定製化sql 儲存過程以及高階對映,幫我們節省了許多時間與精力,今天我們主要來對mybatis的底層原始碼進行分析,主要是以下4行 首先呼叫resources中的單個string引數的getresuorceasstream string res...

MyBatis 原始碼分析

sqlsession inte ce,代表乙個連線資料庫的會話,提供了乙個預設的 defaultsqlsession sqlsessionfactory inte ct,建立 sqlsessionfactory 的工廠,提供了預設的 defaultsqlsessionfactory建立 defaul...