MyBatis 一對多與多對一映射詳解教程


一、基礎概念與場景

  1. 一對多(One-to-Many)
    ? 定義:一個父對象包含多個子對象。

例如:一個商品(Goods)對應多個商品詳情(GoodsDetail)
? 實體類表現:父類中包含 List<子類> 屬性。

// Goods.java
public class Goods {private List<GoodsDetail> goodsDetails; // 一對多關系
}
  1. 多對一(Many-to-One)
    ? 定義:多個子對象屬于一個父對象。

例如:多個商品詳情(GoodsDetail)屬于一個商品(Goods)
? 實體類表現:子類中包含父類對象屬性。

// GoodsDetail.java
public class GoodsDetail {private Goods goods; // 多對一關系
}

二、XML配置實現

  1. 一對多映射(父→子)
    使用 <collection> 標簽,核心配置如下:
<!-- GoodsMapper.xml -->
<resultMap id="rmGoods1" type="Goods"><id column="goods_id" property="goodsId"/><!-- 一對多:通過子查詢獲取商品詳情 --><collection property="goodsDetails" select="goodsDetail.selectByGoodsId" column="goods_id"/>
</resultMap><select id="selectOneToMany" resultMap="rmGoods1">SELECT * FROM t_goods LIMIT 0,10
</select>

? 參數解釋:

