mybatis原始碼解讀(3)

2021-06-28 20:04:06 字數 2235 閱讀 1334

string resource = "mybatis-config.xml"

;inputstream inputstream = resources.getresourceasstream(resource);

sqlsessionfactory sqlsessionfactory = new sqlsessionfactorybuilder().build(inputstream);

//建立sqlsession

sqlsession session = sqlsessionfactory.opensession();

try finally

前面五句是讀取配置檔案,然後構建sqlsessionfactory和sqlsession,具體怎麼解析配置檔案,再構建sqlsessionfactory現在暫時不看,我們現在主要看看怎麼拿到sql語句,然後去資料庫執行。

重點在sqlsession的selectone實現:

org.apache.ibatis.session.defaults.defaultsqlsession

selectone方法:

public

t selectone(string statement, object parameter) else

if (list.size() > 1) else

}

這邊selectone方法就是selectlist後,再拿第乙個。正常邏輯。

selectlist方法:

public

list

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

}

rowbounds:查詢列表時的limit限制。包括offset(偏移量)和limit(大小)。

select * from person where id = #

select>

list

result = executor.query(ms, wrapcollection(parameter), rowbounds, executor.no_result_handler);

executor是哪兒來的?

我能說是在opensession的時候建立的。然後以後再看嗎?

好吧,我錯了。上**

org.apache.ibatis.session.defaults.defaultsqlsessionfactory#opensessionfromdatasource

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

}

就是在opensession的時候建立的。根據tx(事務管理器),和執行器型別建立的。這裡面就不深究下去了。因為太深。還是以後有功夫再看吧。

回到selectlist。

看executor.query的引數。

第乙個是ms,上面講到的sql語句的一些環境配置資訊。

第二個是引數,sql要執行的引數。這裡做了乙個wrapcollection。實際上就是list和array塞到map中,好方面之後獲取。

private object wrapcollection(final object object)  else

if (object != null && object.getclass

().isarray

())

return

object;

}

第三個是rowbounds上面也講到了。

最後乙個是resulthandler就是結果處理器,sql執行完後,怎麼印射到相應物件中。

靠。就講了乙個方法要一章節啊。煩不煩啊!

附這節的uml圖:

別問我為什麼帶個2.

mybatis原始碼解讀(7)

private void typealiaseselement xnode parent else else catch classnotfoundexception e alias author type domain.blog.author alias blog type domain.blog...

spring session原始碼解讀 3

省略 sessionrepositoryfilter繼承了onceperrequestfilter,父類的dofilter最終會將具體的處理邏輯交給子類處理。abstract class onceperrequestfilter implements filter else onceperreque...

mobx原始碼解讀3

計算屬性 function todo var vm new todo mobx.autorun function 這種方式 已經被廢掉 要求使用修飾符或修飾方法 function todo this var vm new todo mobx.autorun function 也可以使用ie8發明的g...