mybatis 的多表查詢

文章目錄

    • 多表查詢
      • 一對一
      • 一對多

多表查詢

一對一

  • 開啟代碼片段編寫

image-20250406211401870

image-20250406211421125

專注于 SQL的 編寫

  • JDBC 的寫法,注重于 SQL

image-20250406212503288

  • mybatis 在 一對一查詢時,核心在于
    • 建立每個表對應的實體類
    • 主鍵根據 主鍵 id 進行查詢,副標根據 設定外鍵進行查詢 在 SQL編寫上簡單很多
    • 通過注解,對映射結果進行處理,讓二者產生聯系,來實現多表查詢

image-20250406213406652

  • 學生詳情實體類
package com.yanyu.mybatis2.po;import lombok.Data;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 21:26* @description:student_detail 表的 字段映射實體類*/
@Data
public class StudentDetail {private Integer id;private Integer studentId;private String addr;
}
  • 學生實體類
package com.yanyu.mybatis2.po;import lombok.Data;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 21:25* @description:student 表的 字段映射實體類*/
@Data
public class Student {private Integer id;private String name;private String stuid;private String major;
//  連接  學生詳情的字段StudentDetail studentDetail;}
  • 接口設計
    • 分別編寫查詢student student_detail 的操作,根據 各自的主鍵 id
    • 處理映射結果集

image-20250406220831138

package com.yanyu.mybatis2.mapper;import com.yanyu.mybatis2.po.Student;
import com.yanyu.mybatis2.po.StudentDetail;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 21:39* @description:多表查詢,一對一*/
public interface StudentOneToOne {
//    根據  id  主鍵  查詢 副標 學生詳情 結果自然就是  StudentDetail@Select("""select id,student_id,addr from student_detail where student_id=#{student_id}""")
//    進行副表的結果映射@Results({@Result(id = true,column = "id",property = "id"),@Result(column = "student_id",property = "studentId"),@Result(column = "addr",property = "addr")})StudentDetail selectStudentDetail(Integer student_id);//注意開啟駝峰(appllication.properties)
//    根據 主表的 主鍵  id 進行  查詢、@Select("""select id,name,stuid,major from student where id=#{id}""")
//    映射結果@Results({@Result(id = true,column = "id",property = "id"),@Result(column = "name",property = "name"),@Result(column = "stuid",property = "stuid"),@Result(column = "major",property = "stuid"),@Result(column = "id",property = "studentDetail",one = @One(select = "com.yanyu.mybatis2.mapper.StudentOneToOne.selectStudentDetail",fetchType = FetchType.LAZY))
//            將主表 student  的主鍵 id  作為  參數傳遞到  副表查詢 的  方法中,本質 :  student.id = student_detail.student_id})Student selectStudent(Integer id);/** FetchType.LAZY 的作用
延遲加載(Lazy Loading):當設置為 FetchType.LAZY 時,關聯的實體或集合不會在主實體被加載時立即加載。相反,它們會在真正需要訪問這些關聯數據時才被加載。
* 這種策略可以減少數據庫查詢的次數,提高性能,尤其是在關聯數據量較大時。
按需加載:只有在訪問關聯屬性時,Hibernate 才會發起額外的數據庫查詢來加載這些數據。
對比 FetchType.EAGER
FetchType.EAGER:表示立即加載。當主實體被加載時,關聯的實體或集合也會被立即加載。這種策略適用于關聯數據量較小且經常需要一起使用的場景,但可能會導致性能問題
* ,尤其是在關聯數據量較大或關聯關系較復雜時。
FetchType.LAZY:表示延遲加載。只有在真正需要訪問關聯數據時才會加載,適用于關聯數據量較大或關聯關系較復雜的情況,可以有效減少不必要的數據庫查詢。* */
}

image-20250406221128414

一對多

image-20250406222822632

