MyBatis源碼淺析(一)開篇
源碼學(xué)習(xí)的好處不用多說,Mybatis源碼量少、邏輯簡(jiǎn)單,將寫個(gè)系列文章來學(xué)習(xí)。
SqlSession
Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSession,發(fā)現(xiàn)它是個(gè)接口,必然有個(gè)默認(rèn)實(shí)現(xiàn)類org.apache.ibatis.session.defaults包中的DefaultSqlSession。我們從來沒有new過這個(gè)類,按照J(rèn)ava慣例使用SqlSessionFactory里的工廠方法。發(fā)現(xiàn)它也是個(gè)接口,必然有默認(rèn)實(shí)現(xiàn)類DefaultSqlSessionFactory。該類依然不用自己創(chuàng)建,使用SqlSessionFactoryBuilder里的工廠方法。
DefaultSqlSession
DefaultSqlSession里主要方法:
1)Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds),委托給executor.queryCursor(ms, wrapCollection(parameter), rowBounds)。
2)List<E> selectList(String statement, Object parameter, RowBounds rowBounds)和void select(String statement, Object parameter, RowBounds rowBounds, ResultHandler handler),委托給executor.query(ms, wrapCollection(parameter), rowBounds, handler)。
3)int update(String statement, Object parameter),委托給executor.update(ms, wrapCollection(parameter))。
可見,最終都有executor來完成。
Executor
Executor位于org.apache.ibatis.executor包中,是個(gè)接口,實(shí)現(xiàn)類是BaseExecutor和CachingExecutor。其中BaseExecutor是抽象的,有三個(gè)子類SimpleExecutor、ReuseExecutor和BatchExecutor,見名知意。BaseExecutor里主要方法:
1)List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql)和List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql),委托為抽象的abstract <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql)。
2)Cursor<E> queryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds),委托給抽象的abstract <E> Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql)。
3)int update(MappedStatement ms, Object parameter),委托給抽象的abstract int doUpdate(MappedStatement ms, Object parameter)。
基類處理公共部分,具體留給子類實(shí)現(xiàn)。
再看下SimpleExecutor里的主要方法:
1)List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql),委托給handler.<E>query(stmt, resultHandler)。
2)Cursor<E> doQueryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds, BoundSql boundSql),委托給handler.<E>queryCursor(stmt)。
3)int doUpdate(MappedStatement ms, Object parameter),委托給handler.update(stmt)。
可見,最終由handler來處理。
StatementHandler
StatementHandler位于org.apache.ibatis.executor.statement包中,是個(gè)接口,實(shí)現(xiàn)類是BaseStatementHandler和RoutingStatementHandler。BaseStatementHandler是抽象的,有三個(gè)子類SimpleStatementHandler、PreparedStatementHandler和CallableStatementHandler。這三個(gè)應(yīng)該比較熟悉,分別處理不帶參數(shù)的sql語(yǔ)句、參數(shù)化sql語(yǔ)句和存儲(chǔ)過程。再看SimpleStatementHandler里的主要方法:
1)List<E> query(Statement statement, ResultHandler resultHandler),委托給statement.execute(sql)。
2)Cursor<E> queryCursor(Statement statement),委托給statement.execute(sql)。
3)int update(Statement statement),委托給statement.execute(sql)。
最終由statement執(zhí)行sql。這就回到了java.sql包了。
Mybatis主要完成對(duì)sql參數(shù)的封裝處理、結(jié)果集的獲取并生成對(duì)象,而把sql語(yǔ)句的構(gòu)建過程留給用戶。Mybatis的作者故意這樣設(shè)計(jì)的。雖然框架從整體來看是半自動(dòng)的,但靈活性卻得到了極大增加。
相關(guān)文章
Java中如何取出String字符串括號(hào)中的內(nèi)容
這篇文章主要介紹了Java中如何取出String字符串括號(hào)中的內(nèi)容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
java實(shí)現(xiàn)最短路徑算法之Dijkstra算法
這篇文章主要介紹了java實(shí)現(xiàn)最短路徑算法之Dijkstra算法, Dijkstra算法是最短路徑算法中為人熟知的一種,是單起點(diǎn)全路徑算法,有興趣的可以了解一下2017-10-10
Java String字符串內(nèi)容實(shí)現(xiàn)添加雙引號(hào)
這篇文章主要介紹了Java String字符串內(nèi)容實(shí)現(xiàn)添加雙引號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Spring?Security?登錄時(shí)添加圖形驗(yàn)證碼實(shí)現(xiàn)實(shí)例
這篇文章主要為大家介紹了Spring?Security?登錄時(shí)添加圖形驗(yàn)證碼實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
IDEA創(chuàng)建maven項(xiàng)目時(shí)在tomcat運(yùn)行瀏覽器404的問題
這篇文章主要介紹了IDEA創(chuàng)建maven項(xiàng)目時(shí)在tomcat運(yùn)行瀏覽器404的問題及解決方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
解決Netty解碼http請(qǐng)求獲取URL亂碼問題
這篇文章主要介紹了解決Netty解碼http請(qǐng)求獲取URL亂碼問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Struts2 通過ognl表達(dá)式實(shí)現(xiàn)投影
這篇文章主要介紹了Struts2 通過ognl表達(dá)式實(shí)現(xiàn)投影,具有一定參考價(jià)值,需要的朋友可以了解下。2017-09-09
JAVA-NIO之Socket/ServerSocket Channel(詳解)
下面小編就為大家?guī)硪黄狫AVA-NIO之Socket/ServerSocket Channel(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06

