核心部件:
mybatis全域性配置檔案:
<?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
}
再繼續看query()和queryfromdatabase()這兩個方法
@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 的工作原理
在了解如何建立sqlsessionfactory之前,先看一下mybatis是如何載入全域性配置檔案,解析xml檔案生成configuration的 public configuration parse parsed true parseconfiguration parser.evalnode c...
MyBatis 的工作原理
1 讀取 mybatis 配置檔案 mybatis config.xml 為 mybatis 的全域性配置檔案,配置了 mybatis 的執行環境等資訊,例如資料庫連線資訊。2 載入對映檔案。對映檔案即 sql 對映檔案,該檔案中配置了運算元據庫的 sql 語句,需要在 mybatis 配置檔案 m...
mybatis工作原理
1.讀取配置檔案 連資料庫的相關資訊 2.有了這些資訊就能建立sqlsessionfactory sqlsessionfactory的生命週期是程式級,程式執行的時候建立起來,程式結束的時候消亡 3.sqlsessionfactory建立sqlsession,目的執行sql語句 sqlsession...