Mybatis05-一對多和多對一處理

多對一和一對多

多對一

多對一的理解:

  • 多個學生對應一個老師

  • 如果對于學生這邊,就是一個多對一的現象,即從學生這邊關聯一個老師!

結果映射(resultMap):

  • association

    • 一個復雜類型的關聯;許多結果將包裝成這種類型
    • 嵌套結果映射 —— 關聯可以是 resultMap 元素,或是對其它結果映射的引用
  • collection

    • 一個復雜類型的集合
    • 嵌套結果映射 —— 集合可以是 resultMap 元素,或是對其它結果映射的引用

以下使用兩種方式實現以下sql語句:

select s.id ,s.name ,t.name from student s,teacher t where s.tid=t.id
1、按照查詢嵌套處理

類似子查詢

  1. 數據庫設計

在這里插入圖片描述

CREATE TABLE `teacher` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老師');CREATE TABLE `student` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,`tid` INT(10) DEFAULT NULL,PRIMARY KEY (`id`),KEY `fktid` (`tid`),CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小紅', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小張', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1');
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');
  1. 實體類STudent和Teacher
public class Teacher {private int id;private String name;public Teacher(){}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 "Teacher{" +"id=" + id +", name='" + name + '\'' +'}';}
}
public class Student {private int id;public String getName() {return name;}public void setName(String name) {this.name = name;}private String name;private Teacher teacher;//學生需要關聯一個老師public Student(){}public int getId() {return id;}public void setId(int id) {this.id = id;}public Teacher getTeacher() {return teacher;}public void setTeacher(Teacher teacher) {this.teacher = teacher;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", teacher=" + teacher +'}';}
}
  1. StudentMapper接口和TeacherMapper
package com.study.dao;
import com.study.pojo.Student;
import java.util.List;public interface StudentMapper {//查詢所有的學生信息,以及對應的老師的信息public List<Student> getStudent();
}
public interface TeacherMapper {}
  1. StudentMapper.xml映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace綁定一個對應的Dao/Mapper接口的全限定名-->
<mapper namespace="com.study.dao.StudentMapper"><resultMap id="StudentTeacher" type="Student"><!--主鍵可使用<id>--><result property="id" column="id"/><result property="name" column="name"/><!--復雜的屬性,需要單獨處理——引用類型:<association>  集合:<collection>--><association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/></resultMap><select id="getStudent" resultMap="StudentTeacher">select * from student</select><select id="getTeacher" resultType="Teacher">select * from teacher where id=#{id}</select>
</mapper>
  1. 核心配置文件
<mappers><mapper class="com.study.dao.TeacherMapper"/><mapper class="com.study.dao.StudentMapper"/>
</mappers>
  1. 測試
@Test
public void testStudent(){SqlSession sqlSession = MybatisUtils.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List<Student> studentList = mapper.getStudent();//動態代理產生一個實現Mapper接口的對象并賦值個,將該對象賦值給接口的引用for (Student student : studentList) {System.out.println(student);}sqlSession.close();
}
2、按結果嵌套處理
  1. StudentMapper接口

    public List<Student> getStudent2();
    
  2. StudentMapper.xml

    <!--===========按照結果嵌套查詢==============--><!--按查詢結果嵌套處理思路:1. 直接查詢出結果,進行結果集的映射-->
    <select id="getStudent2" resultMap="StudentTeacher2">select s.id sid,s.name sname,t.name tnamefrom student s,teacher twhere s.tid=t.id;
    </select><resultMap id="StudentTeacher2" type="Student"><result property="id" column="sid"/><result property="name" column="sname"/><association property="teacher" javaType="Teacher" ><result property="name" column="tname"/></association>
    </resultMap>
  3. 測試

    @Test
    public void testStudent(){SqlSession sqlSession = MybatisUtils.getSqlSession();StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);List<Student> studentList = mapper.getStudent2();//動態代理產生一個實現Mapper接口的對象并賦值個,將該對象賦值給接口的引用for (Student student : studentList) {System.out.println(student);}sqlSession.close();
    }

小結

  • 按照查詢進行嵌套處理就像SQL中的子查詢
  • 按照結果進行嵌套處理就像SQL中的聯表查詢
