最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mybatis-plus查詢?cè)创a詳解

 更新時(shí)間:2022年03月02日 11:54:07   作者:這個(gè)世界太瘋狂了  
這篇文章主要介紹了mybatis-plus查詢?cè)创a解讀,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

配置詳情

pom.xml

dependency>
     <groupId>com.baomidou</groupId>
     <artifactId>mybatis-plus-boot-starter</artifactId>
     <version>3.4.1</version>
 </dependency>

mapper

public interface GenTableMapper extends BaseMapper<GenTable> {
}

測(cè)試類

@RunWith(SpringRunner.class)
@SpringBootTest(classes = GendemoApplication.class)
public class BlockqueueTestDemo {
    @Autowired
    GenTableMapper genTableMapper;
    @Test
    public void test(){
        List<GenTable> genTables = 
        genTableMapper.selectList(new QueryWrapper<>());
    }
}

debug流程

1.發(fā)現(xiàn) genTableMapper 是一個(gè)代理對(duì)象類型。

在這里插入圖片描述

2.進(jìn)入代理對(duì)象MybatisMapperProxy , 調(diào)用其invoke 方法,方法的Class類型為BaseMapper.selectList()

在這里插入圖片描述

3.其中cachedInvoker()方法會(huì)返回一個(gè)PlainMethodInvoker ,它重寫了MapperMethodInvoker 接口的invoke()方法

在這里插入圖片描述

4.最終會(huì)調(diào)用MybatisMapperMethodexecute()方法

在這里插入圖片描述

public class MybatisMapperMethod {
    public Object execute(SqlSession sqlSession, Object[] args) {
        Object result;
        switch (command.getType()) {
            case INSERT: {
                Object param = method.convertArgsToSqlCommandParam(args);
                result = rowCountResult(sqlSession.insert(command.getName(), param));
                break;
            }
            case UPDATE: {
                Object param = method.convertArgsToSqlCommandParam(args);
                result = rowCountResult(sqlSession.update(command.getName(), param));
                break;
            }
            case DELETE: {
                Object param = method.convertArgsToSqlCommandParam(args);
                result = rowCountResult(sqlSession.delete(command.getName(), param));
                break;
            }
            case SELECT:
                if (method.returnsVoid() && method.hasResultHandler()) {
                    executeWithResultHandler(sqlSession, args);
                    result = null;
                } else if (method.returnsMany()) {
                    result = executeForMany(sqlSession, args);
                } else if (method.returnsMap()) {
                    result = executeForMap(sqlSession, args);
                } else if (method.returnsCursor()) {
                    result = executeForCursor(sqlSession, args);
                } else {
                    Object param = method.convertArgsToSqlCommandParam(args);
                    // TODO 這里下面改了
                    if (IPage.class.isAssignableFrom(method.getReturnType())) {
                        result = executeForIPage(sqlSession, args);
                        // TODO 這里上面改了
                    } else {
                        result = sqlSession.selectOne(command.getName(), param);
                        if (method.returnsOptional()
                            && (result == null || !method.getReturnType().equals(result.getClass()))) {
                            result = Optional.ofNullable(result);
                        }
                    }
                }
                break;
            case FLUSH:
                result = sqlSession.flushStatements();
                break;
            default:
                throw new BindingException("Unknown execution method for: " + command.getName());
        }
        if (result == null && method.getReturnType().isPrimitive() && !method.returnsVoid()) {
            throw new BindingException("Mapper method '" + command.getName()
                + " attempted to return null from a method with a primitive return type (" + method.getReturnType() + ").");
        }
        return result;
    }
}

5.這是經(jīng)過(guò)判斷會(huì)進(jìn)入executeForMany(sqlSession, args)方法,此時(shí)方法和參數(shù)都顯示出來(lái)了。sqlSession的類型是SqlSessionTemplate , 為什么要注意這個(gè) sqlSession的類型?因?yàn)?code>SqlSession是一個(gè)接口,有很多實(shí)現(xiàn)類,有時(shí)候我們并不知道到底調(diào)用了哪個(gè)實(shí)現(xiàn)類的selectList()方法,這個(gè)時(shí)候我們看類型就知道了,就可以進(jìn)入SqlSessionTemplate類,找到selectList()打上斷點(diǎn),debug就過(guò)來(lái)了。

在這里插入圖片描述

6.利用同樣的方法,又調(diào)用了DefaultSqlSessionselectList()方法。

在這里插入圖片描述


7.來(lái)到DefaultSqlSessionselectList() 方法中,此時(shí)已經(jīng)進(jìn)入到mybatis的源碼范圍了。executor的類型是MybatisCachingExecutor

在這里插入圖片描述

8.此時(shí)要注意MybatisCachingExecutor 代理類的handler是一個(gè)Plugin

在這里插入圖片描述

在這里插入圖片描述

9.因?yàn)槲沂褂玫搅朔猪?yè)插件,所以會(huì)來(lái)到com.github.pagehelperPageInterceptor

在這里插入圖片描述

10.由MybatisCachingExecutor來(lái)執(zhí)行查詢

在這里插入圖片描述

11.MybatisCachingExecutor 委派 BaseExecutor 執(zhí)行查詢

在這里插入圖片描述

在這里插入圖片描述

12.最終委派到PreparedStatementHandler來(lái)處理

在這里插入圖片描述

13.最后由DefaultResultSetHandler來(lái)封裝結(jié)果集