? select:指向子查詢的命名空間(如 goodsDetail.selectByGoodsId

? column:傳遞父查詢結果中的字段值(如 goods_id)到子查詢


  1. 多對一映射(子→父)
    使用 <association> 標簽,核心配置如下:
<!-- GoodsDetailMapper.xml -->
<resultMap id="rmGoodsDetail" type="GoodsDetail"><id column="gd_id" property="gdId"/><!-- 多對一:通過父查詢獲取商品信息 --><association property="goods" select="goods.selectById" column="goods_id"/>
</resultMap><select id="selectManyToOne" resultMap="rmGoodsDetail">SELECT * FROM t_goods_detail LIMIT 0,1
</select>

? 參數解釋:

? select:指向父查詢的命名空間(如 goods.selectById

? column:傳遞當前表的字段值(如 goods_id)到父查詢


三、聯表查詢優化

  1. 一對多聯表查詢(避免N+1問題)
    直接通過JOIN查詢一次性獲取父子數據:
<resultMap id="rmGoodsJoin" type="Goods"><collection property="goodsDetails" ofType="GoodsDetail"><id column="gd_id" property="gdId"/><result column="gd_pic_url" property="gdPicUrl"/></collection>
</resultMap><select id="selectJoin" resultMap="rmGoodsJoin">SELECT g.*, d.* FROM t_goods g LEFT JOIN t_goods_detail d ON g.goods_id = d.goods_id
</select>

? 優點:減少數據庫查詢次數,提升性能


  1. 多對一聯表查詢
<resultMap id="rmDetailJoin" type="GoodsDetail"><association property="goods" javaType="Goods"><id column="goods_id" property="goodsId"/><result column="title" property="title"/></association>
</resultMap><select id="selectDetailWithGoods" resultMap="rmDetailJoin">SELECT d.*, g.title FROM t_goods_detail d INNER JOIN t_goods g ON d.goods_id = g.goods_id
</select>

四、常見問題與解決方案

  1. N+1查詢問題
    ? 現象:父查詢返回N條數據,觸發N次子查詢,導致性能低下。

? 解決:

? 開啟懶加載:在 mybatis-config.xml 中配置:

```xml
<settings><setting name="lazyLoadingEnabled" value="true"/>
</settings>
```

? 使用聯表查詢(如上述第三節)


  1. 字段名沖突
    ? 現象:聯表查詢時多個表有相同字段名(如 id)。

? 解決:

? 使用別名區分字段:

```sql
SELECT g.id AS goods_id, d.id AS detail_id
```

? 在 <resultMap> 中明確指定映射關系


五、最佳實踐總結

場景推薦方案適用場景
數據量小分步查詢(<collection>/<association>字段關聯邏輯簡單
數據量大聯表查詢需要一次性獲取完整數據
實時性要求高聯表查詢 + 緩存高頻讀取場景
更新頻繁分步查詢 + 懶加載減少無效數據加載

學習建議:

  1. 從簡單分步查詢入手,理解映射邏輯
  2. 逐步嘗試聯表查詢,對比性能差異
  3. 參考官方文檔中的 <resultMap> 高級用法
  4. 通過單元測試驗證結果集映射(如 System.out.println(goods.getGoodsDetails().size())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904235.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904235.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ChatGPT:重塑人工智能交互范式的破曉之作

2022年11月30日,總部位于舊金山的研究公司OpenAI正式發布了ChatGPT——一款以病毒式傳播速度席卷全球的AI聊天機器人。它不僅能像人類一樣生成內容、回答問題和解決問題,更在推出后的兩個月內吸引了超過1億月活躍用戶,刷新了消費級技術應用的最快采用率紀錄。這一里程碑事件…

在項目中如何對Map List等對象序列化及反序列化

我們知道&#xff0c;在自定義類中&#xff0c;若想完成序列化必須要實現Serializable接口。 那么在實現后如何進行序列化呢&#xff1f; 一.普通對象 序列化&#xff1a; 1.首先我們要定義一個 序列化所需要的工具類 ObjectMapper //定義序列化所需要的工具類 轉化機器…

筆試專題(十五)

文章目錄 排序子序列題解代碼 消減整數題解代碼 最長公共子序列(二)題解代碼 排序子序列 題目鏈接 題解 1. 貪心 模擬 2. 1 2 3 2 2 應該是有兩個排列子序列的&#xff0c;所以i n-1時ret 3. 把水平的位置和上升部分&#xff0c;水平位置和下降部分分為一個排列子序列 代…

Amazon Bedrock Converse API:開啟對話式AI新體驗

Amazon Bedrock Converse API&#xff1a;開啟對話式AI新體驗 前言 在當今人工智能飛速發展的時代&#xff0c;對話式AI已成為眾多應用的核心組成部分。從智能客服到智能助手&#xff0c;對話式AI為用戶帶來了便捷且高效的交互體驗。而Amazon Bedrock Converse API的出現&…

【Springboot知識】Springboot計劃任務Schedule詳解

文章目錄 Spring Boot 定時任務從原理到實現詳解一、核心原理分析1. 架構分層2. 核心組件3. 線程模型 二、基礎實現步驟1. 添加依賴2. 主類配置3. 定時任務類 三、高級配置技巧1. 自定義線程池2. 動態配置參數3. 分布式鎖集成&#xff08;Redis示例&#xff09; 四、異常處理機…

MySQL:聯合查詢

目錄 一、笛卡爾積 ?二、內連接 三、外連接 &#xff08;1&#xff09;左外連接 &#xff08;2&#xff09;右外連接 &#xff08;3&#xff09;全外連接 四、自連接 五、子查詢 &#xff08;1&#xff09;單行子查詢 &#xff08;2&#xff09;多行子查詢 &…

深入理解 Cortex-M3 的內核寄存器組

每個 MCU 開發工程師一定都了解寄存器這個東西&#xff0c;以 STM32 為例&#xff0c;其擁有非常多的外設模塊&#xff0c;如串口、SPI、IIC 等等&#xff0c;如果要使用這些外設&#xff0c;使其按照我們的要求工作&#xff0c;就需要配置這些外設的寄存器&#xff0c;往這些寄…

網絡安全自動化:找準邊界才能筑牢安全防線

數字時代&#xff0c;企業每天要面對成千上萬的網絡攻擊。面對龐大的服務器群、分散的團隊和長期不重啟的設備&#xff0c;很多企業開始思考&#xff1a;哪些安全操作適合交給機器自動處理&#xff1f;哪些必須由人工把關&#xff1f;今天我們就用大白話聊聊這件事。 一、這些事…

C++負載均衡遠程調用學習之負載均衡算法與實現

目錄 01 lars 系統架構回顧 02 lars-lbAgentV0.4-route_lb處理report業務流程 03 lars-lbAgentV0.4-負責均衡判斷參數配置 04 lars-lbAgentV0.4-負載均衡idle節點的失敗率判斷 05 lars-lbAgentV0.4-負載均衡overload節點的成功率判斷 06 lars-lbAgentV0.4-負載均衡上報提交…

領略算法真諦: 多源bfs

嘿&#xff0c;各位技術潮人&#xff01;好久不見甚是想念。生活就像一場奇妙冒險&#xff0c;而編程就是那把超酷的萬能鑰匙。此刻&#xff0c;陽光灑在鍵盤上&#xff0c;靈感在指尖跳躍&#xff0c;讓我們拋開一切束縛&#xff0c;給平淡日子加點料&#xff0c;注入滿滿的pa…

雷電模擬器-超好用的Windows安卓模擬器

一、雷電模擬器介紹 雷電模擬器是一款功能強大的軟件&#xff0c;它能夠在電腦上模擬出安卓手機系統&#xff0c;讓你可以在電腦上運行各類手機應用及游戲。其采用虛擬安卓手機操作界面&#xff0c;為玩家帶來了獨特的體驗。 &#xff08;一&#xff09;強大的兼容性 雷電模擬…

文章三《機器學習基礎概念與框架實踐》

文章3:機器學習基礎概念與框架實踐 ——從理論到代碼,用Scikit-learn構建你的第一個分類模型 一、機器學習基礎理論:三大核心類型 機器學習是人工智能的核心,通過數據讓計算機自動學習規律并做出預測或決策。根據學習方式,可分為三類: 1. 監督學習(Supervised Learni…

腦機接口技術:開啟人類與機器的全新交互時代

在科技飛速發展的今天&#xff0c;人類與機器的交互方式正經歷著前所未有的變革。從最初的鍵盤鼠標&#xff0c;到觸摸屏&#xff0c;再到語音控制&#xff0c;每一次交互方式的升級都極大地提升了用戶體驗和效率。如今&#xff0c;腦機接口&#xff08;Brain-Computer Interfa…

8.2 GitHub企業級PDF報告生成實戰:ReportLab高級技巧與性能優化全解析

GitHub企業級PDF報告生成實戰:ReportLab高級技巧與性能優化全解析 GitHub Sentinel 高級功能實現:PDF 報告生成技術詳解 關鍵詞:PDF 報告生成, ReportLab 實戰, 結構化數據轉換, 容器化字體配置, 企業級報告模板 1. 需求分析與技術選型 PDF 報告生成需要滿足以下技術要求…

架構思維:構建高并發讀服務_基于流量回放實現讀服務的自動化測試回歸方案

文章目錄 引言一、升級讀服務架構&#xff0c;為什么需要自動化測試&#xff1f;二、自動化回歸測試系統&#xff1a;整體架構概覽三、日志收集1. 攔截方式2. 存儲與優化策略3. 架構進化 四、數據回放技術實現關鍵能力 五、差異對比對比方式靈活配置 六、三種回放模式詳解1. 離…

基于Spring Boot 3.0、ShardingSphere、PostgreSQL或達夢數據庫的分庫分表

要實現基于Spring Boot 3.0、ShardingSphere、PostgreSQL或達夢數據庫的分庫分表&#xff0c;首先需要對ShardingSphere進行一些基本配置。你提到的溯源碼、批次號等數據需要考慮到跨年數據的存儲&#xff0c;因此要設計一個能夠動態擴展的分表策略 添加ShardingSphere依賴 在…

位運算的應用

1. 判斷偶數&#xff0c;判斷最低位是0還是1即可&#xff0c;?求模快 x % 2 ! 0 //x正負都可以判斷&#xff1b;不?x%2 1&#xff0c;因為如果x為負奇數&#xff0c;x%2-1 (x & 0x1) 0 例如&#xff1a; int x; int main() { cin>>x; if((x & 0x1)0) cout<…

FOC算法開環控制基礎

1. 為什么要有FOC算法 先看看從有刷電機到無刷電機的簡單介紹&#xff0c;如下圖1&#xff0c;通電螺線圈會產生磁場&#xff0c;這個磁場會產生N級和S級&#xff0c;然后這個電磁鐵就可以吸引永磁體&#xff0c;S級吸引N級&#xff0c;N級吸引S級&#xff0c;通俗的來說&…

【計算機網絡】HTTP中GET和POST的區別是什么?

從以下幾個方面去說明&#xff1a; 1.定義 2.參數傳遞方式 3.安全性 4.冪等性 1.定義&#xff1a; GET&#xff1a; 獲取資源&#xff0c;通常請求數據而不改變服務器的狀態。POST&#xff1a; 提交數據到服務器&#xff0c;通常會改變服務器的狀態或副作用(如創建或更新資源…

7400MB/s5050TBW完美結合,全新希捷酷玩530R SSD體驗評測

7400MB/s&5050TBW完美結合&#xff0c;全新希捷酷玩530R SSD體驗評測 哈嘍小伙伴們好&#xff0c;我是Stark-C~ 說到希捷酷玩530 SSD&#xff0c;很多硬核進階玩家應該都知道&#xff0c;或者說正在使用&#xff08;比如說我~&#xff09;。 作為希捷大廠旗下高性能SSD的…