MyBatis 學習(五)之 高級映射

目錄

1 association 和 collection 介紹

2 案例分析

3 一對一關聯和一對多關聯

4 參考文檔


1 association 和 collection 介紹

? ? ? ? 在之前的 SQL 映射文件中提及了 resultMap 元素的 association collection 標簽,這兩個標簽是用來關聯查詢的,它們的屬性幾乎一致,以下是對它們屬性的描述,紅色標注的是常用屬性。

屬性描述
property實體類屬性名
column數據庫字段名或者其別名
javaType實體類屬性的 Java 類型
jdbcType數據庫列的數據類型
ofType指定關聯對象的類型。它通常用于泛型類型的情況,以確保正確的類型轉換
select指定一個子查詢,用于加載關聯的對象
fetchType用于控制加載策略,比如立即加載還是延遲加載。常見的取值有 lazy(延遲加載)和 eager(立即加載)
resultMap引用預定義的結果映射,以便更靈活地配置關聯對象的映射規則
resultSet指定結果集的名稱,以便在多結果集的情況下進行區分
autoMapping是否自動映射所有列到目標對象的屬性上。默認為 true,表示自動映射;設置為 false 則表示不自動映射
columnPrefix當使用內連接查詢時,這個屬性可以用來指定前綴,以區分關聯表的列名
foreignColumn指定外鍵對應的列名
notNullColumn指定一個列名,只有當該列的值不為 null 時,才會執行關聯查詢
typeHandler自定義的類型處理器

2 案例分析

以典型的 員工 (Employee) 和部門 (Department) 為例

  • 一個員工只能在一個部門:Employee -> Department(一對一)
  • 一個部門可以包含多個員工:Department -> Employee(一對多)

以用戶 (User) 和角色 (Role) 為例,兩者成了一個雙向的一對多,從而變成了多對多,不做介紹

  • 一個用戶可以擁有多個角色:User -> Role(一對多)
  • 一個角色可以賦予多個用戶:Role -> User(一對多)

表 department?和 表 employee

# 創建 department 表
drop table if exists department;
create table department(
department_id int(11) primary key auto_increment, #主鍵,自增
department_name varchar(255)
)charset=utf8;# 插入數據
insert into department(department_name) values
('開發部'),
('人力資源部'),
('市場營銷部'),
('財務部'),
('行政部'),
('監察部'),
('客服服務部');# 創建 employee 表
drop table if exists employee;
create table employee(
employee_id int(11) primary key auto_increment, #主鍵,自增
employee_name varchar(255),
employee_age int(11),
employee_sex char(32),
employee_email varchar(255),
employee_address varchar(255),
department_id int(11)
)charset=utf8;# 插入數據
insert into employee values
(1, '唐浩榮', 23, 1, '15477259875@163.com', '中國上海浦東區', 1),
(2, '黃飛鴻', 32, 1, '86547547@qq.com', '大清廣東', 2),
(3, '十三姨', 18, 0, '520520520@gmail.com', '大清廣東', 3),
(4, '納蘭元述', 28, 1, '545627858@qq.com', '大清京師', 5),
(5, '梁寬', 31, 1, '8795124578@qq.com', '大清廣東', 7),
(6, '蔡徐坤', 20, 0, '4257895124@gmail.com', '四川成都', 4),
(7, '楊超越', 21, 0, '8746821252@qq.com', '中國北京', 7),
(8, '馬保國', 66, 1, '6666666666@qq.com', '廣東深圳', 6),
(9, '馬牛逼', 45, 1, 'asdfg45678@163.com', '湖北武漢', 3);

3 一對一關聯和一對多關聯

工程目錄

Department 類

public class Department {//部門idprivate Integer deptId;//部門名稱private String deptName;//部門有哪些員工private List<Employee> employees;// Getter、Setter、toString 方法省略
}

Employee 類

public class Employee {//員工idprivate Integer empId;//員工名稱private String empName;//員工年齡private Integer empAge;//員工性別private Integer empSex;//員工郵箱private String empEmail;//員工地址private String empAddress;//員工所屬部門,和部門表構成一對一的關系,一個員工只能在一個部門private Department department;// Getter、Setter、toString 方法省略
}

創建?DepartmentMapper

