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

MyBatis嵌套查詢collection報(bào)錯(cuò):org.apache.ibatis.exceptions.TooManyResultsException

 更新時(shí)間:2024年09月27日 11:07:05   作者:永不服輸?shù)腸oder  
本文主要介紹了MyBatis嵌套查詢collection報(bào)錯(cuò):org.apache.ibatis.exceptions.TooManyResultsException,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1、目標(biāo)

本文的主要目標(biāo)是研究resultMap的collection更新字段但是resultMap不更新字段報(bào)錯(cuò)的原因和源碼分析

2、resultMap的collection更新字段,resultMap不更新字段會(huì)報(bào)錯(cuò)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.mybatisDemo.ClassMapper">
    <resultMap id="classMap" type="org.apache.mybatisDemo.Class">
        <!--<id property="id" column="classId"/>-->
        <!--<result property="name" column="className"/>-->
        <!--<result property="createTime" column="create_time"/>-->
        <collection property="stuList" javaType="java.util.List" ofType="org.apache.mybatisDemo.Stu">
            <result property="id" column="stuId"/>
            <result property="name" column="stuName"/>
            <result property="age" column="age"/>
        </collection>
    </resultMap>

    <select id="getClass" resultMap="classMap">
        select c.id classId, c.name className, c.create_time, s.id stuId, s.name stuName, s.age
        from `class` c inner join `stu` s on c.id = s.class_id
        where c.`name` = #{className}
    </select>
</mapper>

如果不更新resultMap是classMap的字段只更新resultMap的collection字段會(huì)報(bào)錯(cuò)

在這里插入圖片描述

報(bào)錯(cuò)信息是不能返回多個(gè)記錄,因?yàn)檎{(diào)用了selectOne方法只返回1個(gè)記錄,那為什么會(huì)返回多個(gè)記錄呢,因?yàn)榉庋b成多個(gè)Class班級(jí)對(duì)象了

源碼分析:

在這里插入圖片描述

查詢數(shù)據(jù)庫(kù)得到多個(gè)記錄后會(huì)調(diào)用handleRowValuesForNestedResultMap方法處理嵌套屬性

在這里插入圖片描述

會(huì)循環(huán)遍歷查詢數(shù)據(jù)庫(kù)的每個(gè)記錄,并封裝成Class班級(jí)對(duì)象

在這里插入圖片描述

計(jì)算combinedKey的時(shí)候會(huì)判斷collection的更新字段至少為1并且父節(jié)點(diǎn)resultMap的更新字段至少為1才會(huì)更新combinedKey,否則更新combinedKey是NULL_CACHE_KEY

這里由于resultMap(classMap)的更新字段為0,因此combinedKey是NULL_CACHE_KEY

在這里插入圖片描述

調(diào)用getRowValue方法查詢數(shù)據(jù)庫(kù)的記錄

在這里插入圖片描述

會(huì)調(diào)用ObjectFactory對(duì)象的create方法實(shí)例化一個(gè)Class班級(jí)對(duì)象

在這里插入圖片描述

這里判斷combinedKey等于NULL_CACHE_KEY,因此不會(huì)將這個(gè)Class班級(jí)對(duì)象放到nestedResultObjects這個(gè)map中

在這里插入圖片描述

while循環(huán)查詢數(shù)據(jù)庫(kù)的第二條記錄的時(shí)候,從nestedResultObjects這個(gè)map中沒(méi)有找到Class班級(jí)對(duì)象就會(huì)創(chuàng)建一個(gè)新的Class班級(jí)對(duì)象,這樣會(huì)返回多個(gè)Class班級(jí)對(duì)象

在這里插入圖片描述

list集合中添加嵌套王五2Stu對(duì)象的Class班級(jí)對(duì)象,這樣的話會(huì)返回3個(gè)Class班級(jí)對(duì)象

在這里插入圖片描述

最終查詢數(shù)據(jù)庫(kù)返回3個(gè)Class班級(jí)對(duì)象

在這里插入圖片描述

調(diào)用selectOne方法查詢數(shù)據(jù)庫(kù)記錄是3個(gè)會(huì)拋出異常:期望1個(gè)返回值結(jié)果返回多個(gè)

