当前位置: 首页 > news >正文

MyBatis入门之一对多关联关系(示例)

【图书介绍】《Spring+Spring MVC+MyBatis从零开始学(视频教学版)(第3版)》-CSDN博客

《Spring+Spring MVC+MyBatis从零开始学(视频教学版)(第3版)》(杨章伟,刘祥淼)【摘要 书评 试读】- 京东图书

MyBatis入门之一对一关联关系(示例)-CSDN博客

在实际应用中,应用更多的关联关系是一对多(或多对一)。例如,一个班级有多个学生,即多个学生属于一个班级。使用MyBatis是怎么处理这种一对多关联关系的呢?在本书第7章所讲解的<resultMap>元素中包含一个<collection>子元素,MyBatis就是通过该元素来处理一对多关联关系的。<collection>子元素的属性大部分与<collection>元素相同,但其还包含一个特殊属性—ofType。ofType属性与javaType属性对应,用于指定实体对象中集合类属性所包含的元素类型。

<collection>元素可以参考如下两种示例进行配置,具体代码如下:

<!--方式一:嵌套查询-->
<collection property="studentList" column="id" ofType="com.ssm.po.Student"select= "com.ssm.mapper.StudentMapper.selectStudent"/><!--方式二:嵌套结果-->
<collection property="studentList" ofType="com.ssm.po.Student"><id property="id" column="student_id"/><result property="username" column="username"/>
</collection>

【示例9-2】在了解了MyBatis处理一对多关联关系的元素和方式后,接下来以班级和学生之间的这种一对多关联关系为例,详细讲解如何在MyBatis中处理一对多关联关系,具体步骤如下。

 在db_mybatis数据库中创建两个数据表:tb_banji和tb_student,同时在表中预先插入几条数据,执行的SQL语句如下所示:

# 创建一个名称为tb_banji的表(暂时添加少量字段)
CREATE TABLE tb_banji(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32)
);
#插入两条数据
INSERT INTO tb_banji VALUES(1,'16软件技术1班');
INSERT INTO tb_banji VALUES(2,'16软件技术2班');
# 创建一个名称为tb_student的表(暂时添加少量字段)
CREATE TABLE tb_student(
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(32),
sex CHAR(1),
banji_id INT ,
FOREIGN KEY (banji_id) REFERENCES tb_banji(id)
);
#插入3条数据
INSERT INTO tb_student VALUES(1,'孙淼','m',1);
INSERT INTO tb_student VALUES(2,'刘梦奕','f',1);
INSERT INTO tb_student VALUES(3,'无为','m',2);

 在com.ssm.po包中创建持久化类:班级类Banji和学生类Student,并在两个类中定义相关属性和方法,如文件9.7和文件9.8所示。

文件9.7  Banji.java

01	package com.ssm.po;
02	import java.util.List;
03	//班级类
04	public class Banji {
05		private Integer id;
06		private String name;
07		private List<Student> studentList;
08		public Integer getId() {
09			return id;
10		}
11		public void setId(Integer id) {
12			this.id = id;
13		}
14		public String getName() {
15			return name;
16		}
17		public void setName(String name) {
18			this.name = name;
19		}
20		public List<Student> getStudentList() {
21			return studentList;
22		}
23		public void setStudentList(List<Student> studentList) {
24			this.studentList = studentList;
25		}
26		public String toString() {
27			return "Banji [id=" + id + ", name=" + name + ", studentList=" + studentList + "]";
28		}
29	}

文件9.8  Student.java

01	package com.ssm.po;
02	//学生类
03	public class Student {
04		private Integer id;
05		private String name;
06		private String sex;
07		public Integer getId() {
08			return id;
09		}
10		public void setId(Integer id) {
11			this.id = id;
12		}
13		public String getName() {
14			return name;
15		}
16		public void setName(String name) {
17			this.name = name;
18		}
19		public String getSex() {
20			return sex;
21		}
22		public void setSex(String sex) {
23			this.sex = sex;
24		}
25		public String toString() {
26			return "Student [id="+ id +", name="+ name + ", sex="+ sex +"]";
27		}	
28	}

 在com.ssm.mapper包中创建班级实体映射文件BanjiMapper.xml,并在文件中编写一对多关联映射查询的配置,如文件9.9所示。

文件9.9  BanjiMapper.xml

01	<?xml version="1.0" encoding="UTF-8"?>
02	<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
03		"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
04	<mapper namespace="com.ssm.mapper.BanjiMapper">
05		<!--一对多:查看某一班级及其关联的学生信息
06		注意:若关联查询出的列名相同,默认使用前者,所以需要使用别名区分  -->
07		<select id="findBanjiWithStudent" parameterType="Integer"
08			   resultMap="BanjiWithStudentResult">
09			select b.*,s.id as student_id,s.name as sname,s.sex
10				from tb_banji b,tb_student s
11				where b.id=s.banji_id and b.id=#{id}
12		</select>
13		<resultMap type="Banji" id="BanjiWithStudentResult">
14			<id property="id" column="id" />
15			<result property="name" column="name" />
16			<!--一对多关联映射:collection
17			ofType表示属性集合中元素的类型List<Student>属性,即Student类-->
18			<collection property="studentList" ofType="Student">
19				<id property="id" column="student_id" />
20				<result property="name" column="sname" />
21				<result property="sex" column="sex" />
22			</collection>
23		</resultMap>
24	</mapper>

