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

MyBatis中<collection>標(biāo)簽的多種用法

 更新時間:2025年04月02日 09:26:53   作者:愿你天黑有燈下雨有傘  
collection標(biāo)簽是處理一對多關(guān)系的關(guān)鍵工具,它能夠?qū)⒉樵兘Y(jié)果巧妙地映射到Java對象的集合屬性中,本文主要介紹了MyBatis中<collection>標(biāo)簽的多種用法,感興趣的可以了解一下

在 MyBatis 中,<collection> 標(biāo)簽是處理一對多(One-to-Many)關(guān)系的關(guān)鍵工具,它能夠?qū)⒉樵兘Y(jié)果巧妙地映射到 Java 對象的集合屬性中。以下是 <collection> 的不同用法及其示例,結(jié)合知識庫中的信息整理如下:

一、嵌套查詢(Nested Select)

通過 select 屬性引用另一個 SQL 查詢,根據(jù)主表的某一列(如 id)作為參數(shù),查詢子表的集合數(shù)據(jù)。

特點

  • 每條主記錄會觸發(fā)一次子查詢(可能導(dǎo)致 N+1 問題)。

  • 適合數(shù)據(jù)量較小或需要遞歸查詢的場景。

示例代碼

<!-- 主表的resultMap -->
<resultMap id="UserMap" type="User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <!-- 集合屬性:permissions -->
    <collection 
        property="permissions" 
        ofType="Permission" 
        select="com.example.mapper.PermissionMapper.selectByUserId" 
        column="id"
    />
</resultMap>

<!-- 主表的查詢SQL -->
<select id="selectUser" resultMap="UserMap">
    SELECT id, username FROM users WHERE id = #{id}
</select>

<!-- 子查詢(PermissionMapper.xml) -->
<select id="selectByUserId" resultType="Permission">
    SELECT * FROM permissions WHERE user_id = #{id}
</select>

解釋

  • property="permissions" :映射到 User 類的 permissions 集合屬性。

  • ofType="Permission" :指定集合元素的類型。

  • select="..." :引用子查詢的 Mapper 方法。

  • column="id" :將主表的 id 作為參數(shù)傳遞給子查詢。

二、嵌套結(jié)果(Nested Results)

通過 column 和 ofType 直接映射 JOIN 查詢的結(jié)果,避免多次查詢數(shù)據(jù)庫。

特點

  • 通過 JOIN 一次性獲取所有數(shù)據(jù),減少查詢次數(shù)。

  • 需要處理重復(fù)數(shù)據(jù)(主表字段會被重復(fù),需通過 columnPrefix 區(qū)分)。

示例代碼

<!-- 主表的resultMap -->
<resultMap id="UserMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <!-- 集合屬性:orders -->
    <collection 
        property="orders" 
        ofType="Order" 
        columnPrefix="order_"
    >
        <id property="orderId" column="order_id"/>
        <result property="amount" column="amount"/>
    </collection>
</resultMap>

<!-- 主表的查詢SQL(使用JOIN) -->
<select id="selectUserWithOrders" resultMap="UserMap">
    SELECT 
        u.id AS user_id, 
        u.username, 
        o.id AS order_id, 
        o.amount 
    FROM users u 
    LEFT JOIN orders o ON u.id = o.user_id 
    WHERE u.id = #{id}
</select>

解釋

  • columnPrefix="order_" :將子表字段名前綴(如 order_id)與主表字段區(qū)分開。

  • <collection> 內(nèi)部定義子表字段的映射規(guī)則。

  • 主表字段(如 user_id)和子表字段(如 order_id)通過別名區(qū)分。

三、遞歸查詢(Recursive Query)

用于構(gòu)建層級結(jié)構(gòu)(如樹形菜單、權(quán)限結(jié)構(gòu)),通過 <collection> 自引用實現(xiàn)遞歸。

特點

  • 通過 select 屬性引用自身或同級的查詢方法,形成遞歸調(diào)用。

  • 適用于組織結(jié)構(gòu)、分類樹等場景。

示例代碼

<!-- 處理樹形結(jié)構(gòu)的resultMap -->
<resultMap id="CategoryMap" type="Category">
    <id property="id" column="id"/>
    <result property="name" column="name"/>
    <result property="parentId" column="parent_id"/>
    <!-- 遞歸查詢子節(jié)點 -->
    <collection 
        property="children" 
        ofType="Category" 
        select="selectCategoriesByParentId" 
        column="id"
    />
</resultMap>

<!-- 查詢父節(jié)點的子節(jié)點 -->
<select id="selectCategoriesByParentId" resultMap="CategoryMap">
    SELECT * FROM categories WHERE parent_id = #{id}
</select>

解釋

  • column="id" :將當(dāng)前節(jié)點的 id 作為父節(jié)點 ID 傳遞給子查詢。

  • <collection> 引用同一個 Mapper 中的 selectCategoriesByParentId 方法,形成遞歸。

  • 直到?jīng)]有子節(jié)點時停止遞歸。

四、使用 column 傳遞多個參數(shù)

當(dāng)子查詢需要多個參數(shù)時,可以通過表達(dá)式指定多個列。

語法

column="{param1=column1, param2=column2}"

示例代碼

<collection 
    property="items" 
    ofType="Item" 
    select="com.example.mapper.ItemMapper.selectItemsByUserAndDate" 
    column="{userId=id, date=createTime}"
/>

