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

mybatis?resultMap之collection聚集兩種實現(xiàn)方式

 更新時間:2024年09月04日 08:36:19   作者:gmHappy  
本文主要介紹了mybatis?resultMap之collection聚集兩種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

最近做得項目用到了MyBatis處理一對多的映射關系,下面的兩個方法中用到了集合的嵌套查詢方法,下面仔細學習一下這兩種方式

聚集元素用來處理“一對多”的關系。需要指定映射的Java實體類的屬性,屬性的javaType(一般為ArrayList);列表中對象的類型ofType(Java實體類);對應的數(shù)據(jù)庫表的列名稱;
不同情況需要告訴MyBatis 如何加載一個聚集。MyBatis 可以用兩種方式加載:

  • select: 執(zhí)行一個其它映射的SQL 語句返回一個Java實體類型。較靈活但會將執(zhí)行多次嵌套的SQL語句。

  • resultMap: 使用一個嵌套的結(jié)果映射來處理通過join查詢結(jié)果集,映射成Java實體類型。

兩種加載方式格式如下:

集合的嵌套查詢(select)

<collection property="Java屬性名" ofType="另一Java類名" javaType="ArrayList" column="關聯(lián)主鍵ID(用于嵌套查詢SQL語句傳入?yún)?shù),多個用逗號分開)" select="另一個select映射SQL的ID"/>

<select parameterType="int" resultType="另一Java類名" id="另一個select映射SQL的ID">
	SQL語句
</select>
<resultMap id="blogResult" type="Blog">  
	<collection property="posts" javaType=”ArrayList” column="blog_id" ofType="Post" select="selectPostsForBlog"/>  
</resultMap>  
   
<select id="selectBlog" parameterType="int" resultMap="blogResult">  
	SELECT * FROM BLOG WHERE ID = #{id}  
</select>  
   
<select id="selectPostsForBlog" parameterType="int" resultType="Author">  
	SELECT * FROM POST WHERE BLOG_ID = #{id}  
</select>

注意:column屬性的值必須與相應的SQL查詢語句中的列名相同。MyBatis會將第一條SQL語句查詢出來的該列的值用于所聚集的SQL映射語句的入?yún)ⅰR虻谝粭lSQL語句查詢出來的每個該列的值都將用于執(zhí)行另一個SQL語句,所以聚集的SQL語句將被多次執(zhí)行

雖然這個方法簡單,但是對于大數(shù)據(jù)集或列表查詢,就不盡如人意了。這個問題被稱為“N+1 選擇問題”(N+1 Selects Problem)。概括地說,N+1選擇問題是這樣產(chǎn)生的:

您執(zhí)行單條SQL語句去獲取一個列表的記錄( “+1”)。

對列表中的每一條記錄,再執(zhí)行一個聯(lián)合select 語句來加載每條記錄更加詳細的信息(“N”)。

這個問題會導致成千上萬的SQL語句的執(zhí)行,因此并非總是可取的。

上面的例子,MyBatis可以使用延遲加載這些查詢,因此這些查詢立馬可節(jié)省開銷。然而,如果您加載一個列表后立即迭代訪問嵌套的數(shù)據(jù),這將會調(diào)用所有的延遲加載,因此性能會變得非常糟糕。

鑒于此,這有另外一種方式。

集合的嵌套結(jié)果集(Nested Results for Collection)

<resultMap id="resultMap的ID"  type="Java類名">
	<collection property="Java屬性名" ofType="另一Java類名" javaType="ArrayList" resultMap="另一resultMap的ID"/>
</resultMap>
  
<resultMap="另一resultMap的ID" type="另一Java類名">
	<id property="id" column="關聯(lián)主鍵ID"/>
	....
</resultMap>
<select id="selectBlog" parameterType="int" resultMap="blogResult">  
	select  
		B.id as blog_id,  
		B.title as blog_title,  
		B.author_id as blog_author_id,  
		P.id as post_id,  
		P.subject as post_subject,  
		P.body as post_body,  
	from Blog B  
	left outer join Post P on B.id = P.blog_id  
	where B.id = #{id}  
</select>

同樣,我們把Blog和Post兩張表連接在一起,并且也保證列標簽名在映射的時候是唯一且無歧義的?,F(xiàn)在將Blog和Post的集合映射在一起是多么簡單:

<resultMap id="blogResult" type="Blog">  
	<id property="id" column="blog_id" />  
	<result property="title" column="blog_title"/>  
	<collection property="posts" ofType="Post">  
		<id property="id" column="post_id"/>  
		<result property="subject" column="post_subject"/>  
		<result property="body" column="post_body"/>  
	</collection>  
</resultMap>  

