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

MyBatis 多表查詢?nèi)N最常見(jiàn)的寫(xiě)法

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

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

你是不是也寫(xiě)過(guò)這種需求:

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

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

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

?? 三種最常見(jiàn)的寫(xiě)法 

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

這是我最常用也最穩(wěn)定的一種方式:寫(xiě)一條聯(lián)表 SQL,把需要的字段都查出來(lái),返回扁平結(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ù);
  • 性能高,邏輯直觀;
  • 可與分頁(yè)插件(如 PageHelper)完美配合。

我的建議:

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

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

適合結(jié)構(gòu)較為清晰的“樹(shù)狀結(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):

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

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

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

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

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

示例 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)在這里!

?? 你可能踩過(guò)的坑

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

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

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

?? 我的最佳實(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é)一句話:

多表查詢選對(duì)方式,寫(xiě)代碼少掉一半 bug。

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

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

相關(guān)文章

  • Maven編譯報(bào)錯(cuò):未與 -source 8 一起設(shè)置引導(dǎo)類(lèi)路徑的完美解決方案

    Maven編譯報(bào)錯(cuò):未與 -source 8 一起設(shè)置引導(dǎo)類(lèi)路徑的完美解決方案

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

    如何使用Spring boot的@Transactional進(jìn)行事務(wù)管理

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

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

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

    mybatis中的異常BindingException詳解

    這篇文章主要介紹了mybatis中的異常BindingException詳解,此異常是mybatis中拋出的,意思是使用的這個(gè)方法找到,但是因?yàn)閙apperScan()已經(jīng)掃描到了Mapper類(lèi)了,在綁定Mapper.xml時(shí)沒(méi)有綁定到導(dǎo)致的,需要的朋友可以參考下
    2024-01-01
  • Java字符串替換方法詳細(xì)講解

    Java字符串替換方法詳細(xì)講解

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

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

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

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

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

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

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

    eclipse+maven+spring mvc項(xiàng)目基本搭建過(guò)程

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

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

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

最新評(píng)論

明水县| 霍山县| 南木林县| 普定县| 夏邑县| 渭南市| 大同市| 老河口市| 深泽县| 大同市| 洛浦县| 盘锦市| 武安市| 临潭县| 芷江| 阿拉善左旗| 香河县| 台中市| 伊宁市| 龙州县| 丽水市| 信阳市| 房产| 佛教| 大理市| 定陶县| 项城市| 民乐县| 海阳市| 集贤县| 文安县| 蓝田县| 锦州市| 通江县| 鹿泉市| 岑溪市| 武义县| 永顺县| 北安市| 罗定市| 金川县|