3、resultMap的collection和resultMap都更新字段不會(huì)報(bào)錯(cuò)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.mybatisDemo.ClassMapper">
    <resultMap id="classMap" type="org.apache.mybatisDemo.Class">
        <id property="id" column="classId"/>
        <result property="name" column="className"/>
        <result property="createTime" column="create_time"/>
        <collection property="stuList" javaType="java.util.List" ofType="org.apache.mybatisDemo.Stu">
            <result property="id" column="stuId"/>
            <result property="name" column="stuName"/>
            <result property="age" column="age"/>
        </collection>
    </resultMap>

    <select id="getClass" resultMap="classMap">
        select c.id classId, c.name className, c.create_time, s.id stuId, s.name stuName, s.age
        from `class` c inner join `stu` s on c.id = s.class_id
        where c.`name` = #{className}
    </select>
</mapper>

resultMap更新字段大于1,并且resultMap的collection的更新字段也大于1

在這里插入圖片描述

最后輸出結(jié)果正確,是一個(gè)Class班級(jí)對(duì)象,同時(shí)封裝了三個(gè)Stu對(duì)象

源碼分析:

public CacheKey clone() throws CloneNotSupportedException {
    CacheKey clonedCacheKey = (CacheKey) super.clone();
    clonedCacheKey.updateList = new ArrayList<>(updateList);
    return clonedCacheKey;
  }

執(zhí)行CacheKey的clone方法可以深拷貝CacheKey對(duì)象,這里CacheKey重寫了clone方法,因?yàn)镃acheKey有一個(gè)list集合的屬性u(píng)pdateList,需要手動(dòng)深拷貝復(fù)制list集合屬性

在這里插入圖片描述

生成combinedKey的時(shí)候會(huì)判斷resultMap的collection的更新字段至少有一個(gè),并且resultMap的更新字段至少有一個(gè),才會(huì)更新combinedKey,否則combinedKey設(shè)置成默認(rèn)key即NULL_CACHE_KEY

這里combinedKey=-1902729450:-2918070140:org.apache.mybatisDemo.ClassMapper.mapper_resultMap[classMap]_collection[stuList]:stuId:4:stuName:張三2:age:15:680594160:-729303444:org.apache.mybatisDemo.ClassMapper.classMap:classId:2

它由兩部分組成,第一部分是collection的key和value,第二部分是classMap這個(gè)Class班級(jí)對(duì)象

在這里插入圖片描述

如果combinedKey不為默認(rèn)key即NULL_CACHE_KEY,才會(huì)將查詢數(shù)據(jù)庫(kù)的記錄緩存到nestedResultObjects這個(gè)map中

在這里插入圖片描述

查詢數(shù)據(jù)庫(kù)的第二條記錄的時(shí)候才會(huì)從nestedResultObjects這個(gè)map中獲取緩存的Class班級(jí)對(duì)象,同時(shí)這個(gè)Class班級(jí)對(duì)象還嵌套了第一條記錄即張三2Stu對(duì)象

在這里插入圖片描述

查詢的數(shù)據(jù)庫(kù)記錄是一個(gè)記錄,它是Class班級(jí)對(duì)象,它包含了stuList屬性,它是一個(gè)list集合類型,它包括3個(gè)Stu對(duì)象

4、總結(jié)

在這里插入圖片描述

總結(jié)一句話:resultMap的collection更新字段至少為1個(gè),并且resultMap的更新字段至少為1個(gè),才會(huì)返回一個(gè)嵌套了多個(gè)Stu對(duì)象的Class班級(jí)對(duì)象,否則會(huì)返回多個(gè)Class班級(jí)對(duì)象

