MyBatis关联查询

news2024/11/16 17:27:19

文章目录

  • 前言
  • 多对一关联 association
  • 一对多关联 collection


前言

提示:这里可以添加本文要记录的大概内容:
关联查询是指在一个查询中同时获取多个表中的数据,将它们结合在一起进行展示。

关联表需要两个及以上的表

数据库代码:

DROP TABLE IF EXISTS student;
DROP TABLE IF EXISTS teacher;
CREATE TABLE teacher
(
   tid    int PRIMARY KEY auto_increment,
   tname  VARCHAR(30)
);
CREATE TABLE student
(
   sid    int PRIMARY KEY auto_increment,
   sname  VARCHAR(30),
   age    int,
   tid    int,
   foreign key (tid)  references teacher(tid)
);

生成实体类代码:

Student :

public class Student {
	private Integer sid;
	private String sname;
	private Integer age;
	// 方便以后的扩展   po类
	private Teacher teacher;
// 自动生成 Getter、Setter、toString()、有参无参方法 
}

Teacher :

public class Teacher {
	private Integer tid;
	private String tname;
// 自动生成 Getter、Setter、toString()、有参无参方法
}

提示:以下是本篇文章正文内容,下面案例可供参考

  1. 主键列标记是id
  2. 普通列标记是result
  3. 关联查询的映射标记是association

多对一关联 association

<association>标签用于描述一个一对一的关联关系,它可以嵌套在<select>语句中,查询指定的关联表数据。

多个学生关联一个老师

在 main/java 文件夹中创建学生和老师的接口以及同名的映射文件

其中映射文件中的namespace是接口文件中的限定名

查询所有的学生数据,同时关联出对应的老师

所以在学生接口文件中:

public interface StudentMapper {
	List<Student> queryAllStudents();
}

在学生的映射文件中:SQL语句用的SQL99写法

<mapper namespace="com.mybatis.mapper.StudentMapper">
								<!-- 结果的映射 -->
	<select id="queryAllStudents" resultMap="st">
		select sid,sname,age,t.tid,tname
		from student s join teacher t
		on s.tid = t.tid
	</select>
</mapper>

SQL语句写完后要在Navicat中单独运行一下:防止有错
在这里插入图片描述
因为 t.tid,tname 和 teacher 数据不一致,所有需要在映射文件中加一个 resultMap 标记
请添加图片描述
需要把不一致的那两列单独映射到 teacher 属性里

所以最终学生的映射文件中的代码:

<mapper namespace="com.mybatis.mapper.StudentMapper">
						  <!-- st:随便起名 -->
	<resultMap type="Student" id="st">
	<!-- 主键列用id标记 -->
		<id column="sid" property="sid"/>
	<!-- 普通列用result标记 -->
		<result column="sname" property="sname"/>
		<result column="age" property="age"/>
	<!-- 关联查询的映射标记是association -->
		<association property="teacher" javaType="Teacher">
			<id column="tid" property="tid"/>
			<result column="tname" property="tname"/>
		</association>
	</resultMap>
								<!-- 结果的映射与上面的id值对应 -->
	<select id="queryAllStudents" resultMap="st">
		select sid,sname,age,t.tid,tname
		from student s join teacher t
		on s.tid = t.tid
	</select>
</mapper>

测试类代码:

	@Test 
	public void queryStudent() {
		StudentMapper mapper = session.getMapper(StudentMapper.class);
		List<Student> list = mapper.queryAllStudents();
		//	foreach提示
		for (Student student : list) {
			System.out.println(student);
		}
	}

在这里插入图片描述

一对多关联 collection

<collection>标签用于描述一个一对多的关联关系,它可以嵌套在<select>语句中,查询关联表数据集合。

一个老师关联多少个学生

查询老师数据时,同时关联出老师对应的学生

这里要更老师的 po 类,加上:

	// 数组和集合能体现多个数据,这里用集合,因为不确定有多少学生
	private List<Student> students;
	// 生成Getter、Setter

所以在老师接口文件中:首先在接口中定义一个方法(查询所有老师)

List<Teacher> queryAllTeachers();

在老师的映射文件中:
首先加上 namespace,映射文件中的namespace是接口文件中的限定名

	<select id="queryAllTeachers">
		select t.tid,tname,sid,sname,age
		from teacher t join student s 
		on t.tid = s.tid
	</select>

SQL语句写完后要在Navicat中单独运行一下:防止有错
在这里插入图片描述
接下来配置映射:

<!-- 结果映射 -->
	<resultMap type="Teacher" id="teacher">
		<id column="tid" property="tid"/>
		<result column="tname" property="tname"/>
