[ Mybatis 多表關聯查詢 ] resultMap

目錄

一. resultMap

? ? ?1. 使用場景:?

? ? ?2. 查詢映射:

(1)單表查詢映射:

(2)多表查詢映射:

? ? ?a.?在學生表里查專業? ?

? ? ?b. 在專業表里查學生?

二.? 其他注意事項

? ? ?1. 插件下載

? ? ?2. #{? } 和 ${? }的區別


一. resultMap

? ? ?1. 使用場景:?

? ? ? ?(1)當數據庫列名和java類中的屬性名不同時,可? resultMap 配置映射 (下列代碼中有舉例);

? ? ? ?(2)在單表查詢多表查詢中可以使?, resultMap 映射并查詢數據

? ? ?2. 查詢映射:

? ? ? (1)單表查詢映射:

<?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">
<!-- 專門寫SQL語句的文件--><mapper namespace="mybatispro.dao.AdminDao"><!--接口的地址--><!--resultMap標簽:對數據庫中的列名和java類中的屬性名進行映射 常用在多表--><resultMap id="adminMap" type="Admin"><!--數據庫列名(column)   java類中的屬性名(property)--><id column="id" property="id"/><!--映射主鍵使用id標簽--><result column="account" property="account"/><result column="password" property="password"/><result column="gender" property="gender"/></resultMap><select id="findAdmins" parameterType="string" resultMap="adminMap">select id,account,age as adminAge from admin order by ${col}  desc</select></mapper>

? 注意:??只有數據庫列名和java類中的屬性名相同時才會自動映射

? ? ? ? ? ? 而使用resultMap相當于手動匹配,即使名稱不一樣也會映射

? ? ? ? ? ? 使用as起別名讓二者名稱相同,也可以自動映射

?(2)多表查詢映射

? ? ?a.?在學生表里查專業? ?

? ? ? ? 注意看圖 , 圖很重要 !?

? ? ? ?在查詢時,會遇到多表關聯,例如?在查詢學生信息表時,會關聯專業表(id,major,info) , 課程表(id,class,info)...當關聯的數據很多時,在創建類的時候,需要定義的屬性(專業id,專業major,專業info,課程id,課程class,課程info)就會很多,為了減少冗余,我們可以把每個數據表看成一個對象,這個對象里面包含了各自的屬性