解釋

  • 子查詢 selectItemsByUserAndDate 需要兩個參數(shù):userId 和 date。

  • column 表達(dá)式將主表的 id 映射為 userIdcreateTime 映射為 date。

五、javaType 和 ofType 的區(qū)別

  • ofType :必須指定,用于定義集合中元素的類型(如 Permission)。

  • javaType :可選,指定集合的類型(如 ArrayList)。若不指定,MyBatis 默認(rèn)使用 List

示例

<!-- 顯式指定javaType -->
<collection 
    property="permissions" 
    javaType="ArrayList" 
    ofType="Permission" 
    select="..." 
    column="..."
/>

總結(jié):不同場景的適用性

場景推薦用法優(yōu)缺點
簡單的一對多關(guān)系嵌套查詢(select)簡單易用,但可能引發(fā) N+1 問題
需要 JOIN 一次性獲取數(shù)據(jù)嵌套結(jié)果(columnPrefix)減少查詢次數(shù),但需處理重復(fù)字段和復(fù)雜 SQL
樹形結(jié)構(gòu)(如菜單、分類)遞歸查詢(自引用)簡潔且可自動構(gòu)建層級,但需注意性能(尤其數(shù)據(jù)量大時)
需要傳遞多個參數(shù)column 表達(dá)式靈活傳遞多個參數(shù),但需確保子查詢參數(shù)匹配

通過合理選擇 <collection> 的用法,可以高效地處理 MyBatis 中的一對多映射需求。

到此這篇關(guān)于MyBatis中<collection>標(biāo)簽的多種用法的文章就介紹到這了,更多相關(guān)MyBatis  collection標(biāo)簽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Boot與JWT和Shiro整合實踐步驟(非常詳細(xì)!)

    Spring?Boot與JWT和Shiro整合實踐步驟(非常詳細(xì)!)

    這篇文章主要介紹了Spring?Boot與JWT和Shiro整合的相關(guān)資料,將Shiro、Spring Boot和JWT集成在一起,可以大大提高應(yīng)用程序的安全性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • MybatisPlus使用idworker解決雪花算法重復(fù)

    MybatisPlus使用idworker解決雪花算法重復(fù)

    本文主要介紹了MybatisPlus使用idworker解決雪花算法重復(fù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • SpringBoot定時任務(wù)實現(xiàn)數(shù)據(jù)庫數(shù)據(jù)同步全過程

    SpringBoot定時任務(wù)實現(xiàn)數(shù)據(jù)庫數(shù)據(jù)同步全過程

    文章詳細(xì)介紹了從簡單到企業(yè)級數(shù)據(jù)庫同步需求的技術(shù)方案,包括選型、實現(xiàn)步驟、優(yōu)化方案、異常處理策略、生產(chǎn)環(huán)境配置建議等
    2025-12-12
  • dubbo擴(kuò)展點AOP切面功能擴(kuò)展示例詳解

    dubbo擴(kuò)展點AOP切面功能擴(kuò)展示例詳解

    這篇文章主要為大家介紹了dubbo擴(kuò)展點AOP切面功能擴(kuò)展示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • 如何基于java向mysql數(shù)據(jù)庫中存取圖片

    如何基于java向mysql數(shù)據(jù)庫中存取圖片

    這篇文章主要介紹了如何基于java向mysql數(shù)據(jù)庫中存取圖片,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot中打war包需要注意事項

    SpringBoot中打war包需要注意事項

    這篇文章主要介紹了SpringBoot中打war包需要注意事項,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • tk.mybatis實現(xiàn)uuid主鍵生成的示例代碼

    tk.mybatis實現(xiàn)uuid主鍵生成的示例代碼

    本文主要介紹了tk.mybatis實現(xiàn)uuid主鍵生成的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • SpringBoot如何讀取配置文件參數(shù)并全局使用

    SpringBoot如何讀取配置文件參數(shù)并全局使用

    這篇文章主要介紹了SpringBoot如何讀取配置文件參數(shù)并全局使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12
  • elasticsearch索引創(chuàng)建create?index集群matedata更新

    elasticsearch索引創(chuàng)建create?index集群matedata更新

    這篇文章主要介紹了elasticsearch索引創(chuàng)建create?index及集群matedata更新,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-04-04
  • 登錄EasyConnect后無法通過jdbc訪問服務(wù)器數(shù)據(jù)庫問題的解決方法

    登錄EasyConnect后無法通過jdbc訪問服務(wù)器數(shù)據(jù)庫問題的解決方法

    描述一下近期使用EasyConnect遇到的問題,下面這篇文章主要給大家介紹了關(guān)于登錄EasyConnect后無法通過jdbc訪問服務(wù)器數(shù)據(jù)庫問題的解決方法,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02

最新評論

观塘区| 五莲县| 玉田县| 楚雄市| 张掖市| 济源市| 光泽县| 玛纳斯县| 南开区| 淳化县| 曲阜市| 哈尔滨市| 广灵县| 会理县| 台州市| 佛山市| 华池县| 泊头市| 和平县| 额敏县| 米泉市| 布尔津县| 阿巴嘎旗| 周至县| 尉犁县| 离岛区| 天等县| 昔阳县| 古交市| 右玉县| 灌云县| 邯郸县| 佛山市| 南京市| 临汾市| 沙湾县| 西平县| 景泰县| 嘉峪关市| 阜新市| 四子王旗|