亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis 多表查詢?nèi)N最常見的寫法

 更新時(shí)間:2025年04月22日 10:21:02   作者:扶風(fēng)_w  
這篇文章主要介紹了MyBatis 多表查詢?nèi)N最常見的寫法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

前言:一張關(guān)聯(lián)表,讓你頭禿了嗎?

你是不是也寫過這種需求:

  • 查詢某個(gè)用戶及其角色列表
  • 查詢訂單及明細(xì)
  • 查詢項(xiàng)目及其下屬的多個(gè)階段和負(fù)責(zé)人

最后寫了一堆復(fù)雜 SQL + resultMap,運(yùn)行一看,要么數(shù)據(jù)重復(fù)、要么數(shù)據(jù)丟失,最慘還可能觸發(fā) N+1 查詢……

其實(shí)問題不是 MyBatis 不行,而是你用的方法不對。

?? 三種最常見的寫法 

? 方式一:聯(lián)表查詢 + 扁平映射(推薦)

這是我最常用也最穩(wěn)定的一種方式:寫一條聯(lián)表 SQL,把需要的字段都查出來,返回扁平結(jié)構(gòu),再在 Java 層進(jìn)行組裝。

示例 SQL:

SELECT u.id AS userId, u.name AS userName,
       r.id AS roleId, r.name AS roleName
FROM user u
LEFT JOIN user_role ur ON u.id = ur.user_id
LEFT JOIN role r ON ur.role_id = r.id

特點(diǎn):

  • 一條 SQL 查全所有數(shù)據(jù);
  • 性能高,邏輯直觀;
  • 可與分頁插件(如 PageHelper)完美配合。

我的建議:

Java 層用 Map<Long, UserDTO> 分組封裝,適合在 Service 層統(tǒng)一做聚合邏輯。

?? 方式二:嵌套結(jié)果(resultMap + collection)

適合結(jié)構(gòu)較為清晰的“樹狀結(jié)構(gòu)”,比如訂單和訂單項(xiàng)、項(xiàng)目和子模塊。

示例 XML: 

<resultMap id="userMap" type="User">
  <id property="id" column="user_id"/>
  <result property="name" column="user_name"/>
  <collection property="roles" ofType="Role">
    <id property="id" column="role_id"/>
    <result property="name" column="role_name"/>
  </collection>
</resultMap>

特點(diǎn):

  • 多表映射層級清晰;
  • 比較適合中小型數(shù)據(jù)量。

踩坑經(jīng)驗(yàn):

  • 寫錯(cuò)列名字段,就會(huì)導(dǎo)致內(nèi)層集合全是 null;
  • 出現(xiàn)重復(fù)數(shù)據(jù)時(shí),要手動(dòng)去重或用 Set;
  • 不適合配合分頁,容易導(dǎo)致“分頁的是主表,但集合是全量”。

?? 方式三:嵌套查詢(nested select)

適合邏輯解耦,按模塊維護(hù)的場景。

示例 XML:

<collection property="roles" ofType="Role" select="selectRolesByUserId" column="id"/>

特點(diǎn):

  • 每條主表數(shù)據(jù)觸發(fā)一次副查詢;
  • 易維護(hù)但 極易 N+1;
  • 不適合大批量數(shù)據(jù)查詢。

實(shí)戰(zhàn)建議:

除非你能保證每次最多查詢 10 條主記錄,否則慎用。性能瓶頸很容易出現(xiàn)在這里!

?? 你可能踩過的坑

問題癥狀原因建議
查詢結(jié)果為 null子集合沒數(shù)據(jù)字段名或別名不匹配顯式寫 column 屬性或使用 @Results 映射
一對多重復(fù)數(shù)據(jù)主表字段重復(fù)出現(xiàn)聯(lián)表未分組 / Java 封裝沒處理手動(dòng)分組聚合,避免直接用 List
分頁異常只分頁主表,子表數(shù)據(jù)混亂不支持嵌套分頁聯(lián)表 + 扁平查詢是最佳方案
查詢慢到爆炸N+1 查詢每條主記錄觸發(fā)一次 select轉(zhuǎn)成 join 聯(lián)查或改為批量查

? 實(shí)戰(zhàn)建議:如何選擇這三種方式? 