<!-- 一对多映射使用collection标记 --><!-- 属性名property是老师po类的students -->
		<collection property="students" ofType="Student">
			<id column="sid" property="sid"/>
			<result column="sname" property="sname"/>
			<result column="age" property="age"/>
		</collection>
	</resultMap>

最后要在 select 标签内加一个 resultMap,因为结果是自己单独配置的

所以最终老师的映射文件中的代码:

<mapper namespace="com.mybatis.mapper.TeacherMapper">
<!-- 结果映射 -->
	<resultMap type="Teacher" id="teacher">
		<id column="tid" property="tid"/>
		<result column="tname" property="tname"/>
<!-- 一对多映射使用collection标记 --><!-- 属性名property是老师po类的students -->
		<collection property="students" ofType="Student">
			<id column="sid" property="sid"/>
			<result column="sname" property="sname"/>
			<result column="age" property="age"/>
		</collection>
	</resultMap>
	
	<select id="queryAllTeachers" resultMap="teacher">
		select t.tid,tname,sid,sname,age
		from teacher t join student s 
		on t.tid = s.tid
	</select>
</mapper>

接下来写测试类

@Test 
	public void queryTeacher() {
		TeacherMapper mapper = session.getMapper(TeacherMapper.class);
		List<Teacher> list = mapper.queryAllTeachers();
		// foreach循环
		for (Teacher teacher : list) {
			// 只输出老师数据
			System.out.println(teacher);
			// 得到学生
			List<Student> sl = teacher.getStudents();
			// 遍历sl学生集合,看看老师关联的学生数据
			for (Student student : sl) {
				System.out.println(student);
			}
		}
	}

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/839081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初阶C语言——特别详细地介绍函数

系列文章目录 第一章 “C“浒传——初识C语言&#xff08;更适合初学者体质哦&#xff01;&#xff09; 第二章 详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言——特别详细地介绍函数 目录 系列文章目录 前言 一、函数是个什么鬼东西&#xff1f; 二、C语…

springboot基于vue的高校迎新系统的设计与实现8jf9e

随着时代的发展&#xff0c;人们的生活方式得到巨大的改变&#xff0c;从而慢慢地产生了大量高校迎新信息&#xff0c;高校迎新信息需要一个现代化的管理系统&#xff0c;进行高校迎新信息的管理。 高校迎新系统的开发就是为了解决高校迎新管理的问题&#xff0c;系统开发是基于…

JavaScript |(六)DOM事件 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 文章目录 &#x1f4da;事件对象&#x1f4da;事件的冒泡&#x1f4da;事件的委派&#x1f4da;事件的绑定&#x1f407;赋值绑定&#x1f407;addEventListener()&#x1f407;attachEvent()&…

认识FFMPEG框架

FFMPEG全称: Fast Forward Moving Picture Experts Group (MPEG:动态图像专家组) ffmpeg相关网站: git://source.ffmpeg.org/ffmpeg.git http://git.videolan.org/?pffmpeg.git https://github.com/FFmpeg/FFmpeg FFMPEG框架基本组件: AVFormat , AVCodec, AVDevice, AVFil…

【多线程学习6】synchronized关键字

【多线程学习6】synchronized关键字 一、synchronized关键字是什么&#xff1f;有什么作用&#xff1f; synchronized关键字是Java线程同步的关键字&#xff0c;其可以修饰方法或代码块&#xff0c;并可以保证其修饰的方法或代码块在任意时刻只能有一个线程执行。 synchroni…

关于HIVE的分区与分桶

1.分区 1.概念 Hive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录&#xff0c;每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择查询所需要的分区&#xff0c;这样的查询效率会提高很多 个人理解白话:按表中或者自定义的一个列,对数据进…

筛选给定范围内的日志

目录 1.时间戳 2.实例 1.首先创建ubuntu.log日志 2.写dem.awk创建规则 3.筛选 1.时间戳 一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列&#xff0c;唯一地标识某一刻的时间。 awk提供了mktime()函数&#xff0c;它可以将时间…

macbook怎么卸载软件?2023年最新全新解析macbook电脑怎样删除软件

macbook怎么卸载软件&#xff1f;2023年最新全新解析macbook电脑怎样删除软件。关于Mac笔记本如何卸载软件_Mac笔记本卸载软件的四种方法的知识大家了解吗&#xff1f;以下就是小编整理的关于Mac笔记本如何卸载软件_Mac笔记本卸载软件的四种方法的介绍&#xff0c;希望可以给到…

像素画教程:立体感与“84渐变法“