public interface DepartmentMapper {//查詢所有數據@Select("select * from department")@Results(id = "deptMap1", value = {@Result(property = "deptId", column = "department_id"),@Result(property = "deptName", column = "department_name"),// 一對多關聯對象// 根據 department_id 來比較@Result(property = "employees", column = "department_id",many = @Many(select = "com.mapper.EmployeeMapper.selectEmpByDeptId"))})List<Department> selectAll();// 根據 id 查找部門@Select("select * from department where department_id = #{id}")@Results(id = "deptMap2", value = {@Result(property = "deptId", column = "department_id"),@Result(property = "deptName", column = "department_name")})Department findDepartmentById(int id);
}

創建?EmployeeMapper

public interface EmployeeMapper {//查詢所有數據@Select("select * from employee")@Results(id = "empMap1", value = {@Result(property = "empId", column = "employee_id", id = true),@Result(property = "empName", column = "employee_name"),@Result(property = "empAge", column = "employee_age"),@Result(property = "empSex", column = "employee_sex"),@Result(property = "empEmail", column = "employee_email"),@Result(property = "empAddress", column = "employee_address"),// 一對一關聯對象// 根據 department_id 來比較@Result(property = "department", column = "department_id",one = @One(select = "com.mapper.DepartmentMapper.findDepartmentById"))})List<Employee> selectAll();//根據員工id查詢數據@Select("select * from employee where employee_id = #{id}")@ResultMap("empMap1")Employee selectEmpByEmpId(@Param("id") int empId);// 根據 department_id 查詢數據@Select("select * from employee where department_id = #{id}")@ResultMap("empMap1")Employee selectEmpByDeptId(@Param("id") int deptId);
}

log4j.properties

log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

mysql.properties

url=jdbc:mysql://localhost:3306/study?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
name=root
password=123456
driver=com.mysql.cj.jdbc.Driver

MyBatis 配置文件 mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 通過properties標簽,讀取java配置文件的內容 --><properties resource="mysql.properties" /><!-- 配置環境.--><environments default="development"><environment id="development"><!--配置事務的類型--><transactionManager type="JDBC"></transactionManager><!--dataSource 元素使用標準的 JDBC 數據源接口來配置 JDBC 連接對象源 --><dataSource type="POOLED"><!--配置連接數據庫的4個基本信息--><property name="url" value="${url}" /><property name="username" value="${name}" /><property name="password" value="${password}" /><property name="driver" value="${driver}" /></dataSource></environment></environments><!--通過包 package 引入 SQL 映射文件--><mappers><package name="com.mapper"/></mappers>
</configuration>

創建?EmployeeTest 測試類

public class EmployeeTest {//定義 SqlSessionSqlSession sqlSession = null;//定義 EmployeeMapper 對象private EmployeeMapper mapper = null;@Beforepublic void getSqlSession() throws IOException {//加載 mybatis 全局配置文件 Resources// 原 InputStream is = MybatisTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//創建 SqlSessionFactory 對象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//根據 sqlSessionFactory 產生 sessionsqlSession = sqlSessionFactory.openSession();// 創建Mapper接口的的代理對象,getMapper方法底層會通過動態代理生成 EmployeeMapper 的代理實現類mapper = sqlSession.getMapper(EmployeeMapper.class);}//查詢所有員工數據@Testpublic void testSelectAll() {List<Employee> listEmployee = mapper.selectAll();for (Employee employee : listEmployee) {System.out.println(employee);}sqlSession.close();}//根據員工 id 查詢數據@Testpublic void testSelectById() {Employee employee = mapper.selectEmpByEmpId(1);System.out.println(employee);sqlSession.close();}
}

測試結果

查詢所有員工數據,包括員工所在部門(一個員工屬于一個部門)

創建?DepartmentTest?測試類

public class DepartmentTest {//定義 SqlSessionSqlSession sqlSession = null;//定義 DepartmentMapper 對象private DepartmentMapper mapper = null;@Beforepublic void getSqlSession() throws IOException {//加載 mybatis 全局配置文件 Resources// 原 InputStream is = MybatisTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//創建 SqlSessionFactory 對象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//根據 sqlSessionFactory 產生 sessionsqlSession = sqlSessionFactory.openSession();// 創建Mapper接口的的代理對象,getMapper方法底層會通過動態代理生成 DepartmentMapper 的代理實現類mapper = sqlSession.getMapper(DepartmentMapper.class);}//查詢所有部門數據@Testpublic void testSelectAll() {List<Department> listDepartment = mapper.selectAll();for (Department department : listDepartment) {System.out.println(department);}sqlSession.close();}//根據部門 id 查詢 數據@Testpublic void testSelectById() {Department department = mapper.findDepartmentById(1);System.out.println(department);sqlSession.close();}
}

