MyBatis聯合查詢

文章目錄

  • 數據庫設計
  • 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/news/917966.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917966.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917966.shtml

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

相關文章

項目中使用的設計模式

項目中使用的設計模式請列舉幾個項目中常用的設計模式什么是設計模式&#xff0c;在項目中使用了那些設計模式動態代理模式JDK動態代理CGLIB動態代理單例模式懶漢式&#xff08;非線程安全&#xff09;餓漢式懶漢式&#xff08;線程安全&#xff09;工廠模式觀察者模式裝飾器模…

實戰教程:從“對象文件為空“到倉庫重生——修復 Git 倉庫損壞全記錄

文章目錄實戰教程&#xff1a;從"對象文件為空"到倉庫重生——修復 Git 倉庫損壞全記錄案發現場&#xff1a;一個嚴重損壞的倉庫修復之旅&#xff1a;四步讓倉庫重獲新生準備工作&#xff1a;創建安全備份第 1 步&#xff1a;清理戰場——刪除所有空對象第 2 步&…

ansible 操作家族(ansible_os_family)信息

1. 操作系統系列 &#xff08;ansible_os_family&#xff09;ansible web -m setup -a filteransible_os_family2. 操作系統家族為 RedHat 時執行任務--- - hosts: websrvsremote_user: roottasks:- name: Install package on RedHat systemsyum:name: httpdstate: presentwhen…

一文學會c++繼承 組合

文章目錄繼承簡介定義訪問限定符和繼承方式?基類派生類賦值轉換繼承的作用域派生類的默認成員函數繼承與友元繼承與靜態成員?復雜的菱形繼承虛擬繼承組合繼承簡介 繼承是面向對象程序設計代碼復用的重要手段&#xff0c;使得程序員可以在保持原類的基礎上擴展&#xff0c;新…

.Net下載共享文件夾中的文件

由于IIS站點權限等問題&#xff0c;總是沒找到處理辦法&#xff0c;所以改用外掛的winform的方式來下載共享文件&#xff08;也可以改為使用windows服務的方式&#xff09;。 前提需要先在資源管理器中登錄到共享文件夾&#xff0c;確保系統能訪問。 服務端代碼 (.NET后端) usi…

目標檢測數據集 - 眼睛瞳孔檢測數據集下載「包含COCO、YOLO兩種格式」

數據集介紹&#xff1a;眼睛瞳孔檢測數據集&#xff0c;真實采集高質量人臉眼部圖片數據&#xff0c;適用于人臉定位、人臉疾病如白內障等疾病的視覺檢測。數據標注標簽包括 eyepupil 瞳孔一 個缺陷類別&#xff1b;適用實際項目應用&#xff1a;眼睛瞳孔檢測項目&#xff0c;以…

Keil MDK-ARM V5.42a 完整安裝教程

文章目錄一、安裝前期準備二、Keil MDK-ARM 主程序安裝三、器件支持包&#xff08;Pack&#xff09;安裝四、許可證激活五、安裝驗證Keil MDK&#xff08;Microcontroller Development Kit&#xff09;是針對 Arm Cortex-M 系列微控制器的專業開發環境&#xff0c;集成了 μVis…

WPF中引用其他元素各種方法

在WPF中&#xff0c;引用其他元素的方式有多種&#xff0c;每種方式適用于不同場景&#xff0c;各有優缺點。除了x:Reference&#xff0c;常用的還有以下幾種&#xff1a; 一、ElementName 綁定&#xff08;最常用的XAML綁定方式&#xff09; 通過元素的x:Name屬性引用同一作用…

Python生成統計學公式

一元線性回歸模型 2.1回歸分析概述/25 一、回歸分析基本概念/25 二、總體回歸函數/27 三、隨機誤差項/29 四、樣本回歸函數/30 2.2 一元線性回歸模型的參數估計/32 一、參數估計的普通最小二乘法/32 二、擬合優度/35 2.3基本假設與普通最小二乘估計量的統計性質/36 一、一元線性…

網絡工程師--華為命令專題

一、交換機 交換機分類&#xff1a;1.根據交換方式劃分&#xff1a;&#xff08;1&#xff09;存儲轉發式交換&#xff08;Store and Forward&#xff09;&#xff08;2&#xff09;直通式交換&#xff08;Cut-through&#xff09;&#xff08;3&#xff09;碎片過濾式交換&…

判斷可編輯div的光標是否在最前面

