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