一對多
  1. 實體類

    package com.study.pojo;public class Student {private int id;public String getName() {return name;}public void setName(String name) {this.name = name;}private String name;public int getTid() {return tid;}public void setTid(int tid) {this.tid = tid;}private int tid;public Student(){}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", tid=" + tid +'}';}
    }
    
    package com.study.pojo;import java.util.List;public class Teacher {private int id;private String name;private List<Student> students;//一個老師擁有多個學生public List<Student> getStudents() {return students;}public void setStudents(List<Student> students) {this.students = students;}public Teacher(){}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 "Teacher{" +"id=" + id +", name='" + name + '\'' +", students=" + students +'}';}
    }
    
  2. TeacherMapper接口

    List<Teacher> getTeacher();
    
  3. TeacherMapper.xml

    <select id="getTeacher" resultType="Teacher">select * from teacher;
    </select>
    
  4. 核心配置文件中注冊Mapper

  5. 測試環境正常

    @Test
    public void test(){SqlSession sqlSession = MybatisUtils.getSqlSession();TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);List<Teacher> teacherList = mapper.getTeacher();for (Teacher teacher : teacherList) {System.out.println(teacher);}sqlSession.close();
    }
    
    1、按結果嵌套查詢
    1. TeacherMapper接口`

      Teacher getTeacherById(@Param("tid")int id);
      
    2. TeaccherMapper.xml——按結果嵌套查詢

      <!--==================按結果嵌套查詢================-->
      <select id="getTeacherById" resultMap="TeacherStudent">select t.name tname,t.id tid,s.id sid,s.name snamefrom student s,teacher twhere s.tid=t.id and t.id=#{tid}
      </select><resultMap id="TeacherStudent" type="Teacher"><result property="id" column="tid"/><result property="name" column="tname"/><!--復雜的屬性,需要單獨處理——引用類型:<association>  javaType:指定的屬性的類型集合:<collection>   集合中的泛型信息,我們使用ofType獲取--><!--Teacher實體類中有一個名為students的引用類型的List集合,將List中Student對象的各屬性與sql語句返回的字段進行映射--><collection property="students" ofType="Student"><result property="id" column="sid"/><result property="name" column="sname"/><result property="tid" column="tid"/></collection>
      </resultMap>
      
    3. 測試

      @Test
      public void getTeacherById(){SqlSession sqlSession = MybatisUtils.getSqlSession();TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacherById(1);System.out.println(teacher);sqlSession.close();
      }輸出:
      Opening JDBC Connection
      Created connection 1278254413.
      ==>  Preparing: select s.id sid,s.name sname,t.name tname,t.id tid from student s,teacher t where s.tid=t.id and t.id=?
      ==> Parameters: 1(Integer)
      <==    Columns: sid, sname, tname, tid
      <==        Row: 1, 小明, 秦老師, 1
      <==        Row: 2, 小紅, 秦老師, 1
      <==        Row: 3, 小張, 秦老師, 1
      <==        Row: 4, 小李, 秦老師, 1
      <==        Row: 5, 小王, 秦老師, 1
      <==      Total: 5
      Teacher{id=1, name='秦老師', students=[Student{id=1, name='小明', tid=1}, Student{id=2, name='小紅', tid=1}, Student{id=3, name='小張', tid=1}, Student{id=4, name='小李', tid=1}, Student{id=5, name='小王', tid=1}]}
      Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@4c309d4d]
      Returned connection 1278254413 to pool.
      
    2、按照查詢嵌套處理
    1. TeacherMapper

      Teacher getTeacherById2(@Param("tid")int id);
      
    2. TeacherMapper.xml

      <!--===========按照查詢嵌套處理================-->
      <select id="getTeacherById2" resultMap="TeacherStudent2">select * from mybatis.teacher where id=#{tid}
      </select><resultMap id="TeacherStudent2" type="Teacher"><collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/><!--這里的column="id"是teacher表中的id-->
      </resultMap><select id="getStudentByTeacherId" resultType="Student"><!--這里的id是上文中的id-->select * from student where tid=#{id}
      </select>
    3. 測試

          @Testpublic void getTeacherById2() {SqlSession sqlSession = MybatisUtils.getSqlSession();TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);Teacher teacher = mapper.getTeacherById2(1);System.out.println(teacher);sqlSession.close();}輸出:
      Opening JDBC Connection
      Created connection 931675031.
      ==>  Preparing: select * from mybatis.teacher where id=?
      ==> Parameters: 1(Integer)
      <==    Columns: id, name
      <==        Row: 1, 秦老師
      ====>  Preparing: select * from student where tid=?
      ====> Parameters: 1(Integer)
      <====    Columns: id, name, tid
      <====        Row: 1, 小明, 1
      <====        Row: 2, 小紅, 1
      <====        Row: 3, 小張, 1
      <====        Row: 4, 小李, 1
      <====        Row: 5, 小王, 1
      <====      Total: 5
      <==      Total: 1
      Teacher{id=0, name='秦老師', students=[Student{id=1, name='小明', tid=1}, Student{id=2, name='小紅', tid=1}, Student{id=3, name='小張', tid=1}, Student{id=4, name='小李', tid=1}, Student{id=5, name='小王', tid=1}]}
      Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@37883b97]
      Returned connection 931675031 to pool.
      

小結

  • 關聯:association【多對一】

  • 集合:collection 【一對多】

  • association是用于一對一和多對一,而collection是用于一對多的關系

  • javaType & ofType

    • JavaType是用來指定pojo中屬性的類型
    • ofType指定的是映射到list集合屬性中pojo的類型。

注意說明:

1、保證SQL的可讀性,盡量通俗易懂

2、根據實際要求,盡量編寫性能更高的SQL語句

3、注意屬性名和字段不一致的問題

4、注意一對多和多對一 中:字段和屬性對應的問題

5、盡量使用Log4j,通過日志來查看自己的錯誤

面試高頻:

  • Mysql引擎

  • InnoDB底層原理

  • 索引

d=4, name=‘小李’, tid=1}, Student{id=5, name=‘小王’, tid=1}]}
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@37883b97]
Returned connection 931675031 to pool.
```

