SQL子查詢與MyBatis映射

文章目錄

  • 前言
  • 1. 數據庫表結構
  • 2. MyBatis Mapper XML
  • 3. Java 實體類
  • 4. 技術點解析
  • 5. 執行效果
  • 6. 優化建議


前言

提示:這里可以添加本文要記錄的大概內容:

以下是一個結合 SQL 別名、子查詢、MyBatis 字段映射和代碼復用的完整案例,以用戶管理系統為例:

場景描述
查詢用戶信息時需同時顯示:

  1. 基礎用戶信息
  2. 所屬部門名稱
  3. 最近3個月的訂單數量
  4. 使用代碼復用優化重復SQL片段

1. 數據庫表結構

用戶表(User)
在這里插入圖片描述
部門表(Department)
在這里插入圖片描述
訂單表(Order)
在這里插入圖片描述


2. MyBatis Mapper XML

<!-- 結果映射 -->
<resultMap id="userResultMap" type="UserDTO"><id property="userId" column="user_id"/><result property="username" column="username"/><result property="departmentName" column="department_name"/><result property="orderCount" column="order_count"/><result property="createTime" column="create_time"/>
</resultMap><!-- 定義可復用的基礎字段 -->
<sql id="baseUserColumns">u.id AS user_id,u.username,u.create_time
</sql><!-- 定義部門關聯字段 -->
<sql id="deptColumns">d.dept_name AS department_name
</sql><!-- 復合查詢 -->
<select id="selectUserWithStats" resultMap="userResultMap">SELECT <!-- 復用基礎字段 --><include refid="baseUserColumns"/>,<!-- 復用部門字段 --><include refid="deptColumns"/>,<!-- 使用子查詢和別名 -->(SELECT COUNT(*) FROM order o WHERE o.user_id = u.idAND o.order_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH)) AS order_countFROM user uLEFT JOIN department d ON u.dept_id = d.idWHERE u.id = #{userId}
</select>

3. Java 實體類

public class UserDTO {private Long userId;       // 映射 user_idprivate String username;   // 直接映射private String departmentName; // 映射 department_nameprivate Integer orderCount;    // 映射 order_countprivate Date createTime;   // 映射 create_time// getters/setters
}

4. 技術點解析

  1. SQL 別名(Alias)
   u.id AS user_id,d.dept_name AS department_name
  • 解決字段名沖突
  • 實現數據庫蛇形命名到Java駝峰命名的轉換
  1. 子查詢封裝
   (SELECT COUNT(*) ...) AS order_count
  • 將復雜統計邏輯封裝在子查詢中
  • 避免多次查詢數據庫
  1. MyBatis字段映射
   <resultMap id="userResultMap" type="UserDTO"><id property="userId" column="user_id"/><result property="departmentName" column="department_name"/></resultMap>
  • 實現數據庫字段到對象屬性的映射
  • 處理命名差異問題
  1. SQL代碼復用
   <include refid="baseUserColumns"/><include refid="deptColumns"/> 
  • 統一管理公共字段
  • 修改時只需改動一處

5. 執行效果

當調用selectUserWithStats方法查詢用戶 ID 時:

獲取某個特定用戶的基本信息及其最近3個月的訂單活動情況

生成的SQL:

SELECT u.id AS user_id,u.username,u.create_time,d.dept_name AS department_name,(SELECT COUNT(*) FROM order o WHERE o.user_id = u.idAND o.order_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH)) AS order_count
FROM user u
LEFT JOIN department d ON u.dept_id = d.id
WHERE u.id = #{id}

下面是對這段SQL子查詢語句每一行的詳細解釋:

  (SELECT COUNT(*) FROM order o WHERE o.user_id = u.idAND o.order_time >= DATE_SUB(NOW(), INTERVAL 3 MONTH)) AS order_count
  • 這用于計算特定用戶在過去3個月內生成的訂單數量。它從order表(別名為o)中計數所有滿足條件的記錄:user_id與外部查詢中的用戶ID相匹配,且order_time在當前時間(NOW())起往前推3個月的時間范圍內。結果被命名為order_count

查詢結果映射:

UserDTO{userId=1001, username="張三", departmentName="技術部", orderCount=5, createTime=2023-01-15
}

6. 優化建議

  1. 性能優化:為order.user_idorder_time字段添加索引
  2. 子查詢優化:大數據量時可改為LEFT JOIN查詢
  3. 動態SQL:添加<if>條件實現動態字段控制
  4. 分頁支持:添加LIMIT語句配合PageHelper插件