到此這篇關(guān)于MyBatis嵌套查詢collection報(bào)錯(cuò):org.apache.ibatis.exceptions.TooManyResultsException的文章就介紹到這了,更多相關(guān)MyBatis嵌套查詢collection報(bào)錯(cuò)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot3使用Jasypt實(shí)現(xiàn)配置文件信息加密的方法

    SpringBoot3使用Jasypt實(shí)現(xiàn)配置文件信息加密的方法

    對(duì)于一些單體項(xiàng)目而言,在沒(méi)有使用SpringCloud的情況下,配置文件中包含著大量的敏感信息,如果這些信息泄露出去將會(huì)對(duì)企業(yè)的資產(chǎn)產(chǎn)生重大威脅,因此,對(duì)配置文件中的敏感信息加密是一件極其必要的事,所以本文介紹了SpringBoot3使用Jasypt實(shí)現(xiàn)配置文件信息加密的方法
    2024-07-07
  • SpringSecurity授權(quán)實(shí)現(xiàn)基本思路

    SpringSecurity授權(quán)實(shí)現(xiàn)基本思路

    本文介紹了SpringSecurity中使用FilterSecurityInterceptor進(jìn)行權(quán)限校驗(yàn)的基本方法,通過(guò)SecurityContextHolder獲取Authentication中的權(quán)限信息,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • java 獲取數(shù)據(jù)庫(kù)連接的實(shí)現(xiàn)代碼

    java 獲取數(shù)據(jù)庫(kù)連接的實(shí)現(xiàn)代碼

    本篇文章是對(duì)在java中獲取數(shù)據(jù)庫(kù)連接的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Spring中使用copyProperties方法進(jìn)行對(duì)象之間的屬性賦值詳解

    Spring中使用copyProperties方法進(jìn)行對(duì)象之間的屬性賦值詳解

    這篇文章主要介紹了Spring中使用copyProperties方法進(jìn)行對(duì)象之間的屬性賦值詳解,使用org.springframework.beans.BeanUtils.copyProperties方法進(jìn)行對(duì)象之間屬性的賦值,避免通過(guò)get、set方法一個(gè)一個(gè)屬性的賦值,需要的朋友可以參考下
    2023-12-12
  • java并發(fā)學(xué)習(xí)之Executor源碼解析

    java并發(fā)學(xué)習(xí)之Executor源碼解析

    這篇文章主要為大家介紹了java并發(fā)學(xué)習(xí)之Executor源碼示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • SpringBoot+log4j2.xml使用application.yml屬性值問(wèn)題

    SpringBoot+log4j2.xml使用application.yml屬性值問(wèn)題

    這篇文章主要介紹了SpringBoot+log4j2.xml使用application.yml屬性值問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring切面優(yōu)先級(jí)與基于xml的AOP實(shí)現(xiàn)方法詳解

    Spring切面優(yōu)先級(jí)與基于xml的AOP實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Spring切面的優(yōu)先級(jí)與基于xml的AOP的詳細(xì)步驟,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-11-11
  • JAVA字符串占位符使用方法實(shí)例

    JAVA字符串占位符使用方法實(shí)例

    今天同事又問(wèn)起類似符串占位符使用的功能,所以下面這篇文章主要給大家介紹了關(guān)于JAVA字符串占位符使用的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • SpringBoot詳細(xì)介紹SPI機(jī)制示例

    SpringBoot詳細(xì)介紹SPI機(jī)制示例

    這篇文章主要介紹了深入解析Spring Boot的SPI機(jī)制詳情,SPI是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制,可以用來(lái)啟用框架擴(kuò)展和替換組件,主要用于框架中開(kāi)發(fā),更多相關(guān)介紹,感興趣的小伙伴可以參考一下下面文章內(nèi)容
    2022-08-08
  • Java超詳細(xì)講解多態(tài)的調(diào)用

    Java超詳細(xì)講解多態(tài)的調(diào)用

    多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過(guò)該引用變量發(fā)出的方法調(diào)用在編程時(shí)并不確定,而是在程序運(yùn)行期間才確定,即一個(gè)引用變量到底會(huì)指向哪個(gè)類的實(shí)例對(duì)象,該引用變量發(fā)出的方法調(diào)用到底是哪個(gè)類中實(shí)現(xiàn)的方法,必須在由程序運(yùn)行期間才能決定
    2022-05-05

最新評(píng)論

乐陵市| 青神县| 大理市| 田阳县| 武强县| 长兴县| 吴堡县| 那坡县| 云南省| 包头市| 威远县| 松阳县| 遵义市| 长垣县| 峨边| 松滋市| 唐山市| 松滋市| 乌鲁木齐市| 日土县| 淳安县| 沭阳县| 博爱县| 高尔夫| 建平县| 长丰县| 马关县| 丽江市| 南澳县| 六盘水市| 祁连县| 阳朔县| 绥阳县| 婺源县| 察雅县| 浦县| 郎溪县| 中卫市| 雅江县| 合山市| 布尔津县|