package mybatispro.model;public class Student {private  int id;private int num;private String name ;private String gender;private String phone;private Major major;//學生關聯專業/*關聯表中的數據,在設計類時,不建議把關聯類中的屬性,在本類中再定義一遍,減少冗余private Major major;private String mname;*/public int getId() {return id;}public void setId(int id) {this.id = id;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Major getMajor() {return major;}public void setMajor(Major major) {this.major = major;}@Overridepublic String toString() {return "Student{" +"id=" + id +", num=" + num +", name='" + name + '\'' +", gender='" + gender + '\'' +", phone='" + phone + '\'' +", major=" + major +'}';}
}
package mybatispro.dao;
import mybatispro.model.Student;
import java.util.ArrayList;public interface StudentDao {Student findStudentById(int id);ArrayList<Student> findStudents();
}
<?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">
<!-- 專門寫SQL語句的文件-->
<mapper namespace="mybatispro.dao.StudentDao"><!-- 多表關聯查詢時,需要自定義映射關系 -->
<resultMap id="studentMap" type="Student"><id property="id" column="id"/><result property="num" column="num"/><result property="name" column="name"/><result property="gender" column="gender"/><result property="phone" column="phone"/><!-- 關聯表數據映射--><association property="major" javaType="Major"><!--association相當于創建一個major對象,這個對象里面封裝了major的所有屬性--><!-- property(java類中的屬性名)  javaType(屬性名對應的類型名) column(數據庫列名)--><id column="mid" property="id"/><result column="mname" property="name"/></association>
</resultMap><!--查所有學生信息--><select id="findStudents" resultMap="studentMap">selects.id,s.num,s.name,s.gender,s.phone,m.id as mid ,m.name as mnamefrom student s inner join major m on s.majorid= m.id</select><!--查單個學生信息 通過id--><select id="findStudentById"  parameterType="int" resultMap="studentMap">selects.id,s.num,s.name,s.gender,s.phone,m.id as mid,m.name as mnamefrom student s inner join major m on s.majorid= m.idwhere s.id =#{id}</select>
</mapper>
package mybatispro.test;import mybatispro.dao.StudentDao;
import mybatispro.model.Student;
import mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;
import java.util.ArrayList;public class TestStudent {public static void main(String[] args) throws IOException {SqlSession sqlSession = MybatisUtil.getSqlSession();StudentDao studentDao =sqlSession.getMapper(StudentDao.class);//查單個學生信息Student  student = studentDao.findStudentById(3);System.out.println(student);//獲取學生信息System.out.println(student.getId());System.out.println(student.getName());//獲取專業信息,需要先獲得專業對象System.out.println(student.getMajor().getName());System.out.println(student.getMajor().getId());/*查所有學生信息ArrayList<Student> students =  studentDao.findStudents();System.out.println(students);*/sqlSession.close();}
}
? ? ?b. 在專業表里查學生?

? ? ? ? ?注意看圖 , 圖很重要 !

<?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">
<!-- 專門寫SQL語句的文件-->
<mapper namespace="mybatispro.dao.MajorDao"><resultMap id="majorMap" type="Major"><id column="id" property="id"/><result column="name" property="name"/><!--用來接收多個對象,將多個對象封裝到集合中--><collection property="students" javaType="arrayList" ofType="Student"><id column="sid" property="id"/><result column="sname" property="name"/><result column="num" property="num"/></collection></resultMap><select id="findMajorById" parameterType="int"  resultMap="majorMap">selectm.id,m.name,s.id as sid,s.name as sname,s.numfrommajor minner join student son m.id = s.majoridwhere m.id = #{id}</select>
</mapper>
package mybatispro.dao;import mybatispro.model.Major;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;public interface MajorDao {Major findMajorById(int id);/*當SQL語句很簡單時,就不需要寫在對應的xml文件當中,直接在接口中使用@Insert等注解標簽就行復雜的額SQL建議鞋子xml文件中*/@Insert("insert into major(name) value(#{name})")int insertMajor(Major major);@Delete("delete from major where id=#{id}")int deleteMajor(int id);}
package mybatispro.model;import java.util.ArrayList;public class Major {private int id;private String name;private ArrayList<Student> students; //一個專業對應(關聯)多個學生public ArrayList<Student> getStudents() {return students;}public void setStudents(ArrayList<Student> students) {this.students = students;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Major{" +"id=" + id +", name='" + name + '\'' +", students=" + students +'}';}
}
package mybatispro.test;import mybatispro.dao.MajorDao;
import mybatispro.model.Major;
import mybatispro.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;public class TestMajor {public static void main(String[] args) throws IOException {SqlSession  sqlSession = MybatisUtil.getSqlSession();MajorDao majorDao = sqlSession.getMapper(MajorDao.class);/*  Major major = majorDao.findMajorById(1);System.out.println(major);*//*簡單語句---添加Major major = new Major();major.setName("數學");majorDao.insertMajor(major);*///簡單語句---刪除majorDao.deleteMajor(6);sqlSession.commit();sqlSession.close();}
}

二.? 其他注意事項

? ? ?1. 插件下載

? ? ? ? ? ?使用這個插件點左側的鳥可以在dao和對應的mapper之間快速定位切換,提高效率

?插件也可以從自己的電腦硬盤上導入,選擇自己下載好的插件

2. #{? } 和 ${? }的區別

#{變量}? ?使用預編譯的方式,先在SQL中占位,之后再賦值,可以防止SQL注入,是安全的 一般傳遞的是(賬號 密碼 姓名)

${變量}? ?直接將值拼接到SQL中,容易出現SQL注入現象,不安全 寫法上需要加單引號 account = $'{account}'? ?一般傳遞的是列名,在某些 列排序時(價格 時間...) 比較方便? order by ${col} desc


?

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

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

相關文章

Rust 性能提升“最后一公里”:詳解 Profiling 瓶頸定位與優化|得物技術

一、Profiling&#xff1a;揭示性能瓶頸的“照妖鏡”在過去的一年里&#xff0c;我們團隊完成了一項壯舉&#xff1a;將近萬核的 Java 服務成功遷移到 Rust&#xff0c;并收獲了令人矚目的性能提升。我們的實踐經驗已在《RUST練習生如何在生產環境構建萬億流量》一文中與大家分…

STM32H5 的 PB14 引腳被意外拉低的問題解析 LAT1542

關鍵字&#xff1a;STM32H5&#xff0c; GPIO 1. 問題現象 客戶反饋&#xff0c;使用 STM32H523RET6 應用中配置了兩個 IO 口&#xff0c;PC9 為輸出模式&#xff0c;內部下拉&#xff1b;PB14 為輸入模式&#xff0c;內部上拉。在程序中將 PC9 引腳輸出高電平&#xff0c;結…

【辦公自動化】如何使用Python讓Word文檔處理自動化?

在日常辦公中&#xff0c;Word文檔是最常用的文本處理工具之一。通過Python自動化Word文檔操作&#xff0c;可以大幅提高工作效率&#xff0c;減少重復勞動&#xff0c;特別適合批量生成報告、合同、簡歷等標準化文檔。本文將介紹幾種常用的Python操作Word文檔的方法&#xff0…

順序表的總結及模擬實現

目錄 一.線性表 二.順序表 1.概念 2.結構 3.要實現的接口函數 三.模擬實現順序表 1.定義出順序表的基本結構 2.實現檢查擴容功能 3.實現尾插 4.實現尾刪 5.實現頭插和頭刪 6.查找 7.修改 8.遍歷 9.在指定位置插入和刪除 四.順序表的優缺點及思考 a.順序表的弊端 …

Vue3 vs Vue2:全面對比與面試寶典

文章目錄Vue3 vs Vue2&#xff1a;全面對比與面試寶典引言&#xff1a;Vue框架的進化之路一、核心架構對比二、響應式系統的革命Vue2的響應式&#xff1a;像老式監控攝像頭Vue3的響應式&#xff1a;像智能AI監控系統三、API風格的進化Vue2的Options API&#xff1a;像填表格Vue…

Java Web開發:Session與Cookie詳細入門指南

在Web開發中&#xff0c;狀態管理是核心需求之一。本文將深入講解Java中Session和Cookie的使用方法&#xff0c;幫助你掌握用戶狀態管理的核心技術。 一、Session與Cookie基礎概念 特性SessionCookie存儲位置服務器內存/持久化存儲客戶端瀏覽器安全性較高&#xff08;敏感數據…

HTTPS與CA證書:安全通信全解析

CA&#xff08;Certificate Authority&#xff09;&#xff1a;證書頒發機構&#xff0c;負責簽發和管理數字證書&#xff0c;驗證證書持有者的身份。HTTPS&#xff1a;基于 SSL/TLS 協議的 HTTP&#xff0c;通過證書實現客戶端與服務器的身份驗證和數據加密。HTTPSHTTPSSL/TLS…

AI生成代碼時代的商業模式重構:從“軟件即產品”到“價值即服務”

2025年,全球AI代碼生成市場規模突破63億元(數據來源:《中國AI代碼生成行業發展報告》),開發者效率提升40%以上,軟件開發成本下降30%。這一技術浪潮正在顛覆傳統軟件行業的商業邏輯——當代碼生成變得像文字編輯一樣簡單時,企業如何構建可持續的商業模式? 本文將從硬件…

C#特性與反射知識梳理

C#中的**特性&#xff08;Attributes&#xff09;和反射&#xff08;Reflection&#xff09;**是兩個非常重要的概念&#xff0c;它們通常用于代碼的元編程&#xff0c;允許你在運行時獲取類型信息并對其進行操作。下面對這兩個概念進行詳細梳理&#xff1a;一、C#中的特性&…

SQL 語法詳解

SQL 語法詳解 引言 SQL&#xff08;Structured Query Language&#xff09;是一種用于數據庫管理的標準語言&#xff0c;它允許用戶進行數據的查詢、更新、插入和刪除等操作。SQL語法是數據庫管理和編程的基礎&#xff0c;本篇文章將詳細介紹SQL的基本語法和常用操作&#xff0…

為什么 sim(3) 中的尺度 s 與旋轉 R 相乘,而不是平移 t?

文章目錄為什么 sim(3) 中的尺度 s 與旋轉 R 相乘&#xff0c;而不是平移 t&#xff1f;1?? sim(3) vs SE(3)&#xff1a;結構對比與核心差異2?? 為什么尺度 s 不乘在 t 上&#xff1f;&#x1f6ab; 數學破壞&#xff1a;&#x1f9ed; 幾何解釋&#xff1a;3?? t 是“相…

如何為你的 Docker 容器設置代理網絡

一文搞定!如何為你的 Docker 容器設置代理網絡(及一個最常見的“坑”) 你是否遇到過這樣的窘境:在你的服務器上,代理工具(比如 Clash, V2Ray)運行得好好的,瀏覽器也能科學上網,但一旦把應用放進 Docker 容器,它就瞬間“失聯”,無法訪問外部世界? 別擔心,這是每個…

LeetCode Day3 -- 哈希表

目錄 1. 啥是哈希表&#xff1f; 2. 啥時候用哈希表&#xff1f; 2.1 存在性檢查 → 集合Set 2.2 鍵值映射 → 字典Dict 2.3 頻率統計 → Dict or Counter 3. LeetCode 3.1 集合 &#xff08;1&#xff09;2215 找出兩數組的不同 &#xff08;2&#xff09;1207 獨一無…

三子棋裝置(電賽24E題)K230/STM32全開源

三子棋裝置&#xff08;電賽24E題&#xff09;K230/STM32全開源&#xff0c;后續有具體代碼參數講解&#xff0c;幫助大家移植k230代碼import time, os, sysfrom media.sensor import * from media.display import * from media.media import *from machine import UART from m…

終端安全檢測與防御

1. 終端安全風險主要問題&#xff1a;企業網絡中80%的安全事件源于終端&#xff0c;終端成為黑客攻擊的重要目標。攻擊手段&#xff1a;勒索病毒&#xff1a;直接勒索用戶。橫向滲透&#xff1a;通過受控終端攻擊內部服務器。僵尸網絡危害&#xff1a;信息竊取、釣魚網站引導、…

Video_AVI_Packet(2)

博主聲明&#xff1a;內容來自網絡&#xff0c;僅供參考&#xff0c;僅適用于淺了解&#xff0c;如有錯誤&#xff0c;自行甄別&#xff0c;由此引起的后果概不負責 Video_AVI_Packet&#xff08;2&#xff09;一、Video Picture Aspect Ratio 與 Active Format Aspect Ratio1.…

八月補丁星期二:微軟修復 111 個漏洞

微軟將在2025 年 8 月補丁星期二修復 111 個漏洞&#xff0c;這一數量與近期平均水平大致相同。 與上個月的情況類似&#xff0c;微軟知道今天發布的漏洞中只有一個已被公開披露&#xff0c;但聲稱沒有證據表明存在野外利用。同樣&#xff0c;截至發布時&#xff0c;唯一的補丁…

《C++進階之繼承多態》【普通類/模板類的繼承 + 父類子類的轉換 + 繼承的作用域 + 子類的默認成員函數】

【普通類/模板類的繼承 父類&子類的轉換 繼承的作用域 子類的默認構造函數】目錄前言&#xff1a;------------------------一、繼承的定義和使用1. 什么使繼承&#xff1f;2. 為什么要引入繼承&#xff1f;3. 怎么使用繼承&#xff1f;① 父類&#xff08;基類&#xf…

Ubuntu22.04安裝OBS Studio

OBS官網的最新的雖然支持Ubuntu系統&#xff0c;但是只支持最新的24.2版本的&#xff0c;而我的電腦上的Ubuntu的版本是22.04&#xff0c;所以在網上尋求解決辦法&#xff0c;看到了這一片博客&#xff0c;作為參考來實現ubuntu22.04安裝OBS&#xff0c;這里提示一下&#xff0…

Ansible 基本使用

Ansible 清單 靜態主機清單 主機清單支持多種格式&#xff0c;例如ini、yaml、腳本等。 本次課程使用 ini 格式。 #創建主機清單[lykcontroller ~ 13:36:01]# vim inventory#vim添加controllernode1node2node3node4?#測試連接單個服務器[lykcontroller ~ 14:08:18]$ ansibl…