Mybatis 的工作原理

2021-09-29 13:05:33 字數 4623 閱讀 8720

<?xml version="1.0" encoding="utf-8" ?>

在了解如何建立sqlsessionfactory之前,先看一下mybatis是如何載入全域性配置檔案,解析xml檔案生成configuration的

public configuration parse() 

parsed = true;

parseconfiguration(parser.evalnode("/configuration"));

return configuration;

}private void parseconfiguration(xnode root) catch (exception e)

}

在上面的第二段**中有一句

if (parent != null) else else }}

}}

private void configurationelement(xnode context) 

builderassistant.setcurrentnamespace(namespace);

cacherefelement(context.evalnode("cache-ref"));

cacheelement(context.evalnode("cache"));

buildstatementfromcontext(context.evalnodes("select|insert|update|delete"));

} catch (exception e)

}

其中具體解析每乙個sql語句節點的是

buildstatementfromcontext(context.evalnodes("select|insert|update|delete"));
public void parsestatementnode()
string id,

sqlsource sqlsource,

statementtype statementtype,

sqlcommandtype sqlcommandtype,

integer fetchsize,

integer timeout,

string parametermap,

class> parametertype,

string resultmap,

class> resulttype,

resultsettype resultsettype,

boolean flushcache,

boolean usecache,

boolean resultordered,

keygenerator keygenerator,

string keyproperty,

string keycolumn,

string databaseid,

languagedriver lang,

string resultsets)

最後回到我們的建立sqlsessionfactory上,之前的一切都是為了生成乙個sqlsessionfactory服務的

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

}} public sqlsessionfactory build(configuration config)

從上面的**可以看出最後是通過以configuration為引數build()方法生成defautsqlsessionfactory。

public sqlsession opensession() 

private sqlsession opensessionfromdatasource(executortype exectype, transactionisolationlevel level, boolean autocommit) catch (exception e) finally

}

//返回乙個sqlsession,預設使用defaultsqlsession

public defaultsqlsession(configuration configuration, executor executor, boolean autocommit)

executor在這一步得到建立,具體的使用在下一步。

在我的**裡執行的是

user user = sqlsession.selectone("test.finduserbyid", 1);
具體到裡面的方法就是

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

}

@suppresswarnings("unchecked")

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

if (closed) throw new executorexception("executor was closed.");

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

listlist;

try else

} finally

if (querystack == 0)

deferredloads.clear(); // issue #601

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

}return list;

}

listlist;

localcache.putobject(key, execution_placeholder);

try finally

localcache.putobject(key, list);

if (ms.getstatementtype() == statementtype.callable)

return list;

} 在這兩個方法裡面會為當前的查詢建立乙個快取key,如果快取中沒有值,直接從資料庫中讀取,執行查詢後將得到的list結果放入快取之中。

緊接著看doquery()在******executor類中重寫的方法

statement stmt = null;

try finally

} statement連線物件就是在這裡建立的,因此executor的作用之一就是建立statement了,建立完後又把statement丟給statementhandler返回list查詢結果。

接下來再看一下這裡的兩個方法preparestatement()和query()的具體實現

private statement preparestatement(statementhandler handler, log statementlog) throws sqlexception 

public listquery(statement statement, resulthandler resulthandler) throws sqlexception

preparestatement()是建立statement的具體實現方法,呼叫parameterize()對建立的statement物件設定引數,即為我們設為佔位符的地方賦上指定的引數,parameterize()方法再深入進去就是呼叫parameterhandler的setparameters()方法具體賦值了。

這裡的query()是呼叫了resultsethandler的handleresultsets(statement) 方法。作用就是把resultset結果集物件轉換成list型別的集合。

總結以上步驟就是:

根據具體傳入的引數,動態地生成需要執行的sql語句,用boundsql物件表示

為當前的查詢建立乙個快取key

快取中沒有值,直接從資料庫中讀取資料

執行查詢,返回list 結果,然後 將查詢的結果放入快取之中

根據既有的引數,建立statementhandler物件來執行查詢操作

將建立statement傳遞給statementhandler物件,呼叫parameterize()方法賦值

呼叫statementhandler.query()方法,返回list結果集

以上三個步驟所有流程大體可以用一張圖來總結

Mybatis 的工作原理

核心部件 mybatis全域性配置檔案 在了解如何建立sqlsessionfactory之前,先看一下mybatis是如何載入全域性配置檔案,解析xml檔案生成configuration的。public configuration parse parsed true parseconfigurati...

MyBatis 的工作原理

1 讀取 mybatis 配置檔案 mybatis config.xml 為 mybatis 的全域性配置檔案,配置了 mybatis 的執行環境等資訊,例如資料庫連線資訊。2 載入對映檔案。對映檔案即 sql 對映檔案,該檔案中配置了運算元據庫的 sql 語句,需要在 mybatis 配置檔案 m...

mybatis工作原理

1.讀取配置檔案 連資料庫的相關資訊 2.有了這些資訊就能建立sqlsessionfactory sqlsessionfactory的生命週期是程式級,程式執行的時候建立起來,程式結束的時候消亡 3.sqlsessionfactory建立sqlsession,目的執行sql語句 sqlsession...