mybatis?resultMap之collection聚集兩種實現(xiàn)方式
最近做得項目用到了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)文章希望大家以后多多支持腳本之家!
- mybatis collection關(guān)聯(lián)查詢多個參數(shù)方式
- MyBatis使用嵌套查詢collection和association的實現(xiàn)
- mybatis中association和collection的使用與區(qū)別
- MyBatis的collection和association的使用解讀
- Mybatis中一對多(collection)和一對一(association)的組合查詢使用
- Mybatis使用Collection屬性的示例代碼
- Mybatis的collection三層嵌套查詢方式(驗證通過)
- mybatis?collection和association的區(qū)別解析
- MyBatis中<collection>標(biāo)簽的多種用法
相關(guān)文章
Spring通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題
這篇文章主要給大家介紹了Spring如何通過@Lazy解決構(gòu)造方法形式的循環(huán)依賴問題,文中有詳細(xì)的代碼示例,對大家的學(xué)習(xí)活工作有一定的幫助,具有一定的參考價值,需要的朋友可以參考下2023-10-10使用JMeter進(jìn)行接口高并發(fā)測試的實現(xiàn)
本文主要介紹了使用JMeter進(jìn)行接口高并發(fā)測試的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Java回調(diào)函數(shù)原理實例與代理模式的區(qū)別講解
今天小編就為大家分享一篇關(guān)于Java回調(diào)函數(shù)原理實例與代理模式的區(qū)別講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-02-02