MyBatis源碼淺析(一)開篇
源碼學(xué)習(xí)的好處不用多說,Mybatis源碼量少、邏輯簡單,將寫個系列文章來學(xué)習(xí)。
SqlSession
Mybatis的使用入口位于org.apache.ibatis.session包中的SqlSession,發(fā)現(xiàn)它是個接口,必然有個默認實現(xiàn)類org.apache.ibatis.session.defaults包中的DefaultSqlSession。我們從來沒有new過這個類,按照Java慣例使用SqlSessionFactory里的工廠方法。發(fā)現(xiàn)它也是個接口,必然有默認實現(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包中,是個接口,實現(xiàn)類是BaseExecutor和CachingExecutor。其中BaseExecutor是抽象的,有三個子類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)。
基類處理公共部分,具體留給子類實現(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包中,是個接口,實現(xiàn)類是BaseStatementHandler和RoutingStatementHandler。BaseStatementHandler是抽象的,有三個子類SimpleStatementHandler、PreparedStatementHandler和CallableStatementHandler。這三個應(yīng)該比較熟悉,分別處理不帶參數(shù)的sql語句、參數(shù)化sql語句和存儲過程。再看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主要完成對sql參數(shù)的封裝處理、結(jié)果集的獲取并生成對象,而把sql語句的構(gòu)建過程留給用戶。Mybatis的作者故意這樣設(shè)計的。雖然框架從整體來看是半自動的,但靈活性卻得到了極大增加。
相關(guān)文章
Java并發(fā)之條件阻塞Condition的應(yīng)用代碼示例
這篇文章主要介紹了Java并發(fā)之條件阻塞Condition的應(yīng)用代碼示例,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-02-02Mybatis如何傳入多個參數(shù)的實現(xiàn)代碼
這篇文章主要介紹了Mybatis如何傳入多個參數(shù)的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12java實現(xiàn)切割wav音頻文件的方法詳解【附外部jar包下載】
這篇文章主要介紹了java實現(xiàn)切割wav音頻文件的方法,結(jié)合實例形式詳細分析了java切割wav音頻文件的相關(guān)原理、操作技巧與注意事項,并附帶外部jar包供讀者下載,需要的朋友可以參考下2019-05-05一小時迅速入門Mybatis之實體類別名與多參數(shù) 動態(tài)SQL
這篇文章主要介紹了一小時迅速入門Mybatis之實體類別名與多參數(shù) 動態(tài)SQL,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09