@Override
  public List<Object> handleResultSets(Statement stmt) throws SQLException {
    ErrorContext.instance().activity("handling results").object(mappedStatement.getId());

    final List<Object> multipleResults = new ArrayList<>();
    int resultSetCount = 0;
    ResultSetWrapper rsw = getFirstResultSet(stmt);
    List<ResultMap> resultMaps = mappedStatement.getResultMaps();
    int resultMapCount = resultMaps.size();
    validateResultMapsCount(rsw, resultMapCount);
    while (rsw != null && resultMapCount > resultSetCount) {
      ResultMap resultMap = resultMaps.get(resultSetCount);
      handleResultSet(rsw, resultMap, multipleResults, null);
      rsw = getNextResultSet(stmt);
      cleanUpAfterHandlingResultSet();
      resultSetCount++;
    }
    String[] resultSets = mappedStatement.getResultSets();
    if (resultSets != null) {
      while (rsw != null && resultSetCount < resultSets.length) {
        ResultMapping parentMapping = nextResultMaps.get(resultSets[resultSetCount]);
        if (parentMapping != null) {
          String nestedResultMapId = parentMapping.getNestedResultMapId();
          ResultMap resultMap = configuration.getResultMap(nestedResultMapId);
          handleResultSet(rsw, resultMap, null, parentMapping);
        }
        rsw = getNextResultSet(stmt);
        cleanUpAfterHandlingResultSet();
        resultSetCount++;
      }
    return collapseSingleResultList(multipleResults);
  }

總結(jié)

為什么要一層一層的封裝?一層一層的委派?
這里面和緩存有關(guān),有興趣的可以自己了解一下。

下一篇打算記錄一下 mybatis-plus 的自動(dòng)配置過(guò)程,有興趣的可以持續(xù)關(guān)注一下。
文中有錯(cuò)誤的地方不吝賜教謝謝。

到此這篇關(guān)于mybatis-plus查詢?cè)创a走讀的文章就介紹到這了,更多相關(guān)mybatis-plus查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis的mapper.xml中if標(biāo)簽test判斷的用法說(shuō)明

    Mybatis的mapper.xml中if標(biāo)簽test判斷的用法說(shuō)明

    這篇文章主要介紹了Mybatis的mapper.xml中if標(biāo)簽test判斷的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • idea中方法、注釋、導(dǎo)入類折疊或是展開(kāi)的設(shè)置方法

    idea中方法、注釋、導(dǎo)入類折疊或是展開(kāi)的設(shè)置方法

    這篇文章主要介紹了idea中方法、注釋、導(dǎo)入類折疊或是展開(kāi)的設(shè)置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Java實(shí)現(xiàn)多用戶注冊(cè)登錄的幸運(yùn)抽獎(jiǎng)

    Java實(shí)現(xiàn)多用戶注冊(cè)登錄的幸運(yùn)抽獎(jiǎng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多用戶注冊(cè)登錄的幸運(yùn)抽獎(jiǎng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • maven依賴版本沒(méi)有按照最短路徑原則生效的解決方案

    maven依賴版本沒(méi)有按照最短路徑原則生效的解決方案

    這篇文章主要介紹了maven依賴版本沒(méi)有生效的解決方案,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下
    2021-01-01
  • Java獲取泛型實(shí)際類型的方法詳解

    Java獲取泛型實(shí)際類型的方法詳解

    這篇文章主要介紹了Java獲取泛型實(shí)際類型的方法詳解,泛型,即“參數(shù)化類型”,一提到參數(shù),最熟悉的就是定義方法時(shí)有形參列表,普通方法的形參列表中,每個(gè)形參的數(shù)據(jù)類型是確定的,而變量是一個(gè)參數(shù),需要的朋友可以參考下
    2023-11-11
  • Netty中解碼器的作用及實(shí)現(xiàn)詳解

    Netty中解碼器的作用及實(shí)現(xiàn)詳解

    這篇文章主要介紹了Netty中解碼器的作用及實(shí)現(xiàn)詳解,本章我們只需要讓客戶端發(fā)送消息的時(shí)候循環(huán)發(fā)送100次,服務(wù)端不變,看看服務(wù)端是不是接收到了100條消息,需要的朋友可以參考下
    2023-12-12
  • Java異常處理操作實(shí)例小結(jié)

    Java異常處理操作實(shí)例小結(jié)

    這篇文章主要介紹了Java異常處理操作,結(jié)合實(shí)例形式總結(jié)分析了java異常處理常見(jiàn)操作情況與相關(guān)處理技巧,需要的朋友可以參考下
    2019-07-07
  • Java流形式返回前端的實(shí)現(xiàn)示例

    Java流形式返回前端的實(shí)現(xiàn)示例

    ? Java后端開(kāi)發(fā)項(xiàng)目時(shí),需要給前端傳一些數(shù)據(jù),本文主要介紹了Java流形式返回前端的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java Map接口及其實(shí)現(xiàn)類原理解析

    Java Map接口及其實(shí)現(xiàn)類原理解析

    這篇文章主要介紹了Java Map接口及其實(shí)現(xiàn)類原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java編程之xpath介紹

    java編程之xpath介紹

    這篇文章主要介紹了java編程之xpath介紹,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12

最新評(píng)論

宝兴县| 韩城市| 塔河县| 达孜县| 金昌市| 蒙自县| 石台县| 广饶县| 微山县| 北安市| 平远县| 溧阳市| 芦溪县| 饶河县| 河津市| 东莞市| 广河县| 贵德县| 济宁市| 东乌| 新闻| 南岸区| 中山市| 亳州市| 台前县| 通榆县| 东光县| 庆安县| 正镶白旗| 改则县| 青海省| 高青县| 泸水县| 蕉岭县| 红河县| 宁远县| 应城市| 贵南县| 光山县| 宁津县| 台湾省|