Mybatis執行流程分析(原始碼篇)

2021-09-12 11:59:23 字數 3975 閱讀 3198

1. sqlsessionfactory 與 sqlsession.

通過前面的章節對於mybatis 的介紹及使用,大家都能體會到sqlsession的重要性了吧, 沒錯,從表面上來看,咱們都是通過sqlsession去執行sql語句(注意:是從表面看,實際的待會兒就會講)。那麼咱們就先看看是怎麼獲取sqlsession的吧:

(1)首先,sqlsessionfactorybuilder去讀取mybatis的配置檔案,然後build乙個defaultsqlsessionfactory。原始碼如下:

/**

* 一系列的構造方法最終都會呼叫本方法(配置檔案為reader時會呼叫本方法,還有乙個inputstream方法與此對應)

* @param reader

* @param environment

* @param properties

* @return

*/public sqlsessionfactory build(reader reader, string environment, properties properties) catch (exception e) finally catch (ioexception e)

}} public sqlsessionfactory build(configuration config)

(2)當我們獲取到sqlsessionfactory之後,就可以通過sqlsessionfactory去獲取sqlsession物件。原始碼如下:

/**

* 通常一系列opensession方法最終都會呼叫本方法

* @param exectype

* @param level

* @param autocommit

* @return

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

}

通過以上步驟,咱們已經得到sqlsession物件了。接下來就是該幹嘛幹嘛去了(話說還能幹嘛,當然是執行sql語句咯)。看了上面,咱們也回想一下之前寫的demo, 

sqlsessionfactory sessionfactory = null;  

string resource = "mybatis-conf.xml";

try catch (ioexception e)

//通過sqlsessionfactory獲取sqlsession

sqlsession sqlsession = sessionfactory.opensession();

還真這麼一回事兒,對吧! 

sqlsession咱們也拿到了,咱們可以呼叫sqlsession中一系列的select...,  insert..., update..., delete...方法輕鬆自如的進行crud操作了。 就這樣? 那咱配置的對映檔案去哪兒了?  別急, 咱們接著往下看:

(1)通過sqlsession從configuration中獲取。原始碼如下:

/**

* 什麼都不做,直接去configuration中找, 哥就是這麼任性

*/@override

}

(2)sqlsession把包袱甩給了configuration, 接下來就看看configuration。原始碼如下:

/**

* @param type

* @param sqlsession

* @return*/}

/**

* 爛活淨讓我來做了,沒法了,下面沒人了,我不做誰來做

* @param type

* @param sqlsession

* @return

*/@suppresswarnings("unchecked")

}try catch (exception e)

}

/**

* 別人虐我千百遍,我待別人如初戀

* @return

*/@suppresswarnings("unchecked")

//動態**我們寫的dao介面

} public t newinstance(sqlsession sqlsession)

通過以上的動態**,咱們就可以方便地使用dao介面啦, 就像之前咱們寫的demo那樣:

user insertuser = new user();

別急,還沒完, 咱們還沒看具體是怎麼執行sql語句的呢。

接下來,咱們才要真正去看sql的執行過程了。

/**

*/@override

public object invoke(object proxy, method method, object args) throws throwable catch (throwable t) }}

/**

* 看著**不少,不過其實就是先判斷crud型別,然後根據型別去選擇到底執行sqlsession中的哪個方法,繞了一圈,又轉回sqlsession了

* @param sqlsession

* @param args

* @return

*/public object execute(sqlsession sqlsession, object args) else if (sqlcommandtype.update == command.gettype()) else if (sqlcommandtype.delete == command.gettype()) else if (sqlcommandtype.select == command.gettype()) else if (method.returnsmany()) else if (method.returnsmap()) else

} else

if (result == null && method.getreturntype().isprimitive() && !method.returnsvoid())

return result;

}

既然又回到sqlsession了, 那麼咱們就看看sqlsession的crud方法了,為了省事,還是就選擇其中的乙個方法來做分析吧。這兒,咱們選擇了selectlist方法:

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

}

然後,通過一層一層的呼叫,最終會來到doquery方法, 這兒咱們就隨便找個excutor看看doquery方法的實現吧,我這兒選擇了******executor:

statement stmt = null;

try finally

}接下來,咱們看看statementhandler 的乙個實現類 preparedstatementhandler(這也是我們最常用的,封裝的是preparedstatement), 看看它使怎麼去處理的:

public listquery(statement statement, resulthandler resulthandler) throws sqlexception
到此, 一次sql的執行流程就完了。

mybatis執行流程

記錄一下自己對mybatis的理解和心得.是自己手寫的乙個mybatisdemo,比較簡陋,只有乙個簡單的查詢語句,但是麻雀雖小五臟俱全,可以理解整個mybatis的執行流程.載入全域性配置檔案 將配置檔案載入到inputstream中,dcoumentutils將stream轉換為document...

mybatis執行流程

通過配置檔案取到sqlsessionfactory string resource mybatis config.xml inputstream inputstream null try catch ioexception e sqlsessionfactory new sqlsessionfact...

簡說django CBV執行流程,與部分原始碼分析

cbv class base views 就是在檢視裡使用類處理請求。python是乙個物件導向的程式語言,如果只用函式來開發,有很多物件導向的優點就錯失了 繼承 封裝 多型 所以django在後來加入了class based view。可以讓我們用類寫view。這樣做的優點主要下面兩種 提高了 的...