這個案例完整展示了復雜查詢場景下,如何通過MyBatis的特性實現清晰、可維護的SQL編寫。


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

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

相關文章

基于SpringBoot的“校園周邊美食探索及分享平臺”的設計與實現(源碼+數據庫+文檔+PPT)

基于SpringBoot的“校園周邊美食探索及分享平臺”的設計與實現&#xff08;源碼數據庫文檔PPT) 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 校園周邊美食探索及分享平臺結構圖…

時間復雜度(Time Complexity)

時間復雜度 1. 什么是時間復雜度&#xff1f; 時間復雜度&#xff08;Time Complexity&#xff09;是計算算法執行時間隨輸入規模&#xff08;n&#xff09;增長的變化趨勢。它衡量算法的效率&#xff0c;通常使用大 O 記號&#xff08;Big-O notation&#xff09;表示&#…

樹莓派:更新源

發行版本 Debian 一直維護著至少三個發行版本&#xff1a;“穩定版&#xff08;stable&#xff09;”&#xff0c;“測試版&#xff08;testing&#xff09;”和“不穩定版&#xff08;unstable&#xff09;”。 發行版目錄 下一代 Debian 正式發行版的代號為 bullseye — 發布…

K8s 1.27.1 實戰系列(八)Service

一、Service介紹 1、Service 的作用與核心功能 Service 是 Kubernetes 中用于抽象一組 Pod 并提供穩定訪問入口的資源。它解決了以下問題: ?Pod IP 不固定:Pod 可能因故障、擴縮容或更新導致 IP 變化,Service 通過 ClusterIP(虛擬 IP)提供固定訪問地址。?負載均衡:自動…

RocketMQ性能優化篇

在分布式消息系統中&#xff0c;RocketMQ以其高性能、高可靠性和高可擴展性而被廣泛應用。然而&#xff0c;為了充分發揮其性能優勢&#xff0c;需要進行一系列的性能測試和優化。本文將從性能測試方法和優化實踐兩個方面&#xff0c;詳細介紹如何對RocketMQ進行性能優化。通過…

CSS 知識點總結1

CSS 知識點總結&#xff11; 今天寫了兩個頁面,用到的知識點,總結一下 1. Flexbox 布局 display: flex;&#xff1a;啟用 Flexbox 布局&#xff0c;用于創建靈活的容器。flex-direction: column;&#xff1a;將子元素垂直排列。justify-content&#xff1a;控制子元素在主軸…

雙指針算法專題之——復寫零

文章目錄 題目介紹思路分析異地復寫優化為就地復寫 AC代碼 題目介紹 鏈接: 1089. 復寫零 思路分析 那么這道題我們依然可以使用雙指針算法來解決 異地復寫 先不考慮題目的要求&#xff0c;直接就地在原數組上修改&#xff0c;可能不太好想&#xff0c;我們這里可以先在一個…

Python控制語句 ——break和continue

1.以下關于Python循環結構的描述中,錯誤的是() 。 A、break用來結束當前當次語句,但不跳出當前的循環體。 B、遍歷循環中的遍歷結構可以是字符串、文件、組合數據類型和range函數等。 C、Python通過for,while等保留字構建循環結構。 D、continue只結束本次循環。 答案:A。在…

搭建阿里云專有網絡VPC

目錄 一、概述 二、專有網絡vpc 2.1 vpc基本信息 2.2 vpc資源管理 2.3 vpc網段管理 三、交換機 四、NAT網關 4.1 綁定彈性公網IP 4.2 NAT網關信息 4.3 綁定的彈性公網IP 4.4 DNAT 4.5 SNAT 五、彈性公網IP 六、訪問控制ACL&#xff08;綁定交換機&#xff09; 6…

阿里巴巴發布 R1-Omni:首個基于 RLVR 的全模態大語言模型,用于情感識別

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎&#xff1f;訂閱我們的簡報&#xff0c;深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同&#xff0c;從行業內部的深度分析和實用指南中受益。不要錯過這個機會&#xff0c;成為AI領…

《深度剖析:鴻蒙系統下智能NPC與游戲劇情的深度融合》