測試結果

查詢所有部門信息,包括該部門有哪些員工(一個部門有多個員工)

4 參考文檔

篇篇“參考”這位博主的文檔。。。不過確實寫的挺好的

Mybatis3詳解(八)----高級映射之一對一映射 - 唐浩榮 - 博客園 (cnblogs.com)

Mybatis3詳解(九)----高級映射之一對多映射 - 唐浩榮 - 博客園 (cnblogs.com)

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

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

相關文章

算法--時空復雜度分析以及各個數據量對應的可使用的算法(C++;1s內)

這里寫目錄標題 由數據范圍反推算法時間復雜度以及算法內容分析時間復雜度看循環實例1實例2 固定時間復雜度快排和歸并排序二分高精度算法雙指針算法單鏈表插入刪除操作棧和隊列的操作單調棧和單調隊列KMPTire并查集堆哈希表BFS、DFS圖的深度優先、寬度優先遍歷dijkstra算法樸素…

題目 1037: [編程入門]宏定義的練習

問題描述&#xff1a; 輸入兩個整數&#xff0c;求他們相除的余數。用帶參的宏來實現&#xff0c;編程序。 樣例輸入&#xff1a; 3 2 樣例輸出&#xff1a; 1 代碼分析&#xff1a; 這段代碼實現了輸入兩個整數&#xff0c;然后使用帶參數的宏計算它們相除的余數&…

「MySQL」深入理解MySQL中常用的SQL函數

「MySQL」深入理解MySQL中常用的SQL函數 窗口函數參考文章1. COALESCE 函數2. USING 函數3. LEAD 函數4. interval 函數5. INSTR 函數6. substring_index 函數7. LENGTH 函數和 CHAR_LENGTH 函數 窗口函數參考文章 SQL窗口函數 1. COALESCE 函數 COALESCE 函數的作用是從一…

瑞_Redis_Redis的Java客戶端

文章目錄 1 Redis的Java客戶端1.1 Jedis快速入門1.1.1 入門案例1.1.1.1 項目構建1.1.1.2 引入依賴1.1.1.3 建立連接1.1.1.4 釋放資源1.1.1.5 測試1.1.1.6 完整測試類代碼 1.1.2 Jedis連接池1.1.2.1 連接池工具類1.1.2.2 改造原始代碼 &#x1f64a; 前言&#xff1a;本文章為瑞…

基于單片機的聲光控制節能燈設計

摘 要:在當今社會,節約用電是低碳生活的基本行為之一,但是一些公眾場所電力浪費現象依然存在,特別是長明燈、常亮屏等屢見不鮮,造成了嚴重的電力浪費。針對這種電力浪費現象,該文基于STC89C52單片機設計了一種聲光控制節能燈,利用光敏電阻、光信息及語音信號控制電路收集…

常用sql語句及其優化

文章目錄 介紹常用sql語句1. 數據查詢1.1 SELECT 語句1.2 DISTINCT 關鍵字1.3 WHERE 子句1.4 ORDER BY 子句1.5 LIMIT 關鍵字 2. 數據更新2.1 INSERT INTO 語句2.2 UPDATE 語句2.3 DELETE FROM 語句 3. 數據管理3.1 CREATE TABLE 語句3.2 ALTER TABLE 語句3.3 DROP TABLE 語句 …

藍橋輔導之管道

藍橋輔導之管道 核心思想&#xff1a;二分 二分時間 若t時刻成立 則之后也一定成立將mid時刻時每個閥門的水的流動區間加入對組 合并區間 最終判斷是否覆蓋全管道l1 && r m; #include <iostream>#include <cstring>#include <algorithm>#define…

批量自動加好友神器!微信快速擴友秘籍!

對于一些個人或者企業來說&#xff0c;傳統的人工添加好友方式往往會出現效率低下&#xff0c;費時費力的問題。那么&#xff0c;有沒有一種快速、便捷、安全的方式來解決這個問題呢&#xff1f;答案當然是肯定的&#xff0c;那就是通過使用微信管理系統來解決這一問題。 在微…

基于java+springboot景區行李寄存管理系統設計和實現