小結

  • 關聯:association【多對一】

  • 集合:collection 【一對多】

  • association是用于一對一和多對一,而collection是用于一對多的關系

  • javaType & ofType

    • JavaType是用來指定pojo中屬性的類型
    • ofType指定的是映射到list集合屬性中pojo的類型。

注意說明:

1、保證SQL的可讀性,盡量通俗易懂

2、根據實際要求,盡量編寫性能更高的SQL語句

3、注意屬性名和字段不一致的問題

4、注意一對多和多對一 中:字段和屬性對應的問題

5、盡量使用Log4j,通過日志來查看自己的錯誤

面試高頻:

  • Mysql引擎

  • InnoDB底層原理

  • 索引

  • 索引優化

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

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

相關文章

在線Logo背景去除:pixian.ai

文章目錄 簡介特色 簡介 pixian.ai是一款智能圖片背景去除工具&#xff0c;進入網頁后&#xff0c;會非常醒目地提示你準備【Free】還是【Paid】&#xff0c;這點就非常好&#xff0c;不向有一些網站&#xff0c;主打免費使用&#xff0c;但時不時彈出“免費注冊”&#xff0c…

【微信小程序】連接藍牙設備

1、檢查小程序是否授權藍牙功能 initBluetooth() {const that thiswx.getSetting({success: (res) > {if (res.authSetting.hasOwnProperty(scope.bluetooth)) {//scope.bluetooth屬性存在&#xff0c;且為falseif (!res.authSetting[scope.bluetooth]) {wx.showModal({tit…

Python 連接 MySQL 及 SQL增刪改查(主要使用sqlalchemy)

目錄 一、環境 二、MySQL的連接和使用 2.1方式一&#xff1a;sql為主 2.1.1創建連接 2.1.2 表結構 2.1.3 新增數據 ?編輯 2.1.4 查看數據 ?編輯 2.1.5 修改數據 2.1.6 刪除數據 2.2方式二&#xff1a;orm對象關系映射 2.2.1 mysql連接 2.2.2 創建表 2.2.3 新增…

windows 安裝pnpm

安裝Node.js&#xff1a; 確保系統上已安裝Node.js。pnpm需要Node.js來運行。如果尚未安裝Node.js&#xff0c;請從其官方網站下載并安裝適用于Windows的最新版本。 安裝pnpm&#xff1a; 打開命令行工具&#xff08;如CMD、PowerShell或Git Bash&#xff09;。使用npm&…

解鎖機器學習的無限可能:深入探究scikit-learn的強大功能

解鎖機器學習的無限可能&#xff1a;深入探究scikit-learn的強大功能 第一部分&#xff1a;背景和功能介紹 在數據科學和機器學習領域&#xff0c;scikit-learn&#xff08;簡稱sklearn&#xff09;是一個廣泛使用的Python庫。它提供了簡單高效的工具用于數據挖掘和數據分析&a…

【Python短期內快速掌握學習人工智能知識能力】:從零到入門的NLP學習秘籍

??我叫憶_恒心&#xff0c;一名喜歡書寫博客的研究生&#x1f468;?&#x1f393;。 如果覺得本文能幫到您&#xff0c;麻煩點個贊&#x1f44d;唄&#xff01; 近期會不斷在專欄里進行更新講解博客~~~ 有什么問題的小伙伴 歡迎留言提問歐&#xff0c;喜歡的小伙伴給個三連支…

Echarts 在折線圖的指定位置繪制一個圖標展示

文章目錄 需求分析需求 在線段交匯處用一個六邊形圖標展示 分析 可以使用 markPoint 和 symbol 屬性來實現。這是一個更簡單和更標準的方法來添加標記點在運行下述代碼后,你將在瀏覽器中看到一個折線圖,其中在 [3, 35] (即圖表中第四個數據點 Thu 的 y 值為 35 的位置)處…

Java反射Reflect機制詳解

文章目錄 引言反射的基本概念反射基本原理反射應用場景反射基本使用獲取類的Class對象獲取構造方法并實例化對象獲取和調用方法獲取和修改字段反射工具類 反射源碼解讀獲取Class對象的源碼調用方法的源碼 反射優缺點優點缺點 為什么需要反射總結 引言 Java反射是Java語言中的一…

【干貨】視頻文件抽幀(opencv和ffmpeg方式對比)

1 廢話不多說&#xff0c;直接上代碼 opencv方式 import time import subprocess import cv2, os from math import ceildef extract_frames_opencv(video_path, output_folder, frame_rate1):"""使用 OpenCV 從視頻中抽取每秒指定幀數的幀,并保存到指定文件夾…

linux系統使用達夢數據庫

在Linux系統中使用達夢數據庫&#xff0c;首先需要確保已經正確安裝了達夢數據庫軟件。以下是一個基本的使用示例&#xff0c;假設您已經安裝了達夢數據庫并且配置好了相關環境變量。 連接到數據庫&#xff1a; 使用 dsql 命令連接到數據庫 dsql -h hostname -u username -p…

寶貝,帶上WebAssembly,換個姿勢來優化你的前端應用

在你沒崛起之前,臉是用來丟的 大家好,我是柒八九。一個專注于前端開發技術/Rust及AI應用知識分享的Coder 此篇文章所涉及到的技術有 WebAssemblyRustWeb Worker(comlink)wasm-packPhotonffmpeg.wasm腳手架生成前端項目因為,行文字數所限,有些概念可能會一帶而過亦或者提供對…

BOM是什么東西

BOM&#xff08;Byte Order Mark&#xff0c;字節順序標記&#xff09;是一個Unicode字符&#xff0c;通常出現在文本文件的開頭。它的作用包括以下幾個方面&#xff1a; 1. 指示文件的編碼方式 BOM可以幫助軟件識別文本文件使用的字符編碼。不同的編碼方式可能會使用不同的B…

經濟與安全兼顧:茶飲店購買可燃氣體報警器的價格考量

可燃氣體報警器在如今的社會中扮演著至關重要的角色。它們用于檢測環境中的可燃氣體濃度&#xff0c;及早發現潛在的火災隱患&#xff0c;保護人們的生命和財產安全。 在這篇文章中&#xff0c;佰德將介紹可燃氣體報警器的安裝、檢定以及價格&#xff0c;通過實際案例和數據&a…

PCL 生成空間橢圓點云

目錄 一、算法原理二、代碼實現三、結果展示本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲。 一、算法原理 設橢圓在 X O Y XOY XOY平面上,參數方程為:

怎么保障TikTok直播網絡穩定?

TikTok&#xff0c;這個近年來風靡全球的社交媒體平臺&#xff0c;已成為電商引流的新方向&#xff0c;尤其是其直播功能。然而&#xff0c;對于打算進軍TikTok直播領域的商家和主播而言&#xff0c;確保網絡穩定無疑是首要任務。那么&#xff0c;TikTok直播專線究竟是什么呢&a…

牛啊后續:如何一行C#代碼實現解析類型的Summary注釋(可用于數據字典快速生成)...

前言&#xff1a;下午有小伙伴要求&#xff0c;讓我繼續做個解析實體類注釋信息的內容。所以我也順便加入進來。以下開始正文實戰操作&#xff1a; 項目需要勾選輸出api文檔文件。這樣就可以讓所有實體類的summary信息被寫入到輸出目錄下。如果有多個xml文件也沒關系&#xff0…

小程序 UI 風格美不勝收

小程序 UI 風格美不勝收 小程序 UI 風格美不勝收

PostgreSQL的視圖pg_stat_replication

PostgreSQL的視圖pg_stat_replication pg_stat_replication 是 PostgreSQL 提供的一個系統視圖&#xff0c;用于顯示主服務器上當前正在進行的復制會話的信息。它可以幫助數據庫管理員監控和管理主從復制的狀態&#xff0c;確保數據的正確同步和高可靠性。 pg_stat_replicati…

MyEclipse中properties文件中文亂碼(Unicode字符)解決辦法

程序代碼園發文地址&#xff1a;MyEclipse中properties文件中文亂碼&#xff08;Unicode字符&#xff09;解決辦法-程序代碼園小說,Java,HTML,Java小工具,程序代碼園,http://www.byqws.com/ ,MyEclipse中properties文件中文亂碼&#xff08;Unicode字符&#xff09;解決辦法htt…

Django學習三:views業務層中通過models對實體對象進行的增、刪、改、查操作。

文章目錄 前言一、Django ORM介紹二、項目快速搭建三、操作1、view.pya、增加操作b、刪除操作c、修改操作d、查詢操作 2、urls.py 前言 上接博文&#xff1a;Django學習二&#xff1a;配置mysql&#xff0c;創建model實例&#xff0c;自動創建數據庫表&#xff0c;對mysql數據…