  • 與一對一類似
    • 主表根據 id 查,副表根據 student_id 查
    • 副表映射的每個實體類都是一個對象,以集合形式出現在 主表的實體類中
package com.yanyu.mybatis2.po;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 22:32* @description:課程實體類*/
@Data
public class Course {private Integer id;private Integer studentId;private String name;
//  一個學生對應多個 課程,課程以集合形式出現在  學生類中}
package com.yanyu.mybatis2.po;import lombok.Data;import java.util.List;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 22:34* @description:學生與課程*/
@Data
public class StudentCourse {private Integer id;private String name;private String stuid;private String major;private List<Course> courses;
}
package com.yanyu.mybatis2.mapper;import com.yanyu.mybatis2.po.Course;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;import java.util.List;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 22:37* @description:*/
public interface StudentCourse {
//    根據  student_id 查課程 并 按 副表   主鍵  id 進行分組@Select("""select id,student_id,name from coursewhere student_id = #{student_id}order by id""")@Results(id = "studentCourse",value = {@Result(id = true, column = "id", property = "id"),@Result(column = "student_id", property = "studentId"),@Result(column = "name", property = "name")})List<Course> selectCourse(Integer student_id);
//    主表@Select("""select id,name,stuid,major from studentwhere id = #{id}""")@Results({@Result(id = true,column = "id",property = "id"),@Result(column = "name",property = "name"),@Result(column = "stuid",property = "stuid"),@Result(column = "major",property = "major"),@Result(column = "id",property = "courses",many = @Many(select = "com.yanyu.mybatis2.mapper.StudentCourse.selectCourse",fetchType = FetchType.LAZY))
//            將主表 student  的主鍵 id  作為  參數傳遞到  副表查詢 的  方法中,本質 :  student.id = course.student_id})com.yanyu.mybatis2.po.StudentCourse selectStudentCourse(Integer id);}
  • 調錯:看得懂就看(cause caused by),看不到,直接把錯誤復制,百度

image-20250406232036742

image-20250406232940467

  • 注意接口名和實體類名一樣時,要特別留意 包名

image-20250406233241320

小結:

  • 各自查詢各自的,然后再利用 one = @one many = @Many 進行關聯

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

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

相關文章

Scrapy爬蟲實戰:如何用Rules實現高效數據采集

Scrapy是一個強大的Python爬蟲框架&#xff0c;而其中的Rules類則為爬蟲提供了更高級的控制方式。本文將詳細介紹如何在Scrapy中使用Rules&#xff0c;以及各個參數的具體作用&#xff0c;并結合實際場景說明Rules的必要性。 為什么需要Rules&#xff1f; 在Web爬取過程中&…

ActiveMQ 性能優化與網絡配置實戰(一)

一、引言 在當今分布式系統和微服務架構盛行的時代&#xff0c;消息中間件作為實現系統間異步通信、解耦和削峰填谷的關鍵組件&#xff0c;其重要性不言而喻。ActiveMQ 作為一款廣泛應用的開源消息中間件&#xff0c;憑借其對多種消息協議的支持、靈活的部署方式以及豐富的功能…

免費視頻壓縮軟件

一、本地軟件&#xff08;支持離線使用&#xff09; 1. HandBrake 平臺&#xff1a;Windows / macOS / Linux 特點&#xff1a;開源免費&#xff0c;支持多種格式轉換&#xff0c;提供豐富的預設選項&#xff08;如“Fast 1080p”快速壓縮&#xff09;&#xff0c;可自定義分…

消除AttributeError: module ‘ttsfrd‘ has no attribute ‘TtsFrontendEngine‘報錯輸出的記錄

#工作記錄 嘗試消除 消除“模塊ttsfrd沒有屬性ttsfrontendengine”的錯誤的記錄 報錯摘錄&#xff1a; Traceback (most recent call last): File "F:\PythonProjects\CosyVoice\webui.py", line 188, in <module> cosyvoice CosyVoice(args.model_di…

Acrel-EIoT 能源物聯網云平臺在能耗監測系統中的創新設計

摘要 隨著能源管理的重要性日益凸顯&#xff0c;能耗監測系統成為實現能源高效利用的關鍵手段。本文詳細介紹了基于安科瑞Acrel-EIoT能源物聯網云平臺的能耗監測系統的設計架構與應用實踐。該平臺采用分層分布式結構&#xff0c;涵蓋感知層、網絡層、平臺層和應用層&#xff0…

計算機網絡-同等學力計算機綜合真題及答案

計算機網絡-同等學力計算機綜合真題及答案 &#xff08;2003-2024&#xff09; 2003 年網絡 第二部分 計算機網絡&#xff08;共 30 分&#xff09; &#xff08;因大綱變動因此 2004 年真題僅附真題&#xff0c;不作解析。&#xff09; 一、填空題&#xff08;共 10 分&#…

PyTorch常用命令詳解:助力深度學習開發

&#x1f4cc; 友情提示&#xff1a; 本文內容由銀河易創AI&#xff08;https://ai.eaigx.com&#xff09;創作平臺的gpt-4-turbo模型生成&#xff0c;旨在提供技術參考與靈感啟發。文中觀點或代碼示例需結合實際情況驗證&#xff0c;建議讀者通過官方文檔或實踐進一步確認其準…

深度學習:梯度下降法的數學原理

梯度下降法——是一種最優化算法,用于找到函數的局部極小值或全局最小值。它基于函數的梯度(或偏導數)信息來更新參數,目標是通過逐漸調整參數值來最小化目標函數的值。在機器學習算法中,梯度下降是最常采用的方法之一,尤其是在深度學習模型中,BP反向傳播方法的核心就是…

刷leetcodehot100返航版--哈希表5/5、5/6

回顧一下之前做的哈希&#xff0c;貌似只有用到 unordered_set&#xff1a;存儲無序元素unordered_map&#xff1a;存儲無序鍵值對 代碼隨想錄 常用代碼模板2——數據結構 - AcWing C知識回顧-CSDN博客 1.兩數之和5/5【30min】 1. 兩數之和 - 力扣&#xff08;LeetCode&am…

openwrt 使用quilt 打補丁(patch)

1,引入 本文簡單解釋如何在OpenWRT下通過quilt命令打補丁--patch&#xff0c;也可查看openwrt官網提供的文檔 2&#xff0c;以下代碼通過編譯net-snmp介紹 ① 執行編譯命令之后&#xff0c;進入build_dir的net-snmp-5.9.1目錄下&#xff0c;改目錄即為snmp最終編譯的目錄了 /…

【開發工具】Window安裝WSL及配置Vscode獲得Linux開發環境

筆者面試時需要本地IDE手撕代碼并測試&#xff0c;但是windows開發環境用不習慣&#xff0c;Min64和json配置也比較麻煩&#xff0c;因此采用WSLvscode的方式快速配置Linux開發環境 WSL安裝 直接在微軟商店搜索WSL即可 系統設置 開始菜單搜索啟用或關閉 Windows 功能&…

【C語言】初階數據結構相關習題(一)

&#x1f386;個人主頁&#xff1a;夜晚中的人海 今日語錄&#xff1a;人的生命似洪水在奔流&#xff0c;不遇著島嶼、暗礁&#xff0c;難以激起美麗的浪花。——奧斯特洛夫斯基 文章目錄 ?一、判定是否互為字符重排&#x1f389;二、 回文排列&#x1f680;三、字符串壓縮&am…

MySQL----數據庫的操作

1. 查看數據庫 語法&#xff1a;show databases; 示例展示&#xff1a; 2. 創建庫 語法&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name[CHARACTER SET charset_name][COLLATE collation_name]; 注意&#xff1a;[] 為可選項 {} 為必選項 database_name 為數據…

Dagger中編譯import報找不到ProvideClientFactory,initialize中ProvideClientFactory爆紅

解決方案&#xff1a;將對應Module移到主模塊&#xff0c;可能是依賴循環使用導致或者是模塊之間無法訪問及通信導致 為了重現問題&#xff0c;我還遠了此操作

Nacos源碼—4.Nacos集群高可用分析四

大綱 6.CAP原則與Raft協議 7.Nacos實現的Raft協議是如何寫入數據的 8.Nacos實現的Raft協議是如何選舉Leader節點的 9.Nacos實現的Raft協議是如何同步數據的 10.Nacos如何實現Raft協議的簡版總結 8.Nacos實現的Raft協議是如何選舉Leader節點的 (1)初始化RaftCore實例時會開…

擬南芥T2T基因組-文獻精讀127

A near-complete assembly of an Arabidopsis thaliana genome 擬南芥基因組的近乎完整組裝 擬南芥&#xff08;Arabidopsis thaliana&#xff09;基因組序列作為廣泛應用的模式物種&#xff0c;為植物分子生物學研究提供了巨大的推動力。在基因組序列首次發布后的20多年&…

一個關于fsaverage bem文件的說明

MNE文檔&#xff1a;基于模板 MRI 的 EEG 前向算子 Head model and forward computation 在了解了腦圖譜發展的過程之后&#xff0c;對腦的模版有了更深的認識&#xff0c;所以&#xff0c;對于之前使用的正向的溯源文件&#xff0c;進行一下解析&#xff0c;查看包含的信息&a…

C#學習第21天:安全與加密(Security and Cryptography)

核心概念 1. 什么是加密&#xff1f; 加密&#xff1a;加密是一種將數據轉換為一種不可讀形式的方法&#xff0c;只有持有相應密鑰的人才能解密并讀取數據。目的&#xff1a;確保數據的機密性和安全性&#xff0c;特別是在傳輸過程中過防止未授權訪問。 2. 加密類型 對稱加密…

OpenCV 圖形API(77)圖像與通道拼接函數-----對圖像進行幾何變換函數remap()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 對圖像應用一個通用的幾何變換。 函數 remap 使用指定的映射對源圖像進行變換&#xff1a; dst ( x , y ) src ( m a p x ( x , y ) , m a p y…

在線時間戳轉換工具

給大家推薦一個在線時間戳轉換工具 點擊跳轉-鴿鴿在線工具 這個工具除了時間戳轉換&#xff0c;到首頁還能選擇使用很多其他小工具&#xff0c;歡迎使用