像素画本身没有什么困难&#xff0c;是矢量图简笔画之外最简单、而又最容易产生美术效果的画风。 然而&#xff0c;细节难以描绘、立体感难表现、画面易单调成了像素画绘制过程中的常见困难。 这篇文章或许不能保证每个人都能熟练掌握、运用像素画&#xff0c;但至少可以抛砖引…

任务14、无缝衔接,MidJourney瓷砖(Tile)参数制作精良贴图

14.1 任务概述 在这个实验任务中,我们将深入探索《Midjourney Ai绘画》中的Tile技术和其在艺术创作中的具有挑战性的应用。此任务将通过理论学习与实践操作相结合的方式,让参与者更好地理解Tile的核心概念,熟练掌握如何在Midjourney平台上使用Tile参数,并实际运用到AI绘画…

【雕爷学编程】Arduino动手做(184)---快餐盒盖,极低成本搭建机器人实验平台

吃完快餐粥&#xff0c;除了粥的味道不错之外&#xff0c;我对个快餐盒的圆盖子产生了兴趣&#xff0c;能否做个极低成本的简易机器人呢&#xff1f;也许只需要二十元左右 知识点&#xff1a;轮子&#xff08;wheel&#xff09; 中国词语。是用不同材料制成的圆形滚动物体。简…

Dockerfile定制Tomcat镜像

Dockerfile中的打包命令 FROM &#xff1a; 以某个基础镜像作为此镜像的基础 RUN &#xff1a; RUN后面跟着linux常用命令&#xff0c;如RUN echo xxx >> xxx,注意&#xff0c;RUN 不能用于执行命令&#xff0c;因为每个RUN都是独立运行的&#xff0c;RUN 的cd对镜像中的…

Python求均值、方差、标准偏差SD、相对标准偏差RSD

均值 均值是统计学中最常用的统计量&#xff0c;用来表明资料中各观测值相对集中较多的中心位置。用于反映现象总体的一般水平&#xff0c;或分布的集中趋势。 import numpy as npa [2, 4, 6, 8]print(np.mean(a)) # 均值 print(np.average(a, weights[1, 2, 1, 1])) # 带…

Godot4 C# vscode开发环境搭建

这里写自定义目录标题 软件Godot配置vscode配置结果参考 软件 Godot .Net版本: 下载链接vscode :自行下载.netcore7&#xff1a;.netcore6可能也行vscode插件&#xff1a; Godot配置 1.配置文件用VSCode打开 2.生成C#项目 项目–>工具–>C#->Create C# Solution&…

Python 关于模块的几点介绍 。和。。和__all__和__main___和__file__

./ 是意思让解释器去引用当前目录下的内容 ../ 是意思让解释器去引用上层目录下的内容 __all__ 用来定义我们导出的内容可以有哪些的一个编码方式 flake8 可以检测代码的安全隐患&#xff0c;在python中 if __name__ __main__ 现在有两个文件&#xff0c;分别为&a…

【Unity3D】花瓣特效

1 花瓣绘制原理 如下图是实现的花瓣特效效果&#xff0c;为方便描述&#xff0c;我们将每个红色的扁状长条称为花瓣&#xff0c;每个花瓣中心的绿点称为花蕊&#xff0c;花朵的正中心称为花心。 我们在 xOz 平面上绘制花朵&#xff0c;假设花心为 O 点&#xff0c;其世界坐标为…

JVM之类加载与字节码

1.类文件结构 一个简单的HelloWorld.Java package cn.itcast.jvm.t5; // HelloWorld 示例 public class HelloWorld { public static void main(String[] args) { System.out.println("hello world"); } }编译为 HelloWorld.class 后的样子如下所示&#xff1a; […

CentOS安装podman-compose

1. 安装python3的依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel 如果当前登录的是普通用户&#xff0c;需要在命令前加sudo&#xff0c;否则不用&…

C++实用技术(二)std::function和bind绑定器

目录 简介std::functionstd::function对象包装器std::function做回调函数 std::bind绑定器bind绑定普通函数bind绑定成员函数 简介 C11新增了std::function和std::bind。用于函数的包装以及参数的绑定。可以替代一些函数指针&#xff0c;回调函数的场景。 std::function std…

git 版本控制与合并

一 git概述&#xff1a; - Git是一种分布式版本控制系统&#xff0c;用于跟踪和管理软件开发项目中的代码变更。 - 它允许多人协同工作&#xff0c;记录代码历史变更&#xff0c;并轻松管理多个项目版本。 **Git的主要特点**包括&#xff1a; 1. **分布式系统**&#xff1a;…