基于javaspringboot景區行李寄存管理系統設計和實現 博主介紹&#xff1a;多年java開發經驗&#xff0c;專注Java開發、定制、遠程、文檔編寫指導等,csdn特邀作者、專注于Java技術領域 作者主頁 央順技術團隊 Java畢設項目精品實戰案例《1000套》 歡迎點贊 收藏 ?留言 文末獲取…

5GC SBA架構

協議標準&#xff1a;Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述說明NSSFNetwork Slice Selection Function網絡切片選擇&#xff0c;根據UE的切片選擇輔助信息、簽約信息等確定UE允許接入的網絡切片實例。NEF Network Exposure Function網絡開…

疾控中心的污水采樣瓶用的是什么材質

疾控中心的污水采樣瓶采用的材質是聚乙烯或聚丙烯塑料。這種材質的污水采樣瓶具有耐腐蝕、耐高壓、無毒無味、重量輕、易于攜帶等優點。此外&#xff0c;這種材質的污水采樣瓶還可以在高溫下消毒&#xff0c;不會變形或破裂。 疾控中心的污水采樣瓶通常有不同的容積和形狀&…

Harbor高可用(haproxy和keepalived)

Harbor高可用&#xff08;haproxy和keepalived&#xff09; 文章目錄 Harbor高可用&#xff08;haproxy和keepalived&#xff09;1.Harbor高可用集群部署架構1.1 主機初始化1.1.1 設置網卡名和ip地址1.1.2 設置主機名1.1.3 配置鏡像源1.1.4 關閉防火墻1.1.5 禁用SELinux1.1.6 設…

SpringBoot 自定義映射規則resultMap association一對一

介紹 例&#xff1a;學生表&#xff0c;班級表&#xff0c;希望在查詢學生的時候一起返回該學生的班級&#xff0c;而一個實體類封裝的是一個表&#xff0c;如需要多表查詢就需要自定義映射。 表結構 班級表 學生表 SQL語句 SELECT a.id,a.name,a.classes,b.id classes…

Charles抓包 - 安裝、激活、證書配置

最近剛好又遇到了抓包的需求&#xff0c;之前一直使用 Fiddler 抓包&#xff0c;這幾年一直聽大家都在用 Charles 抓包&#xff0c;正好一起了解下&#xff08;一般建議掌握一種抓包方式即可&#xff0c;都可以解決同種需求場景&#xff09; 抓包 Fiddler抓包 Charles 下載、安…

[機器視覺]halcon應用實例 多ROI模板匹配

本示例是單ROI的功能擴展示例&#xff0c;多ROI.后面有空了將出用戶自定義ROI。 比單ROI增加ROI區域的連接和合并。還有for的實例應用。步驟同單ROI一樣。不懂的可以看一下單ROI文章。[機器視覺]halcon應用實例 單ROI模板匹配-CSDN博客 有需要的可以【點贊】【關注】【收藏】…

2024年新提出的算法|LEA愛情進化算法(Love Evolution Algorithm)

Love Evolution Algorithm: a stimulus–value–role theory-inspired evolutionary algorithm for global optimization 愛情進化算法Love Evolution Algorithm&#xff0c;LEA&#xff0c;于2024年2月發表在中科院3區SCI期刊 The Journal of Supercomputing。 1、簡介 本文提…

幸運星數(爺再也不想用pow了)

解法&#xff1a; 暴力 #include <iostream> #include <vector> using namespace std; #define endl \nint main() {ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);int n;long long sum 0, a;cin >> n;for (int i 1; i < n; i) {a 1;for (in…

#python升級#CentOS 7 python升級到3.11.6

在 CentOS 7 上升級 Python 版本可能會比較復雜&#xff0c;因為 CentOS 7 默認安裝的是 Python 2.7&#xff0c;并且系統很多組件依賴于它。不過&#xff0c;可以通過以下步驟嘗試升級到 Python 3.11.6&#xff1a; 安裝必要的依賴&#xff1a; sudo yum install gcc openssl-…

洛谷P1015回文數

題目描述 若一個數&#xff08;首位不為零&#xff09;從左向右讀與從右向左讀都一樣&#xff0c;我們就將其稱之為回文數。 例如&#xff1a;給定一個十進制數 5656&#xff0c;將 5656 加 6565&#xff08;即把 5656 從右向左讀&#xff09;&#xff0c;得到 121121 是一個…

藍橋杯刷題2

1. 修建灌木 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);int n scan.nextInt();for (int i 1;i < n1;i){int distance Math.max(i-1,n-i);System.out.println(distance*2);}scan.close…