再次強調(diào)一下,id 元素是非常重要的。
如果希望結(jié)果映射有更好的可重用性,您可以使用下面的方式:

<resultMap id="blogResult" type="Blog">  
	<id property="id" column="blog_id" />  
	<result property="title" column="blog_title"/>  
	<collection property="posts" ofType="Post" resultMap="blogPostResult"/>  
</resultMap>  
   
<resultMap id="blogPostResult" type="Post">  
	<id property="id" column="post_id"/>  
	<result property="subject" column="post_subject"/>  
	<result property="body" column="post_body"/>  
</resultMap>  

注意:column屬性的值必須與相應的SQL查詢語句的列名一樣。

到此這篇關于mybatis resultMap之collection聚集兩種實現(xiàn)方式的文章就介紹到這了,更多相關mybatis resultMap collection聚集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot實現(xiàn)隱式參數(shù)注入的完整指南

    SpringBoot實現(xiàn)隱式參數(shù)注入的完整指南

    這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)隱式參數(shù)注入的相關方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-11-11
  • SpringBoot 裝飾器@TableField原理解析

    SpringBoot 裝飾器@TableField原理解析

    本文解析了MyBatis-Plus的@TableField注解,用于非主鍵字段與數(shù)據(jù)庫列的映射及行為控制,涵蓋自動填充、樂觀鎖、多租戶等企業(yè)級功能,提供使用技巧、常見問題及示例代碼,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • 關于MyBatis plus條件構(gòu)造器的逐條詳解

    關于MyBatis plus條件構(gòu)造器的逐條詳解

    什么是條件構(gòu)造器呢?簡單來說,條件構(gòu)造器就是用來生成我們查數(shù)據(jù)庫的sql。它可以簡化sql代碼的編寫,靈活、方便且易于維護
    2021-09-09
  • Java8的Lambda和排序

    Java8的Lambda和排序

    這篇文章主要介紹了Java8的Lambda和排序,對數(shù)組和集合進行排序是Java 8 lambda令人驚奇的一個應用,我們可以實現(xiàn)一個Comparators來實現(xiàn)各種排序,下面文章將有案例詳細說明,想要了解得小伙伴可以參考一下
    2021-11-11
  • Linux系統(tǒng)Docker拉取JDK21鏡像超細詳解

    Linux系統(tǒng)Docker拉取JDK21鏡像超細詳解

    這篇文章主要介紹了如何在Linux系統(tǒng)上使用Docker拉取JDK21鏡像,并基于該鏡像搭建開發(fā)和測試環(huán)境,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2024-12-12
  • Spring?中@Autowired、@Resource、@Inject?注解實現(xiàn)原理使用案例詳解

    Spring?中@Autowired、@Resource、@Inject?注解實現(xiàn)原理使用案例詳解

    這篇文章主要介紹了Spring?中@Autowired、@Resource、@Inject?注解實現(xiàn)原理使用案例詳解,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2025-04-04
  • Java基礎面試題之volatile詳解

    Java基礎面試題之volatile詳解

    Volatile可以看做是輕量級的 Synchronized,它只保證了共享變量的可見性,下面這篇文章主要給大家介紹了關于Java基礎面試題之volatile的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • Java inputstream和outputstream使用詳解

    Java inputstream和outputstream使用詳解

    這篇文章主要介紹了Java inputstream和outputstream使用詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 使用Java實現(xiàn)將Excel工作表轉(zhuǎn)換為CSV格式

    使用Java實現(xiàn)將Excel工作表轉(zhuǎn)換為CSV格式

    在日常開發(fā)中,Excel 文件(.xls/.xlsx)是數(shù)據(jù)存儲和交換的常用格式,本文將介紹如何使用 Spire.XLS for Java 組件,高效實現(xiàn) Excel 文件到 CSV 格式的轉(zhuǎn)換,需要的可以了解下
    2025-10-10
  • 成功解決IDEA2020 Plugins 連不上、打不開的方法

    成功解決IDEA2020 Plugins 連不上、打不開的方法

    這篇文章主要介紹了成功解決IDEA2020 Plugins 連不上、打不開的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06

最新評論

彭山县| 灵武市| 伊通| 舟山市| 永寿县| 揭西县| 陕西省| 永胜县| 镇安县| 大姚县| 沽源县| 定日县| 观塘区| 腾冲县| 紫金县| 广丰县| 吐鲁番市| 莎车县| 永嘉县| 大港区| 阳山县| 肃南| 托克逊县| 阳东县| 鸡东县| 普兰店市| 外汇| 莱阳市| 嘉黎县| 乌拉特中旗| 哈巴河县| 铜陵市| 华池县| 三河市| 无棣县| 台江县| 修武县| 封开县| 平罗县| 左云县| 绍兴市|