類型性能可維護(hù)性適合場景
聯(lián)表扁平查詢???????大批量、一對多、分頁場景
嵌套結(jié)果 resultMap???????結(jié)構(gòu)清晰、數(shù)據(jù)量適中
子查詢 nested???????小數(shù)據(jù)量、邏輯獨(dú)立場景

?? 我的最佳實(shí)踐模板(真實(shí)項(xiàng)目用的)

  • DAO 層只查數(shù)據(jù),不做結(jié)構(gòu)組裝
  • Service 層按業(yè)務(wù)模型拼裝 DTO;
  • 多表結(jié)果不要直接給前端,統(tǒng)一封裝響應(yīng)結(jié)構(gòu);
  • DTO + Builder 模式 + Map 分組,靈活好用;

?? 總結(jié)一句話:

多表查詢選對方式,寫代碼少掉一半 bug。

不必糾結(jié)哪種方式最“完美”,關(guān)鍵是是否適合你當(dāng)前場景。
記?。?strong>能用聯(lián)查查全的,就別搞子查詢;分頁場景盡量別用嵌套結(jié)構(gòu);小數(shù)據(jù)就圖方便,結(jié)構(gòu)優(yōu)先。

到此這篇關(guān)于MyBatis 多表查詢的文章就介紹到這了,更多相關(guān)MyBatis 多表查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解SpringIOC容器中bean的作用范圍和生命周期

    詳解SpringIOC容器中bean的作用范圍和生命周期

    這篇文章主要介紹了SpringIOC容器中bean的作用范圍和生命周期,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • java如何實(shí)現(xiàn)數(shù)位分離

    java如何實(shí)現(xiàn)數(shù)位分離

    這篇文章主要介紹了java如何實(shí)現(xiàn)數(shù)位分離,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 詳解Spring Security 簡單配置

    詳解Spring Security 簡單配置

    本篇文章主要介紹了詳解Spring Security 簡單配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • SpringBoot監(jiān)聽Redis key失效事件的實(shí)現(xiàn)代碼

    SpringBoot監(jiān)聽Redis key失效事件的實(shí)現(xiàn)代碼

    這篇文章給大家介紹了SpringBoot實(shí)現(xiàn)監(jiān)聽Redis key失效事件的方法,文中通過代碼示例給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-02-02
  • Spring Boot插件spring tool suite安裝及使用詳解

    Spring Boot插件spring tool suite安裝及使用詳解

    這篇文章主要介紹了Spring Boot插件spring tool suite安裝及使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 詳解Java編程中對線程的中斷處理

    詳解Java編程中對線程的中斷處理

    這篇文章主要介紹了Java編程中對線程的中斷處理,特別講解了中斷的時(shí)機(jī)與中斷狀態(tài)的管理,需要的朋友可以參考下
    2015-11-11
  • 詳解Java中String類型與默認(rèn)字符編碼

    詳解Java中String類型與默認(rèn)字符編碼

    這篇文章主要介紹了Java中String類型與默認(rèn)字符編碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • MyBatis-Plus將字段修改為空值的解決方案

    MyBatis-Plus將字段修改為空值的解決方案

    這篇文章主要介紹了MyBatis-Plus將字段修改為空值的解決方案,本文給大家分享三種常用的解決方案,感興趣的朋友一起看看吧
    2023-12-12
  • Java實(shí)現(xiàn)藍(lán)橋杯數(shù)獨(dú)游戲的示例代碼

    Java實(shí)現(xiàn)藍(lán)橋杯數(shù)獨(dú)游戲的示例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)藍(lán)橋杯數(shù)獨(dú)游戲的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Intellij IDEA實(shí)現(xiàn)SpringBoot項(xiàng)目多端口啟動(dòng)的兩種方法

    Intellij IDEA實(shí)現(xiàn)SpringBoot項(xiàng)目多端口啟動(dòng)的兩種方法

    有時(shí)候使用springboot項(xiàng)目時(shí)遇到這樣一種情況,用一個(gè)項(xiàng)目需要復(fù)制很多遍進(jìn)行測試,除了端口號不同以外,沒有任何不同。遇到這種情況怎么辦呢?這時(shí)候可以使用Intellij IDEA解決
    2018-06-06

最新評論