Mybatis原始碼分析 整體設計 一

2021-09-19 21:12:16 字數 2714 閱讀 8203

ssm是目前常見的構建web專案的方案,mybatis是其中重要的一環,如果能深刻的理解mybatis的內部原理,對我們會有極大的幫助,接下來一起看看mybatis的內部設計。

搭建mybatis的基本執行環境,參考mybatis入門

貼上自己的**

public static void main(string args)  catch (ioexception e) finally }}

獲取mybatis的配置檔案,內部通過classloader載入檔案流,這一步需要對classloader有一定的理解,裡面相對簡單,就不多說了

resources.getresourceasstream("mybatis.xml");
建立sqlsessionfactory, 通過jdk內部的w3c解析配置檔案的內容,封裝到configration物件中,最後通過configuration來建立defaultsqlsessionfactory.

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

}}

public sqlsessionfactory build(configuration config)

通過sqlsessionfactory建立sqlsession物件

}sqlsession通過key獲取到與key繫結的sql語句,並且執行,最後獲取到結果。這步內部可以細分

@override

public listselectlist(string statement, object parameter, rowbounds rowbounds) catch (exception e) finally

}

不同的executor內部的查詢方法不同,後面我們詳細講解不同的executor。這次先看******executor.

@override

boundsql boundsql = ms.getboundsql(parameter);

cachekey key = createcachekey(ms, parameter, rowbounds, boundsql);

return query(ms, parameter, rowbounds, resulthandler, key, boundsql); }

@suppresswarnings("unchecked")

@override

errorcontext.instance().resource(ms.getresource()).activity("executing a query").object(ms.getid());

if (closed)

if (querystack == 0 && ms.isflushcacherequired())

listlist;

try else

} finally

if (querystack == 0)

// issue #601

deferredloads.clear();

if (configuration.getlocalcachescope() == localcachescope.statement)

}return list;

}

query方法中真正的查詢交給子類的doquery,而******executor的doquery如下

@override

statement stmt = null;

try finally

}

statementhandler內部的呼叫,結果集處理使用的是defaultresultsethandler,內部resultset的處理屬於jdbc的知識,想看懂mybatis,對jdbc也要有一定的理解

獲取到結果返回給我們

這次大致看了下mybatis的基本執行流程,涉及到了幾個關鍵的類

mybatis的過程相比spring mvc更直觀一些,不過需要熟悉jdbc的知識,內部還有一些細節,後續繼續研究

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