在游戲開發領域&#xff0c;鴻蒙系統的崛起為開發者們帶來了前所未有的機遇與挑戰。尤其是在開發基于鴻蒙系統的人工智能游戲時&#xff0c;實現智能NPC的行為邏輯與游戲劇情緊密結合&#xff0c;成為了打造沉浸式游戲體驗的關鍵。 鴻蒙系統作為一款面向全場景的分布式操作系統…

聚劃算!三個模型對比預測!CNN-GRU、GRU、CNN三模型多變量時序光伏功率預測

聚劃算&#xff01;三個模型對比預測&#xff01;CNN-GRU、GRU、CNN三模型多變量時序光伏功率預測 目錄 聚劃算&#xff01;三個模型對比預測&#xff01;CNN-GRU、GRU、CNN三模型多變量時序光伏功率預測預測效果基本介紹程序設計參考資料 預測效果 基本介紹 CNN-GRU、GRU、CN…

C# 的 ManualResetEvent(線程同步操作) 類詳解

C# 的 ManualResetEvent 類詳解 作用 ManualResetEvent 是用于線程同步操作的類&#xff0c;允許一個或多個線程等待特定信號&#xff0c;以協調多個線程的執行順序。它通過事件通知機制實現&#xff0c;確保線程在收到信號前保持阻塞&#xff0c;直到其他線程顯式發出信號。…

小白學習:提示工程(什么是prompt)

課程鏈接 https://www.bilibili.com/video/BV1PX9iYQEry/?spm_id_from333.337.search-card.all.click 一 什么是提示工程 【提示工程】也叫【指令工程】 prompt就是給大模型發的指令&#xff0c;如“給我講個笑話” 懂得提示工程原理會帶來什么優勢 懂得原理 為什么有的指…

Docker Compose 之詳解(Detailed Explanation of Docker Compose)

Docker Compose 之詳解 當容器數量逐漸增多&#xff0c;你是否感到手忙腳亂&#xff1f;面對復雜的部署場景&#xff0c;是時候祭出神器Docker Compose了&#xff01;它能幫你優雅地管理多容器應用&#xff0c;一鍵啟動、停止所有服務&#xff0c;不再為復雜的手動操作焦頭爛額…

C語言 —— 此去經年夢浪蕩魂音 - 深入理解指針(卷一)

目錄 1. 內存和地址 2. 指針變量和地址 2.1 取地址操作符&#xff08;&&#xff09; 2.2 指針變量 2.3 解引用操作符 &#xff08;*&#xff09; 3. 指針的解引用 3.1 指針 - 整數 3.2 void* 指針 4. const修飾指針 4.1 const修飾變量 4.2 const修飾指針變量 5…

【AI】從頭到腳詳解如何創建部署Azure Web App的OpenAI項目

【AI】從頭到腳詳解如何創建部署Azure Web App的OpenAI項目 在Azure Web應用上,您可以使用Python的OpenAI包方便快捷地調用官方API,上傳您的訓練數據,并利用他們的算法進行處理。本教程提供了一個逐步指南,幫助您在Azure Web應用上部署您的OpenAI項目,涵蓋了從資源設置到…

機器視覺工程師紅外相機的選擇:紅外長波工業相機和短波紅外工業相機玄機大總結

紅外長波(LWIR)和短波(SWIR)工業相機在原理、應用場景和技術特點上有顯著差異。以下是它們的對比分析: 1. 波長范圍與成像原理 2. 技術特點 3. 典型應用場景 4. 優缺點對比 LWIR優勢: 無需光照,適用于完全黑暗環境。 直接反映物體溫度分布。 對煙霧、灰塵穿透能力強。…

uni-app學習筆記——自定義模板

一、流程 1.這是一個硬性的流程&#xff0c;只要按照如此程序化就可以實現 二、步驟 1.第一步 2.第二步 3.第三步 4.每一次新建頁面&#xff0c;都如第二步一樣&#xff1b;可以選擇自定義的模版&#xff08;vue3Setup——這是我自己的模版&#xff09;&#xff0c;第二步的…

DeepSeek模型本地化部署方案及Python實現

DeepSeek實在是太火了&#xff0c;雖然經過擴容和調整&#xff0c;但反應依舊不穩定&#xff0c;甚至小圓圈轉半天最后卻提示“服務器繁忙&#xff0c;請稍后再試。” 故此&#xff0c;本文通過講解在本地部署 DeepSeek并配合python代碼實現&#xff0c;讓你零成本搭建自己的AI…