MyBatis关联查询

文章目录

  • 前言
  • 多对一关联 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,tnamefrom student s join teacher ton 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,tnamefrom student s join teacher ton 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,agefrom 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,agefrom 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.hqwc.cn/news/53371.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解负载均衡原理及算法

1. 前言 在互联网早期,网络还不是很发达,上网用户少,流量相对较小,系统架构以单体架构为主。但如今在互联网发达的今天,流量请求动辄百亿、甚至上千亿,单台服务器或者实例已完全不能满足需求,这就有了集群。不论是为了实现高可用还是高性能,都需要用到多台机器来扩展服…

如何安装、部署、启动Jenkins

一、测试环境 Linux系统 Centos 7 二、安装步骤&#xff1a; 1、安装jdk 我安装的是jdk8&#xff0c;此处就不多说了&#xff0c;自己百度哈&#xff0c;很简单 2、安装jenkins 首先依次执行如下三个命令&#xff1a; 2.1、导入镜像&#xff1a; [rootcentos7 ~]# sudo …

目标检测中的IOU

IOU 什么是IOU?IOU应用场景写代码调试什么是IOU? 简单来说IOU就是用来度量目标检测中预测框与真实框的重叠程度。在图像分类中,有一个明确的指标准确率来衡量模型分类模型的好坏。其公式为: 这个公式显然不适合在在目标检测中使用。我们知道目标检测中都是用一个矩形框住…

测试人员简单使用Jenkins

一、测试人员使用jenkins干什么&#xff1f; 部署测试环境 二、相关配置说明 一般由开发人员进行具体配置 1.Repository URL&#xff1a;填写git地址 2.填写开发分支&#xff0c;测试人员可通过相应分支进行测试环境的构建部署 当多个版本并行时&#xff0c;开发人员可以通过…

嵌入式开发学习(STC51-9-led点阵)

内容 点亮一个点&#xff1b; 显示数字&#xff1b; 显示图像&#xff1b; LED点阵简介 LED 点阵是由发光二极管排列组成的显示器件 通常应用较多的是8 * 8点阵&#xff0c;然后使用多个8 * 8点阵可组成不同分辨率的LED点阵显示屏&#xff0c;比如16 * 16点阵可以使用4个8 *…

MySQL常见问题处理(三)

MySQL 常见问题解决 夕阳留恋的不是黄昏&#xff0c;而是朝阳 上一章简单介绍了MySQL数据库安装(二), 如果没有看过, 请观看上一章 一. root 用户密码忘记&#xff0c;进行重置操作 复制内容来源链接: https://blog.csdn.net/weixin_48927364/article/details/123556927 一.…

2023华数杯数学建模C题思路分析 - 母亲身心健康对婴儿成长的影响

# 1 赛题 C 题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c; 还为婴儿提供情感支持和安全感。母亲心理健康状态的不良状况&#xff0c;如抑郁、焦虑、 压力等&#xff0c;可能会对婴儿的认知、情…

BI报表工具有哪些作用?奥威BI全面剖析数据

BI报表工具有哪些作用&#xff1f;主要的作用是通过整合多业务来源数据&#xff0c;全面分析挖掘数据&#xff0c;来帮助企业实现数据化运营、支持智能决策、实现数据资产沉淀和增值、进行数据挖掘和预测分析、提高数据可读性和数据可视化程度等&#xff0c;从而提高企业的竞争…

Unity 编辑器选择器工具类Selection 常用函数和用法

Unity 编辑器选择器工具类Selection 常用函数和用法 点击封面跳转下载页面 简介 在Unity中&#xff0c;Selection类是一个非常有用的工具类&#xff0c;它提供了许多函数和属性&#xff0c;用于操作和管理编辑器中的选择对象。本文将介绍Selection类的常用函数和用法&#xff…

该选择WPF 还是 Winform?

WPF和WinForms都是.NET平台下的桌面应用程序开发框架&#xff0c;它们各有特点&#xff0c;适用于不同的场景和需求。下面是对WPF和WinForms的一些比较和优劣势&#xff1a;WPF&#xff08;Windows Presentation Foundation&#xff09;&#xff1a;WPF具有强大的图形渲染能力&…

QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 - 终篇

QT图形视图系统 - 终篇 接上一篇&#xff0c;我们需要继续完成以下的效果&#xff1b; 先上个效果图&#xff1a; 修改背景&#xff0c;使之整体适配 上一篇我们绘制了标尺&#xff0c;并且我们修改了放大缩小和对应的背景&#xff0c;整体看来&#xff0c;我们的滚动条会和…

DoIP学习笔记系列:(四)用CAPL脚本读取DID的关键点

文章目录 1. 如何在CAPL中读取DID?1.1 避坑如何新建CAPL工程,在此不再赘述,本章主要分享一下如何在CAPL中调用DoIP接口、diag接口进行DoIP和诊断的测试。 1. 如何在CAPL中读取DID? 通常在实际项目中,会有很多DID,各种版本号、各种观测量,如果手动点,显然很麻烦,如果要…