1. sqlsessionfactory 與 sqlsession.
通過前面的章節對於mybatis 的介紹及使用,大家都能體會到sqlsession的重要性了吧, 沒錯,從表面上來看,咱們都是通過sqlsession去執行sql語句(注意:是從表面看,實際的待會兒就會講)。那麼咱們就先看看是怎麼獲取sqlsession的吧:
(1)首先,sqlsessionfactorybuilder去讀取mybatis的配置檔案,然後build乙個defaultsqlsessionfactory。原始碼如下:
/**(2)當我們獲取到sqlsessionfactory之後,就可以通過sqlsessionfactory去獲取sqlsession物件。原始碼如下:* 一系列的構造方法最終都會呼叫本方法(配置檔案為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)
/**通過以上步驟,咱們已經得到sqlsession物件了。接下來就是該幹嘛幹嘛去了(話說還能幹嘛,當然是執行sql語句咯)。看了上面,咱們也回想一下之前寫的demo,* 通常一系列opensession方法最終都會呼叫本方法
* @param exectype
* @param level
* @param autocommit
* @return
*/private sqlsession opensessionfromdatasource(executortype exectype, transactionisolationlevel level, boolean autocommit) catch (exception e) finally
}
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中獲取。原始碼如下:
/**(2)sqlsession把包袱甩給了configuration, 接下來就看看configuration。原始碼如下:* 什麼都不做,直接去configuration中找, 哥就是這麼任性
*/@override
}
/*** @param type
* @param sqlsession
* @return*/}
/*** 爛活淨讓我來做了,沒法了,下面沒人了,我不做誰來做
* @param type
* @param sqlsession
* @return
*/@suppresswarnings("unchecked")
}try catch (exception e)
}
/**通過以上的動態**,咱們就可以方便地使用dao介面啦, 就像之前咱們寫的demo那樣:* 別人虐我千百遍,我待別人如初戀
* @return
*/@suppresswarnings("unchecked")
//動態**我們寫的dao介面
} public t newinstance(sqlsession sqlsession)
user insertuser = new user();
別急,還沒完, 咱們還沒看具體是怎麼執行sql語句的呢。
接下來,咱們才要真正去看sql的執行過程了。
/***/@override
public object invoke(object proxy, method method, object args) throws throwable catch (throwable t) }}
/**既然又回到sqlsession了, 那麼咱們就看看sqlsession的crud方法了,為了省事,還是就選擇其中的乙個方法來做分析吧。這兒,咱們選擇了selectlist方法:* 看著**不少,不過其實就是先判斷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;
}
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。這樣做的優點主要下面兩種 提高了 的...