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

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

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

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

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

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

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

兩種加載方式格式如下:

集合的嵌套查詢(select)

<collection property="Java屬性名" ofType="另一Java類名" javaType="ArrayList" column="關(guān)聯(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屬性的值必須與相應(yīng)的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 語句來加載每條記錄更加詳細(xì)的信息(“N”)。

這個問題會導(dǎo)致成千上萬的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="關(guān)聯(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兩張表連接在一起,并且也保證列標(biāo)簽名在映射的時候是唯一且無歧義的?,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>  

再次強(qiáng)調(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屬性的值必須與相應(yīng)的SQL查詢語句的列名一樣。

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

相關(guān)文章

  • JavaCV實現(xiàn)將視頻以幀方式抽取

    JavaCV實現(xiàn)將視頻以幀方式抽取

    這篇文章主要為大家詳細(xì)介紹了JavaCV實現(xiàn)將視頻以幀方式抽取,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • Java基礎(chǔ)之文件和目錄操作

    Java基礎(chǔ)之文件和目錄操作

    這篇文章主要介紹了Java基礎(chǔ)之文件和目錄操作,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java Calendar類的時間操作

    Java Calendar類的時間操作

    這篇文章主要為大家詳細(xì)介紹了Java Calendar類的時間操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • java中如何判斷JSONObject是否存在某個Key

    java中如何判斷JSONObject是否存在某個Key

    這篇文章主要介紹了java中如何判斷JSONObject是否存在某個Key,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Spring通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題

    Spring通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題

    這篇文章主要給大家介紹了Spring如何通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題,文中有詳細(xì)的代碼示例,對大家的學(xué)習(xí)活工作有一定的幫助,具有一定的參考價值,需要的朋友可以參考下
    2023-10-10
  • Java線程同步及實現(xiàn)方法詳解

    Java線程同步及實現(xiàn)方法詳解

    這篇文章主要介紹了Java線程同步及實現(xiàn)方法詳解,當(dāng)我們有多個線程要同時訪問一個變量或?qū)ο髸r,如果這些線程中既有讀又有寫操作時,就會導(dǎo)致變量值或?qū)ο蟮臓顟B(tài)出現(xiàn)混亂,從而導(dǎo)致程序異常,需要的朋友可以參考下
    2023-11-11
  • 使用JMeter進(jìn)行接口高并發(fā)測試的實現(xiàn)

    使用JMeter進(jìn)行接口高并發(fā)測試的實現(xiàn)

    本文主要介紹了使用JMeter進(jìn)行接口高并發(fā)測試的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringBoot中使用Knife4J的解決方案

    SpringBoot中使用Knife4J的解決方案

    knife4j是為Java?MVC框架集成Swagger生成Api文檔的增強(qiáng)解決方案,這篇文章主要介紹了SpringBoot中使用Knife4J,需要的朋友可以參考下
    2022-10-10
  • 基于JVM-jinfo的使用方式

    基于JVM-jinfo的使用方式

    這篇文章主要介紹了JVM-jinfo的使用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java回調(diào)函數(shù)原理實例與代理模式的區(qū)別講解

    Java回調(diào)函數(shù)原理實例與代理模式的區(qū)別講解

    今天小編就為大家分享一篇關(guān)于Java回調(diào)函數(shù)原理實例與代理模式的區(qū)別講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-02-02

最新評論