MyBatis源碼淺析(一)開(kāi)篇
源碼學(xué)習(xí)的好處不用多說(shuō),Mybatis源碼量少、邏輯簡(jiǎn)單,將寫個(gè)系列文章來(lái)學(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。我們從來(lái)沒(méi)有new過(guò)這個(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))。
可見(jiàn),最終都有executor來(lái)完成。
Executor
Executor位于org.apache.ibatis.executor包中,是個(gè)接口,實(shí)現(xiàn)類是BaseExecutor和CachingExecutor。其中BaseExecutor是抽象的,有三個(gè)子類SimpleExecutor、ReuseExecutor和BatchExecutor,見(jiàn)名知意。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)。
可見(jiàn),最終由handler來(lái)處理。
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ǔ)過(guò)程。再看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)建過(guò)程留給用戶。Mybatis的作者故意這樣設(shè)計(jì)的。雖然框架從整體來(lái)看是半自動(dòng)的,但靈活性卻得到了極大增加。
相關(guān)文章
基于多線程并發(fā)的常見(jiàn)問(wèn)題(詳解)
下面小編就為大家?guī)?lái)一篇基于多線程并發(fā)的常見(jiàn)問(wèn)題(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼生成(后端工具類)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼生成功能中的后端工具類部分,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-10-10java實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)五子棋游戲
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Java并發(fā)之條件阻塞Condition的應(yīng)用代碼示例
這篇文章主要介紹了Java并發(fā)之條件阻塞Condition的應(yīng)用代碼示例,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02Mybatis如何傳入多個(gè)參數(shù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了Mybatis如何傳入多個(gè)參數(shù)的實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12java實(shí)現(xiàn)切割wav音頻文件的方法詳解【附外部jar包下載】
這篇文章主要介紹了java實(shí)現(xiàn)切割wav音頻文件的方法,結(jié)合實(shí)例形式詳細(xì)分析了java切割wav音頻文件的相關(guān)原理、操作技巧與注意事項(xiàng),并附帶外部jar包供讀者下載,需要的朋友可以參考下2019-05-05一小時(shí)迅速入門Mybatis之實(shí)體類別名與多參數(shù) 動(dòng)態(tài)SQL
這篇文章主要介紹了一小時(shí)迅速入門Mybatis之實(shí)體類別名與多參數(shù) 動(dòng)態(tài)SQL,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09