MyBatis关联查询

文章目录

  • 前言
  • 多对一关联 association
  • 一对多关联 collection
  • resultMap元素


前言

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

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

数据库代码:

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);
			}
		}
	}

在这里插入图片描述


resultMap元素

当数据表中的列和需要返回的对象的属性不完全一致, MyBatis是不会自动赋值的。此时,就可以使用<resultMap>元素进行处理。

<resultMap>元素的子元素<id>用于表示哪个列是主键,而<result>元素用于表示POJO和数据表中普通列的映射关系。

<resultMap id="custResultMap" type="Customer">
       <id property="id" column="id" />
       <result property="custId" column="cust_id"/>
       <result property="name" column="name"/>
</resultMap>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

升级你的GitHub终端认证方式:从密码到令牌

升级你的GitHub终端认证方式&#xff1a;从密码到令牌 前言 GitHub官方在2021年8月14日进行了一次重大改变&#xff0c;它将终端推送代码时所需的身份认证方式从密码验证升级为使用个人访问令牌&#xff08;Personal Access Token&#xff09;。这个改变引起了一些新的挑战&am…

java网络编程概述及例题

网络编程概述 计算机网络 把分布在不同地理区域的计算机与专门的外部设备用通信线路连成一个规模大、功能强的网络系统&#xff0c;从而使众多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。 网络编程的目的 直接或间接地通过网络协议与其他计算机实现…

【NLP概念源和流】 04-过度到RNN(第 4/20 部分)

接上文 【NLP概念源和流】 03-基于计数的嵌入,GloVe(第 3/20 部分) 一、说明 词嵌入使许多NLP任务有了显著的改进。它对单词原理图的理解以及将不同长度的文本表示为固定向量的能力使其在许多复杂的NLP任务中非常受欢迎。大多数机器学习算法可以直接应用于分类和回归任务的…

独立站私域怎么玩?浅浅了解一下吧!

当你是一个跨境电商独立站的卖家&#xff0c;你的工作有三个主要焦点&#xff1a;充分利用流量、提升用户转化率和降低用户的总体成本。 然而&#xff0c;除了利用广告以外&#xff0c;是否有更多的策略可以帮助你接触到用户&#xff0c;同时降低吸引新用户的成本呢&#xff1…

SpringBoot统一功能处理(AOP思想实现)(统一用户登录权限验证 / 异常处理 / 数据格式返回)

主要是三个处理&#xff1a; 1、统一用户登录权限验证&#xff1b; 2、统一异常处理&#xff1b; 3、统一数据格式返回。 目录 一、用户登录权限校验 &#x1f345; 1、使用拦截器 &#x1f388; 1.1自定义拦截器 &#x1f388; 1.2 设置自定义拦截器 &#x1f388;创建cont…

SSM项目-博客系统

在线体验项目&#xff1a;登陆页面 项目连接&#xff1a;huhublog_ssm: 个人博客系统 技术栈&#xff1a;SpringBoot、SpringMVC、Mybatis、Redis、JQuery、Ajax、Json (gitee.com) 1.项目技术点分析 SpringBoot、SpringWeb(SpringMVC)、MyBatis、MySQL(8.x)、Redis(存储验…

JSP实训项目设计报告—MVC简易购物商城

JSP实训项目设计报告—MVC简易购物商城 文章目录 JSP实训项目设计报告—MVC简易购物商城设计目的设计要求设计思路系统要求单点登录模块商品展示模块购物车展示模块 概要设计Model层View层Controller层 详细设计Model层View层登录界面系统主界面 Controller层 系统运行效果项目…

【驱动开发day8作业】

作业1&#xff1a; 应用层代码 #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <sys/ioctl.h>int main(int…

CVE-2022-23134(Zabbix setup 访问控制登录绕过)

目录 一、题目 二、进入题目 一、题目 靶标介绍&#xff1a; Zabbix Sia Zabbix是拉脱维亚Zabbix SIA&#xff08;Zabbix Sia&#xff09;公司的一套开源的监控系统。该系统支持网络监控、服务器监控、云监控和应用监控等。 Zabbix 存在安全漏洞&#xff0c;该漏洞源于在初始…

为什么要选择文件传输软件?有哪些最佳高速文件传输软件?

