MyBatis聯合查詢 - XML篇

文章目錄

  • 數據庫設計
  • MyBatis 配置
  • MyBatis 映射文件
    • Mapper 接口
  • 總結

數據庫設計

建表 SQL

CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL
);CREATE TABLE `order` (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_no VARCHAR(50) NOT NULL,FOREIGN KEY (user_id) REFERENCES user(id)
);CREATE TABLE role (id INT PRIMARY KEY AUTO_INCREMENT,role_name VARCHAR(50) NOT NULL
);CREATE TABLE user_role (user_id INT NOT NULL,role_id INT NOT NULL,PRIMARY KEY (user_id, role_id),FOREIGN KEY (user_id) REFERENCES user(id),FOREIGN KEY (role_id) REFERENCES role(id)
);

插入以下數據:

INSERT INTO user (name) VALUES ('Alice'), ('Bob');
INSERT INTO `order` (user_id, order_no) VALUES (1, 'ORD001'), (1, 'ORD002'), (2, 'ORD003');
INSERT INTO role (role_name) VALUES ('Admin'), ('User');
INSERT INTO user_role (user_id, role_id) VALUES (1, 1), (1, 2), (2, 2);

MyBatis 配置

我們使用 MySQL 數據庫,MyBatis 的核心配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test_db?useSSL=false"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>

定義 Java 實體類,映射數據庫表:

@Data
public class User {private Integer id;private String name;private Order order; // 一對一:用戶關聯一個訂單private List<Order> orders; // 一對多:用戶關聯多個訂單private List<Role> roles; // 多對多:用戶關聯多個角色
}@Data
public class Order {private Integer id;private Integer userId;private String orderNo;
}@Data
public class Role {private Integer id;private String roleName;
}

MyBatis 映射文件

在 UserMapper.xml 中定義關聯查詢,展示一對一、一對多和多對多的實現。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper"><!-- 一對一 --><resultMap id="UserWithOrderMap" type="com.example.entity.User"><id property="id" column="user_id"/><result property="name" column="user_name"/><association property="order" javaType="com.example.entity.Order"><id property="id" column="order_id"/><result property="userId" column="user_id"/><result property="orderNo" column="order_no"/></association></resultMap><select id="selectUserWithOrder" resultMap="UserWithOrderMap">SELECT *FROM user uLEFT JOIN `order` o ON u.id = o.user_idWHERE u.id = #{id}LIMIT 1</select><!-- 一對多 --><resultMap id="UserWithOrdersMap" type="com.example.entity.User"><id property="id" column="user_id"/><result property="name" column="user_name"/><collection property="orders" ofType="com.example.entity.Order"><id property="id" column="order_id"/><result property="userId" column="user_id"/><result property="orderNo" column="order_no"/></collection></resultMap><select id="selectUserWithOrders" resultMap="UserWithOrdersMap">SELECT *FROM user uLEFT JOIN `order` o ON u.id = o.user_idWHERE u.id = #{id}</select><!-- 多對多 --><resultMap id="UserWithRolesMap" type="com.example.entity.User"><id property="id" column="user_id"/><result property="name" column="user_name"/><collection property="roles" ofType="com.example.entity.Role"><id property="id" column="role_id"/><result property="roleName" column="role_name"/></collection></resultMap><select id="selectUserWithRoles" resultMap="UserWithRolesMap">SELECT *FROM user uLEFT JOIN user_role ur ON u.id = ur.user_idLEFT JOIN role r ON ur.role_id = r.idWHERE u.id = #{id}</select>
</mapper>

Mapper 接口

定義對應的 Mapper 接口:

public interface UserMapper {User selectUserWithOrder(Integer id); // 一對一User selectUserWithOrders(Integer id); // 一對多User selectUserWithRoles(Integer id); // 多對多
}

以下是測試代碼,驗證查詢結果:

public class MyBatisTest {public static void main(String[] args) throws Exception {SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(new FileInputStream("mybatis-config.xml"));try (SqlSession session = factory.openSession()) {UserMapper mapper = session.getMapper(UserMapper.class);// 測試一對一User userWithOrder = mapper.selectUserWithOrder(1);System.out.println(userWithOrder.getName());// 測試一對多User userWithOrders = mapper.selectUserWithOrders(1);System.out.println(userWithOrders.getName());userWithOrders.getOrders().forEach(order -> System.out.println("  - " + order.getOrderNo()));// 測試多對多User userWithRoles = mapper.selectUserWithRoles(1);System.out.println(userWithRoles.getName());userWithRoles.getRoles().forEach(role -> System.out.println("  - " + role.getRoleName()));}}
}

總結

一對一:通過 association 標簽,查詢用戶及其關聯的一個訂單。
一對多:通過 collection 標簽,查詢用戶及其所有訂單,MyBatis 自動將多行訂單數據映射到 List。
多對多:通過 collection 標簽,查詢用戶及其所有角色,借助中間表 user_role 實現關聯。

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

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

相關文章

Kubelet 探針如何選擇 IP:status.PodIP 溯源與“同 Pod 兩個 IP“現象解析

背景與現象同一個 Pod 的 readiness 和 liveness 探針日志顯示連接的 IP 不一致&#xff08;例如 10.10.6.10:9999 與 10.10.6.32:9999&#xff09;。本文從 kubelet 源碼入手&#xff0c;解釋探針目標 IP 的來源、為何會出現兩個不同 IP&#xff0c;并給出建議與驗證方法。在如…

Arm Development Studio 安全通告:CVE-2025-7427

安全之安全(security)博客目錄導讀 目錄 一、概述 二、CVE 詳情 三、受影響產品 四、建議 五、致謝 六、版本歷史 一、概述 ARM已知悉一個影響 Arm Development Studio 的安全漏洞&#xff0c;該漏洞可能允許攻擊者執行 DLL 劫持攻擊&#xff08;DLL hijacking attack&…

C#異步編程雙利器:異步Lambda與BackgroundWorker實戰解析

**摘要&#xff1a;**深入剖析兩種異步編程范式&#xff0c;解決GUI線程阻塞難題 一、異步Lambda表達式&#xff1a;事件處理的輕量化利器 核心價值&#xff1a;簡化事件響應中的異步操作&#xff0c;避免UI線程阻塞 ? 典型應用場景&#xff08;WPF示例&#xff09;&#xff1…

yolo world (1): 論文解讀

YOLO 系列檢測器以其高效性和實用性而聞名。然而,它們依賴于預定義和訓練的目標類別,這限制了其在開放場景中的適用性。為了解決這一限制,我們提出了 YOLO-World,這是一種創新的方法,通過視覺-語言建模和大規模數據集預訓練,增強了 YOLO 的開放詞匯檢測能力。具體來說,我…

【JVM】深入解析Java虛擬機

目錄 1. 區分JDK&#xff0c;JRE 和 JVM 1.1 JVM 1.2 JRE 1.3 JDK 1.4 關系總結 2. 跨平臺性 3. JVM中的內存劃分 4. JVM的類加載機制 5. 雙親委派模型 6. 垃圾回收機制&#xff08;GC&#xff09; 6.1 識別垃圾 6.1.1 單個引用 6.1.2 多個引用 6.2 釋放垃圾 6.…

98-基于Python的網上廚房美食推薦系統

基于Python的網上廚房美食推薦系統 - 技術分享博客 &#x1f4cb; 目錄 項目概述技術棧系統架構核心功能實現數據庫設計推薦算法數據可視化部署與優化項目特色總結與展望 &#x1f3af; 項目概述 項目背景 隨著生活節奏的加快&#xff0c;越來越多的人開始關注美食制作&…

創建MyBatis-Plus版的后端查詢項目

記得編碼和maven庫的檢測&#xff01;&#xff01;&#xff01; 1、maven庫導入包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…

開發板RK3568和stm32的異同:

RK3568 和 STM32 是兩類不同定位的處理器 / 微控制器&#xff0c;在架構、性能、應用場景等方面差異顯著&#xff0c;但也存在部分共性。以下從核心特性、異同點及典型場景進行對比&#xff1a;一、核心差異維度RK3568&#xff08;瑞芯微&#xff09;STM32&#xff08;意法半導…

C# 使用iText獲取PDF的trailer數據

文章目錄C# 使用iText獲取PDF的trailer數據iText 核心概念C# 代碼示例步驟 1: 確保已安裝 iText步驟 2: C# 代碼程序運行效果解讀 Trailer 的輸出總結C# 使用iText獲取PDF的trailer數據 開發程序debug的時候&#xff0c;看到了PDF有個trailer數據&#xff0c;挺有意思&#xf…

京東流量資產基于湖倉架構的落地實踐

在當今數字化商業浪潮中&#xff0c;數據無疑是企業的核心資產&#xff0c;而流量數據更是電商巨頭京東業務運轉的關鍵驅動力。它廣泛應用于搜索推薦、廣告投放等多個核心業務場景&#xff0c;直接影響著用戶體驗和商業效益。但隨著業務規模的不斷膨脹&#xff0c;傳統架構在處…

???????【Datawhale AI夏令營】多模態RAG財報問答挑戰賽:學習筆記與上分思考

一、 初識賽題——從迷茫到清晰剛看到賽題時&#xff0c;坦白說有些不知所措。“多模態”、“RAG”、“圖文混排PDF”&#xff0c;這些詞匯組合在一起&#xff0c;聽起來就像一個龐大而復雜的工程。但當我強迫自己靜下心來&#xff0c;從“終點”&#xff08;提交格式和評審規則…

數據挖掘2.6 Perceptron Modeling 感知器建模

Perceptron Modeling 感知器建模Linear Discriminants 線性判別式Loss Function 損失函數misclassification 誤分類0-1 Loss/Error function 0-1損失函數Hinge Loss Function 鉸鏈損失函數Optimization 優化算法Linear Discriminants 線性判別式 線性判別式公式 f(x;w)w1x(1)w…

使用qemu運行與GDB調試內核

目錄 一、前期準備 二、內核編譯 三、QEMU與GDB 1、QEMU調試參數 2、gdb vmlinux 一、前期準備 內核鏡像&#xff1a;bzimage gdb&#xff1a;x86_64 QEMU&#xff1a;qemu-system-x86_64 前置知識&#xff1a; &#xff08;1&#xff09;內核編譯 &#xff08;2&#x…

歐盟 Radio Equipment Directive (RED)

歐盟 Radio Equipment Directive (RED) ——從 2014/53/EU 原文到 2025-08-01 強制生效的網絡安全新規&#xff0c;一次看懂全部關鍵點。1. 法規身份與適用范圍要素內容指令全稱Directive 2014/53/EU on radio equipment取代指令1999/5/EC (R&TTE)適用產品所有“有意發射/接…

【FastExcel】解決ReadSheet在Map中獲取對象不準確問題(已提交PR并合并到開源社區)

解決問題&#xff1a;源碼ReadSheet在同一個Map中獲取對象不準確問題 PR&#xff1a;Fixed the issue where different ReadSheet objects could not get the correct value when comparing them. 一&#xff1a;問題場景 ReadSheet在同一個Map中獲取對象不準確(如Map<…

【網絡安全入門基礎教程】TCP/IP協議深入解析(非常詳細)零基礎入門到精通,收藏這一篇就夠了

前言 這是小編給粉絲盆友們整理的網絡安全入門到精通系列第三章計算機網絡中TCP/IP協議的解析&#xff0c;喜歡的朋友們&#xff0c;記得給大白點贊支持和收藏一下&#xff0c;關注我&#xff0c;學習黑客技術。TCP/IP協議包含了一系列的協議&#xff0c;也叫TCP/IP協議族&…

Latex中公式部分輸入正體的字母\mathrm{c}

Latex中公式部分輸入正體的字母\mathrm{c}“\mathrm{c}”如何在Word中輸入\mathrm{c}“\mathrm{c}” 在 LaTeX 中&#xff0c;“\mathrm{c}” 用于在數學模式中排版“c”這個字母為羅馬體&#xff08;正體&#xff09;。“\mathrm” 是羅馬字體命令&#xff0c;它告訴LaTeX以羅…

Document Picture-in-Picture API擁抱全新浮窗體驗[參考:window.open]

在前端開發中&#xff0c;我們經常會遇到這樣的需求&#xff1a;彈出一個浮動窗口來顯示一些實時信息、工具欄或視頻內容。過去我們會用 window.open()&#xff0c;后來越來越多的開發者傾向于使用 Modal。但現在&#xff0c;一個更現代的 API 出現了——Document Picture-in-P…

【指南版】網絡與信息安全崗位系列(三):安全運維工程師

一、安全運維工程師到底做什么&#xff1f;—— 用校園場景幫你理解簡單說&#xff0c;安全運維工程師就像 “網絡世界的安保隊長 系統管家”&#xff1a;既要實時監控網絡和系統的 “異常動靜”&#xff08;類似學校保安巡邏查隱患&#xff09;&#xff0c;又要負責日常的安全…