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

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

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

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

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

  • 查詢某個用戶及其角色列表
  • 查詢訂單及明細
  • 查詢項目及其下屬的多個階段和負責人

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

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

?? 三種最常見的寫法 

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

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

示例 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

特點:

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

我的建議:

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

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

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

示例 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>

特點:

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

踩坑經(jīng)驗:

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

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

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

示例 XML:

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

特點:

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

實戰(zhàn)建議:

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

?? 你可能踩過的坑

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

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

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

?? 我的最佳實踐模板(真實項目用的)

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

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

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

不必糾結(jié)哪種方式最“完美”,關(guān)鍵是是否適合你當前場景。
記?。?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)文章

  • Maven編譯報錯:未與 -source 8 一起設(shè)置引導類路徑的完美解決方案

    Maven編譯報錯:未與 -source 8 一起設(shè)置引導類路徑的完美解決方案

    這篇文章主要為大家詳細介紹了Maven編譯報錯:未與 -source 8 一起設(shè)置引導類路徑的相關(guān)解決方案,文中的示例代碼講解詳細,有需要的小伙伴可以了解下
    2025-10-10
  • 如何使用Spring boot的@Transactional進行事務管理

    如何使用Spring boot的@Transactional進行事務管理

    這篇文章介紹了SpringBoot中使用@Transactional注解進行聲明式事務管理的詳細信息,包括基本用法、核心配置參數(shù)、關(guān)鍵注意事項、調(diào)試技巧、最佳實踐以及完整示例,感興趣的朋友一起看看吧
    2025-02-02
  • 詳解在Java的Struts2框架中配置Action的方法

    詳解在Java的Struts2框架中配置Action的方法

    這篇文章主要介紹了詳解在Java的Struts2框架中配置Action的方法,講解了包括struts.xml中的action配置及基于注解方式Action配置的兩個方式,需要的朋友可以參考下
    2016-03-03
  • mybatis中的異常BindingException詳解

    mybatis中的異常BindingException詳解

    這篇文章主要介紹了mybatis中的異常BindingException詳解,此異常是mybatis中拋出的,意思是使用的這個方法找到,但是因為mapperScan()已經(jīng)掃描到了Mapper類了,在綁定Mapper.xml時沒有綁定到導致的,需要的朋友可以參考下
    2024-01-01
  • Java字符串替換方法詳細講解

    Java字符串替換方法詳細講解

    在Java編程中,處理字符串公式運算是一項常見的任務,特別是在需要動態(tài)計算或自定義邏輯的場景,這篇文章主要介紹了Java字符串替換方法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-09-09
  • MyBatis typeAliases元素標簽(含注解方式)及其屬性、設(shè)置方式

    MyBatis typeAliases元素標簽(含注解方式)及其屬性、設(shè)置方式

    這篇文章主要介紹了MyBatis typeAliases元素標簽(含注解方式)及其屬性、設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 解析Springboot集成Tile38客戶端之Set命令實現(xiàn)示例

    解析Springboot集成Tile38客戶端之Set命令實現(xiàn)示例

    這篇文章主要為大家介紹了解析Springboot集成Tile38客戶端之Set命令實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • JDK集合源碼之解析TreeMap(二)

    JDK集合源碼之解析TreeMap(二)

    下面小編就為大家?guī)硪黄獪\談java中的TreeMap 排序與TreeSet 排序。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-07-07
  • eclipse+maven+spring mvc項目基本搭建過程

    eclipse+maven+spring mvc項目基本搭建過程

    這篇文章主要介紹了eclipse+maven+spring mvc項目基本搭建過程,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-09-09
  • SpringBoot用ServiceLocatorFactoryBean優(yōu)雅切換支付渠道

    SpringBoot用ServiceLocatorFactoryBean優(yōu)雅切換支付渠道

    本文主要介紹了SpringBoot用ServiceLocatorFactoryBean優(yōu)雅切換支付渠道,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-10-10

最新評論

高平市| 临漳县| 和硕县| 鄢陵县| 东山县| 兴城市| 永新县| 丽江市| 施甸县| 益阳市| 临沭县| 申扎县| 嘉鱼县| 玛多县| 八宿县| 丰城市| 昭通市| 维西| 玛曲县| 南和县| 绥化市| 浪卡子县| 荃湾区| 五常市| 中牟县| 嘉善县| 信丰县| 萨迦县| 筠连县| 崇左市| 广东省| 眉山市| 黄骅市| 水富县| 西昌市| 尼勒克县| 兴安县| 仁怀市| 太湖县| 许昌县| 河源市|