是否经历过这样的场景&#xff0c;正在努力地完成工作任务&#xff0c;但是由于制作的数据无法及时传送给合作伙伴&#xff0c;工作流程被打断了&#xff1f;这听起来很令人沮丧&#xff0c;对吧&#xff1f;可是&#xff0c;这种情况在现实中并不罕见。 因此&#xff0c;需要…

数据结构——搜索二叉树

文章目录 一. 概念二. 二叉搜索树的操作1.查找2.插入3.删除&#xff08;重点&#xff09;4.遍历5.拷贝构造与析构 三.二叉搜索树的递归实现1.递归查找2.递归插入3.递归删除 四.二叉搜索树的性能分析五.二叉树搜索的应用六.源码 前言&#xff1a; 本章我们将认识一种新的二叉树—…

Spring Boot配置文件与日志文件

1. Spring Boot 配置文件 我们知道, 当我们创建一个Spring Boot项目之后, 就已经有了配置文件存在于目录结构中. 1. 配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的&#xff0c;比如: 数据库的连接信息 (包含用户名和密码的设置) ;项目的启动端口;第三方系统的调…

【chrome扩展开发】vue-i18n使用问题及解决方案

记录chrome扩展开发时调用vue-i18n的一些问题和解决方法 环境 vue: ^3.3.4vue-i18n: ^9.2.2vite: ^4.4.8 错误1 Uncaught (in promise) EvalError: Refused to evaluate a string as JavaScript because unsafe-eval is not an allowed source of script in the following Con…

vi 编辑器入门到高级

vi 编辑器的初级用法vi 编辑器的工作模式1. 命令模式2. 文本输入模式3. 状态行vi 工作模式切换存储缓冲区 vi 编辑器命令1. 启动 vi2. 文本输入3. 退出 vi4. 命令模式下的 光标移动5. 命令模式下的 文本修改6. 从 命令模式 进入 文本输入模式7. 搜索字符串8. vi 在线帮助文档 v…

云原生Kubernetes:阿里云托管k8s集群ACK创建和使用

目录 一、理论 1.容器服务Kubernetes版 2.ACK Pro版集群概述 3.CKA版本说明 二、实验 1.创建专有版Kubernetes集群 三、问题 1.依赖检查未通过 一、理论 1.容器服务Kubernetes版 &#xff08;1&#xff09;概念 阿里云容器服务Kubernetes版&#xff08;Alibaba Cloud…

mysql转sqlite3

在项目中需要将mysql迁移到sqlite3中&#xff0c;此时需要作数据转换 准备工作 下载mysql2sqlite转换工具 https://github.com/dumblob/mysql2sqlite/archive/refs/heads/master.zip 下载sqlite3 https://www.sqlite.org/download.html 转换 命令行中输入如下命令 1、cd …

Vue——webpack

webpack 一、Install1.全局安装2.局部安装 二、总结1.打包2.定义脚本3.配置文件定义&#xff08;webpack.config.js)4.项目重新加载依赖5.webpack打包Css6.style-loader 一、Install 1.全局安装 npm install webpack webpack-cli -g2.局部安装 以项目为单位&#xff0c;一个项…

skywalking日志收集

文章目录 一、介绍二、添加依赖三、修改日志配置1. 添加链路表示traceId2. 添加链路上下文3. 异步日志 四、收集链路日志 一、介绍 在上一篇文章skywalking全链路追踪中我们介绍了在微服务项目中使用skywalking进行服务调用链路的追踪。 本文在全链路追踪的基础上&#xff0c…

QT生成Debug和Release发布版后,运行exe缺少dll问题

在QT Creator生成debug和release的exe执行文件后&#xff0c;运行时&#xff0c;报错缺少*.dll.解决办法1&#xff1a; 在系统环境变量中添加D:\Qt\Qt5.13.2\Tools\mingw730_64\bin后&#xff0c;即可运行。 当使用此方法时&#xff0c;将exe拷贝到其他电脑中运行时&#xff0c…

科技感响应式管理系统后台登录页ui设计html模板

做了一个科技感的后台管理系统登录页设计&#xff0c;并且尝试用响应式布局把前端html写了出来&#xff0c;发现并没有现象中的那么容易&#xff0c;chrome等标准浏览器都显示的挺好&#xff0c;但IE11下面却出现了很多错位&#xff0c;兼容起来还是挺费劲的&#xff0c;真心不…