欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis源碼淺析(一)開(kāi)篇

 更新時(shí)間:2016年11月12日 11:27:02   作者:李新杰  
源碼的學(xué)習(xí)好處多多,Mybatis源碼量少、邏輯簡(jiǎn)單。下面將通過(guò)本文給大家詳解,低mybatis源碼淺析感興趣的朋友一起看看吧

源碼學(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)題(詳解)

    基于多線程并發(fā)的常見(jiàn)問(wèn)題(詳解)

    下面小編就為大家?guī)?lái)一篇基于多線程并發(fā)的常見(jiàn)問(wèn)題(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼生成(后端工具類)

    Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼生成(后端工具類)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)滑動(dòng)驗(yàn)證碼生成功能中的后端工具類部分,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • java實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)五子棋游戲

    java實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單控制臺(tái)五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 深入分析JAVA Vector和Stack的具體用法

    深入分析JAVA Vector和Stack的具體用法

    這篇文章主要介紹了深入分析JAVA Vector和Stack的具體用法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • Java多個(gè)版本切換的幾種方法

    Java多個(gè)版本切換的幾種方法

    本文主要介紹了Java多個(gè)版本切換的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Java并發(fā)之條件阻塞Condition的應(yīng)用代碼示例

    Java并發(fā)之條件阻塞Condition的應(yīng)用代碼示例

    這篇文章主要介紹了Java并發(fā)之條件阻塞Condition的應(yīng)用代碼示例,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Mybatis如何傳入多個(gè)參數(shù)的實(shí)現(xiàn)代碼

    Mybatis如何傳入多個(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-12
  • 圖解Java排序算法之快速排序的三數(shù)取中法

    圖解Java排序算法之快速排序的三數(shù)取中法

    這篇文章主要為大家詳細(xì)介紹了Java排序算法之快速排序的三數(shù)取中法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java實(shí)現(xiàn)切割wav音頻文件的方法詳解【附外部jar包下載】

    java實(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

    這篇文章主要介紹了一小時(shí)迅速入門Mybatis之實(shí)體類別名與多參數(shù) 動(dòng)態(tài)SQL,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09

最新評(píng)論