国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

MyBatis源碼淺析(一)開篇

2019-11-26 13:34:26
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

源碼學(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))。
可見,最終都有executor來(lái)完成。

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來(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)的,但靈活性卻得到了極大增加。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 遵化市| 馆陶县| 旌德县| 九江县| 青海省| 兰州市| 大埔县| 赫章县| 葫芦岛市| 和田县| 江山市| 韩城市| 崇文区| 正镶白旗| 南溪县| 筠连县| 文登市| 三江| 江津市| 新巴尔虎左旗| 双辽市| 时尚| 九江市| 安乡县| 康保县| 富阳市| 怀集县| 石嘴山市| 青州市| 冕宁县| 香格里拉县| 天柱县| 都兰县| 景泰县| 二连浩特市| 博湖县| 南华县| 昔阳县| 广河县| 军事| 南和县|