在文件9.9中,使用MyBatis嵌套结果的方式定义了一个根据班级id查询班级及其关联的学生信息的 select语句。因为返回的班级对象中包含Student集合对象属性,所以需要手动编写结果映射信息。

 将映射文件BanjiMapper.xml的路径配置到核心配置文件mybatis-config.xml中,其代码如下所示:

<mapper resource="com/ssm/mapper/BanjiMapper.xml" />

 在测试类MyBatisAssociatedTest中编写测试方法findBanjiTest()。

@Test
public void findBanjiTest(){SqlSession sqlSession = MybatisUtils.getSession();//查询班级id为1的班级信息(及其关联的学生集合信息)Banji banji=
sqlSession.selectOne("com.ssm.mapper.BanjiMapper.findBanjiWithStudent",1);System.out.println(banji.toString());sqlSession.close();		
}

执行方法后,控制台输出结果如图9.2所示。使用MyBatis嵌套结果的方式查询出了班级及其关联的学生集合信息。这就是MyBatis一对多的关联查询。

图9.2  运行结果

注意:上述示例从班级的角度出发,班级与学生之间是一对多的关联关系,但如果从单个学生的角度出发,一个学生只能属于一个班级,即一对一的关联关系。

相关文章:

MyBatis入门之一对多关联关系(示例)

【图书介绍】《SpringSpring MVCMyBatis从零开始学&#xff08;视频教学版&#xff09;&#xff08;第3版&#xff09;》-CSDN博客 《SpringSpring MVCMyBatis从零开始学(视频教学版)&#xff08;第3版&#xff09;》(杨章伟&#xff0c;刘祥淼)【摘要 书评 试读】- 京东图书 …...

【Git 】Windows 系统下 Git 文件名大小写不敏感

背景 在 Windows 系统上&#xff0c;Git 对文件名大小写的不敏感性问题确实存在。由于 Windows 文件系统&#xff08;如 NTFS &#xff09;在默认情况下不区分文件名大小写所导致的。 原因分析 文件系统差异 Windows文件系统&#xff08;如 NTFS&#xff09;默认不区分文件名…...

【算法系列-二叉树】层序遍历

【算法系列-二叉树】层序遍历 文章目录 【算法系列-二叉树】层序遍历1. 算法分析&#x1f6f8;2. 相似题型&#x1f3af;2.1 二叉树的层序遍历II(LeetCode 107)2.2 二叉树的右视图(LeetCode 199)2.3 二叉树的层平均值(LeetCode 637)2.4 N叉树的层序遍历(LeetCode 429)2.5 在每个…...

我的世界方块改进版

引子 之前文章的磁性方块&#xff0c;通过3D打印实现&#xff0c;也批量打印了一些&#xff0c;下图就是一个小树 使用过程中&#xff0c;发现磁力感觉不紧&#xff0c;所以想改进一版。 正文 之前的结构如下&#xff1a;&#xff1a; 如果出现相邻的空隙间的磁铁相互作用&am…...

博客搭建之路:hexo增加搜索功能

文章目录 hexo增加搜索功能本地搜索弊端algolia搜索 hexo增加搜索功能 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 作为一个博客&#xff0c;没有搜索功能&#xff0c;如何在大批文章中找到自己想要的&#xff0c;那在hexo中如何增加搜索功能呢&#xff1f; search:path: sea…...

2024年最新互联网大厂精选 Java 面试真题集锦(JVM、多线程、MQ、MyBatis、MySQL、Redis、微服务、分布式、ES、设计模式)

前言 春招&#xff0c;秋招&#xff0c;社招&#xff0c;我们 Java 程序员的面试之路&#xff0c;是挺难的&#xff0c;过了 HR&#xff0c;还得被技术面&#xff0c;在去各个厂面试的时候&#xff0c;经常是通宵睡不着觉&#xff0c;头发都脱了一大把&#xff0c;还好最终侥幸…...

MybatisPlus入门(一)MybatisPlus简介

一、MyBatis简介 MyBatisPlus&#xff08;简称MP&#xff09;是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在简化开发、提高效率 - 官网&#xff1a;https://mybatis.plus/ https://mp.baomidou.com/ MyBatisPlus特性&#xff1a; - 无侵入&#xff1a;只做增强…...

QoS学习笔记

QoS业务分类 基于 DiffServ 服务模型的 QoS 业务可以分为以下几大类&#xff1a; 流分类和标记&#xff08;Traffic classification and marking&#xff09;&#xff1a;要实现差分服务&#xff0c;需要首先将数据包分为不同的类别或者设置为不同的优先级。将数据包分为不同…...