要判斷一個可編輯div(contenteditable)中的光標是否位于最前面&#xff0c;可以使用以下幾種方法&#xff1a; 方法一&#xff1a;使用Selection和Range API function isCaretAtStart(div) {const selection window.getSelection();if (selection.rangeCount 0) return false…

【unity實戰】使用Unity程序化生成3D隨機地牢(附項目源碼)

最終效果 文章目錄最終效果前言1、理解程序生成的核心概念2、種子值的核心作用3、程序生成的實際應用4、主流程序生成技術概覽5、選擇合適的技術實戰1、素材2、生成一面墻變換矩陣數據3、渲染墻壁4、加點隨機不同的墻壁效果5、繪制四面墻壁4、在四個角落生成支柱5、生成地板6、…

多賬號管理方案:解析一款免Root的App分身工具

之前有小伙伴問阿燦有沒有可以軟件分身的免費軟件&#xff0c;后來阿燦找到了一款可以無限分身的app感覺很實用&#xff0c;只有10M大小 02軟件介紹說白了它能給各種app和游戲做分身&#xff0c;包括V信、qQ、某音、某付寶這些&#xff0c;而且支持最新的安卓15系統。每個分身…

(附源碼)基于PHP和Vue的網上購物平臺

內容摘要 內容摘要: 隨著互聯網技術的迅猛發展&#xff0c;網上購物已成為人們日常生活的重要組成部分。本文圍繞PHPVue技術棧構建的網上購物平臺展開研究&#xff0c;深入探討了該平臺的架構設計與實現細節。平臺前端采用Vue框架&#xff0c;利用其組件化開發和數據驅動的特性…

51單片機

中斷系統1.什么是中斷當CPU正在處理某件事的時候外界發生了緊急事件請求&#xff0c;要求CPU暫停當前的工作&#xff0c;轉而去處理這個緊急事件&#xff0c;處理完以后&#xff0c;再回到原來被中斷的地方&#xff0c;繼續原來的工作&#xff0c;這樣的過程稱為中斷2.為什么要…

前端開發:HTML(5)—— 表單

下面我們來學習表單。 目錄 什么是Web表單&#xff1f; 表單標簽 1.form標簽 2.輸入框 文本框和密碼框 單選框和復選框 1.單選框 2.復選框 3.按鈕 &#xff08;1&#xff09;普通按鈕 &#xff08;2&#xff09;提交按鈕 &#xff08;3&#xff09;重置按鈕 &#…

【YOLOv8改進 - C2f融合】C2f融合SFS-Conv(空間 - 頻率選擇卷積)提升特征多樣性,同時減少參數和計算量

YOLOv8目標檢測創新改進與實戰案例專欄 專欄目錄: YOLOv8有效改進系列及項目實戰目錄 包含卷積,主干 注意力,檢測頭等創新機制 以及 各種目標檢測分割項目實戰案例 專欄鏈接: YOLOv8基礎解析+創新改進+實戰案例 文章目錄 YOLOv8目標檢測創新改進與實戰案例專欄 介紹 摘要 文…

如何將照片從POCO手機傳輸到Mac電腦

將照片從POCO手機傳輸到Mac電腦可能會有些困難&#xff0c;因為與iPhone不同&#xff0c;POCO設備沒有原生的macOS支持。這常常讓用戶尋找簡單、有效的方法來移動圖片&#xff0c;同時避免丟失質量&#xff0c;節省時間&#xff0c;并避免復雜的軟件設置。如果你想知道如何將照…

最新教程 | CentOS 7 內網環境 Nginx + ECharts 頁面離線部署手冊(RPM 安裝方式)

&#x1f4c1; 一、準備階段&#xff08;在聯網電腦上完成&#xff09; 1.1 下載 Nginx 官方 RPM 安裝包 在聯網電腦瀏覽器中訪問 Nginx 官方穩定版本倉庫&#xff1a; &#x1f517; 地址&#xff1a;http://nginx.org/packages/centos/7/x86_64/ ??云盤&#xff1a;htt…

Redis 常用數據類型 (下)

文章目錄前言一 Hash 哈希1. Hash 相關命令hset 和 hgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyincrbyfloat2. Hash 命令小結3. Hash 內部編碼Hash 在緩存中的應用場景介紹緩存方式對比二、List 列表1. LIST總體介紹2. List 普通命令lpushlpushxrpushrpushxlrange…