图(邻接矩阵)知识大杂烩!!(邻接矩阵结构,深搜,广搜,prim算法,kruskal算法,Dijkstra算法,拓扑排序)(学会一文让你彻底搞懂!!)

小伙伴们大家好&#xff0c;今天给大家带来图&#xff08;邻接矩阵&#xff09;的各种知识&#xff0c;让你看完此文章彻底学会邻接矩阵的相关问题。 1.邻接矩阵表示方法 1.1知识讲解 我们用一个二维数组arr来表示图。若图为有向图&#xff0c;其中arr【i】【j】w表示i号点和…...

Prometheus自定义PostgreSQL监控指标

本文我们将介绍如何在Prometheus中创建自定义PostgreSQL指标。默认情况下由postgres_export运行的查询可能不能满足用户需求&#xff0c;但我们可以创建自定义查询&#xff0c;并要求postgres_exporter公开自定义查询的结果。postgres_exporter最近被移到了Prometheus Communit…...

400行程序写一个实时操作系统(十六):操作系统中的调度策略

前言 在前面我们完成了Sparrow的临界区的代码&#xff0c;使用临界区&#xff0c;能够解决常见的并发问题&#xff0c;现在该完善我们的调度算法了。 调度算法在操作系统领域常常是热门的话题。不同的用途将会使用不同的调度策略。在本节&#xff0c;笔者将为大家介绍一些操作…...

从安灯系统看汽车零部件工厂的智能制造转型

在当今快速发展的制造业领域&#xff0c;汽车零部件工厂正面临着日益激烈的市场竞争和不断提高的客户需求。为了在竞争中脱颖而出&#xff0c;实现可持续发展&#xff0c;许多汽车零部件工厂纷纷踏上智能制造转型之路。而安灯系统作为一种重要的生产管理工具&#xff0c;在这场…...

SwiftUI(三)- 渐变、实心形状和视图背景

引言 在现代的应用的UI设计中&#xff0c;渐变和形状背景为界面带来了丰富的层次与视觉效果&#xff0c;而SwiftUI提供了一系列简单且强大的API&#xff0c;可以轻松实现这些效果。在这篇文章中&#xff0c;我们将介绍SwiftUI中的渐变、实心形状和视图背景的基础用法&#xff…...

RK3568-ota升级

ota升级 OTA&#xff08;Over-the-Air&#xff09;即空间下载技术。 OTA 升级是 Android 系统提供的标准软件升级方式。它功能强大&#xff0c;可以无损失升级系统&#xff0c;主要通过网络&#xff0c;例如 WIFI、3G/4G 自动下载 OTA 升级包、自动升级&#xff0c;也支持通过…...

GR-ConvNet代码详解

GR-ConvNet代码详解 文章目录 GR-ConvNet代码详解前言一、utils1.dataset_processing1.image.py1.Iamge类2.DepthImage类3.WidthImage类 2.grasp.py1. _gr_text_to_no()方法2.GraspRectangles类3.GraspRectangle类3.Grasp类4.detect_grasps方法 3.generate_cornell_depth.py4.e…...

Excel自带傅里叶分析数据处理——归一化处理

在Excel工具中&#xff0c;默认情况下数据处理---傅里叶分析通常不进行归一化处理&#xff0c;需要用户手动进行归一化处理。 &#xff08;1&#xff09;傅里叶变换的原理 傅里叶变换将时域信号转换为频域信号&#xff0c;输出的是复数形式的频率分量&#xff0c;包含了幅值和…...

Centos7.6版本安装mysql详细步骤

操作步骤&#xff1a; 1.下载Linux版本Mysql并上传至linux系统中 2.解压mysql并查询系统中是否有相关软件存在以及配置mysql,启动mysql tar -zxvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz tar -zxvf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz rpm -qa|grep mysql ##查…...

寄宿学校:为自闭症儿童提供全面的教育和关爱

在这个多彩的世界里&#xff0c;每一个生命都值得被温柔以待&#xff0c;每一颗心灵都值得被悉心呵护。然而&#xff0c;自闭症儿童这一特殊群体&#xff0c;他们的世界却常常被误解和忽视。幸运的是&#xff0c;有一种教育模式——寄宿学校&#xff0c;正为这些孩子打开了一扇…...

LLaMA Factory环境配置

LLaMA-Factory官方文档 安装正确的torch和cuda版本 参考&#xff1a; PyTorch 报错解决 1.ImportError: /usr/lib/x86_64-linux-gnu/libstdc.so.6: version GLIBCXX_3.4.29 not found 参考这个解决&#xff1a;丝滑解决ImportError: /usr/lib/x86_64-linux-gnu/libstdc.s…...

STM32实现毫秒级时间同步

提起“时间同步”这个概念&#xff0c;大家可能很陌生。一时间搞不清楚是什么意思。 我理解“时间同步”可以解决多个传感器采集数据不同时的问题&#xff0c;让多个传感器同时采集数据。 打个比方。两个人走路&#xff0c;都是100毫秒走一步&#xff08;频率相同是前提&…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...