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

MyBatis实验(四)——关联查询

前言

多表关联查询是软件开发中最常见的应用场景,多表查询需要将数据实体之间的一对多、多对多、一对一的关系的转换为复杂的数据对象。mybaits提供的association和collection元素,通过映射文件构造复杂实体对象,在构造实体过程中,mybaits提供的了嵌套查询和嵌套结果查询两种查询方式,前者通过执行多次SQL语句,并支持延迟加载;后者执行一次SQL语句,通过SQL语句的执行结果构造实体。

实验目的

掌握嵌套查询的使用
掌握嵌套结果查询的使用
掌握单个实体(association)和实体集合(collection)的使用

实验内容

以教师和课程呈现的一对一关系为例,验证association元素的使用
以教师和课程呈现的一对一关系为例,验证嵌套查询使用
以教师和课程呈现的一对一关系为例,验证嵌套结果查询使用
以学生和课程呈现的一对多关系为例,验证collection元素的使用
以学生和课程呈现的一对多关系为例,验证嵌套查询使用
以学生和课程呈现的一对多关系为例,验证嵌套结果查询使用

实验步骤

1. 实验准备

  • 创建表和数据维护,表结构如下
    学生表(tb_student)
字段名称字段代码数据类型备注
学号snointeger主键自增
学生姓名snamevarchar(50)
年龄sageinteger
教师表(tb_tearcher)
字段名称字段代码数据类型备注
工号tnointeger主键自增
教师姓名tnamevarchar(50)
年龄tageinteger
课程表(tb_course)
字段名称字段代码数据类型备注
课程号cnointeger主键自增
课程名cnamevarchar(50)
学分ccreditinteger

学生选课表(tb_sc)

字段名称字段代码数据类型备注
课程号cnointeger主键自增
课程名cnamevarchar(50)
学分ccreditinteger
每个表增加不少于5条记录
  • 使用maven创建控制台工程,搭建myBatis的运行环境
  • 编写实体类文件
    教师实体类代码如下
@Data  
public class TeacherEntity {  private Integer tno;  private String tname;  private Integer tage;  
}  

课程实体文件如下所示

@Data
public class CourseEntity  {private int cno;private String cname;private int ccredit;private TeacherEntity teacher;
}

学生实体类代码如下

@Data
public class StudentEntity  {private Integer sno;private String sname;private Integer sage;private List<CourseEntity> courses;
}
  • 编写接口文件
    教师接口文件
public interface TeacherDao {TeacherEntity getTeacherByCourse(Integer cno);
}

课程接口文件

public interface CourseDao {List<CourseEntity> getAllCourse();List<CourseEntity> getAllCourseByResult();List<CourseEntity> getCourseByStudentId(Integer sno);
}

学生接口文件

public interface StudentDao {List<StudentEntity> getAllStudent();List<StudentEntity> getAllStudent2();
}

查询课程信息,并显示该课程的任课教师(一门课只安排一个教师)

展示一对一信息,需要在映射文件中使用association元素

  • 使用嵌套查询
    课程映射文件(CourseMapper.xml)代码如下
<mapper namespace="com.bjwl.dao8.CourseDao" ><resultMap id="CoursePojo" type="com.bjwl.pojo8.CourseEntity"><id property="cno" column="cno"></id><result property="cname" column="cname"></result><result property="ccredit" column="ccredit"></result><association property="teacher" column="cno" fetchType="eager"javaType="com.bjwl.pojo8.TeacherEntity" select="com.bjwl.dao8.TeacherDao.getTeacherByCourse"></association></resultMap><select id="getAllCourse" resultMap="CoursePojo" >select * from tb_course</select>
</mapper>

代码中首先定义了一个resultMap ,建立复杂对象的映射关系,association代表在课程实体(CourseEntity)中有一个教师(teacher)的属性,对应数据类型是教师的实体,二者之间通过列cno关联,数据的获取是通过com.bjwl.dao8.TeacherDao.getTeacherByCourse实现的。其次定义获取全部课程数据使用的方法(getAllCourse)。

定义教师的映射文件(TeacherMapper.xml),在映射文件中定义getTeacherByCourse对应的SQL,代码如下

<mapper namespace="com.bjwl.dao8.TeacherDao" ><select id="getTeacherByCourse" resultType="com.bjwl.pojo8.TeacherEntity">select * from tb_teacher where cno = #{cno}</select>
</mapper>

测试代码如下

    public void test11Nest() throws IOException {SqlSession sqlSession = BatisUtils.getSqlSessionFactory().openSession();CourseDao dao = sqlSession.getMapper(CourseDao.class);List<CourseEntity> courses = dao.getAllCourse();for (CourseEntity course : courses ){System.out.println(course.toString());}

运行结果如下
在这里插入图片描述
上图中总共执行4次SQL语句。

  • 使用嵌套结果查询
    嵌套结果查询只执行一次SQL语句,有查询结果中组织复杂实体对象,映射文件代码如下;
<mapper namespace="com.bjwl.dao8.CourseDao" >  <resultMap id="CoursePojo2" type="com.bjwl.pojo8.CourseEntity">  <id property="cno" column="cno"></id>  <result property="cname" column="cname"></result>  <result property="ccredit" column="ccredit"></result>  <association property="teacher" javaType="com.bjwl.pojo8.TeacherEntity">  <id property="tno" column="tno"></id>  <result property="tname" column="tname"></result>  <result property="tage" column="tage"></result>  </association>  </resultMap>  <select id="getAllCourseByResult"  resultMap="CoursePojo2">  select * from tb_course a left join tb_teacher b on a.cno =b.cno  </select>  
</mapper>  

代码中association ,定义返回结果集中列和实体属性的对应关系。测试代码如下图所示

public void test11Result() throws IOException {  SqlSession sqlSession = BatisUtils.getSqlSessionFactory().openSession();  CourseDao dao = sqlSession.getMapper(CourseDao.class);  List<CourseEntity> courses = dao.getAllCourseByResult();  for (CourseEntity course : courses ){  System.out.println(course.toString());  }  
} 

运行结果如下图所示
在这里插入图片描述

查询学生信息,并显示该学生所修课程(一个学生有多门课程)

展示一对多信息,需要在映射文件中使用实体集合(collection)元素,

  • 使用嵌套查询
    学生映射文件(StudentMapping)代码如下
<mapper namespace="com.bjwl.dao8.StudentDao" ><resultMap id="studentInfo" type="com.bjwl.pojo8.StudentEntity"><id property="sno" column="sno"></id><result property="sname" column="sname"></result><result property="sage" column="sage"></result><collection property="courses" column="sno" ofType="com.bjwl.pojo8.CourseEntity"select="com.bjwl.dao8.CourseDao.getCourseByStudentId"></collection></resultMap><select id="getAllStudent" resultMap="studentInfo">select * from tb_student</select>
</mapper>

代码中首先定义了一个resultMap ,建立复杂对象的映射关系,collection 代表在学生实体中(StudentEntity)中有一个课程(courses)的属性,二者之间通过列sno关联,数据的获取是通过com.bjwl.dao8.CourseDao.getCourseByStudentId实现的。其次定义获取全部课程数据使用的方法(getCourseByStudentId)。
定义课程的映射文件(TeacherMapper.xml),在映射文件中定义getCourseByStudentId对应的SQL,代码如下

<mapper namespace="com.bjwl.dao8.CourseDao" ><select id="getCourseByStudentId" resultType="com.bjwl.pojo8.CourseEntity">select * from tb_course a,tb_sc bwhere a.cno = b.cno andb.sno = #{sno}</select>
</mapper>

测试代码如下:

    public void test1nNest() throws IOException {SqlSession sqlSession = BatisUtils.getSqlSessionFactory().openSession(ExecutorType.BATCH);StudentDao dao = sqlSession.getMapper(StudentDao.class);List<StudentEntity> students = dao.getAllStudent();for (StudentEntity student : students ){System.out.println(student.toString());}}

执行结果如下图所示
在这里插入图片描述

  • 使用嵌套结果
    对应的映射文件为
<mapper namespace="com.bjwl.dao8.StudentDao" ><resultMap id="studentInfo2" type="com.bjwl.pojo8.StudentEntity"><id property="sno" column="sno"></id><result property="sname" column="sname"></result><result property="sage" column="sage"></result><collection property="courses" column="sno" ofType="com.bjwl.pojo8.CourseEntity"><id property="cno" column="cno"></id><result property="cname" column="cname"></result><result property="ccredit" column="ccredit"></result></collection></resultMap><select id="getAllStudent2" resultMap="studentInfo2">SELECT aa.*,bb.* FROM(SELECT a.`sno`,a.`sname`,a.`sage`,b.`cno`FROM tb_student a LEFT JOIN  tb_sc b ON a.sno = b.`sno`) aa  LEFT JOIN tb_course bbON aa.cno = bb.`cno`;</select>

测试代码如下:

    public void test1nResult() throws IOException {SqlSession sqlSession = BatisUtils.getSqlSessionFactory().openSession(ExecutorType.BATCH);StudentDao dao = sqlSession.getMapper(StudentDao.class);List<StudentEntity> students = dao.getAllStudent2();for (StudentEntity student : students ){System.out.println(student.toString());}}

运行结果如下图所示
在这里插入图片描述

多对多的关系,可以当作两个一对多的关系完成

相关文章:

MyBatis实验(四)——关联查询

前言 多表关联查询是软件开发中最常见的应用场景&#xff0c;多表查询需要将数据实体之间的一对多、多对多、一对一的关系的转换为复杂的数据对象。mybaits提供的association和collection元素&#xff0c;通过映射文件构造复杂实体对象&#xff0c;在构造实体过程中&#xff0…...

Redis与Mysql的数据一致性(双写一致性)

双写一致性&#xff1a;当修改了数据库的数据也要同时的更新缓存的数据&#xff0c;使缓存和数据库的数据要保持一致。 一般是在写数据的时候添加延迟双删的策略 先删缓存 再修改数据 延迟一段时间后再次删除缓存 这种方式其实不是很靠谱 一致性要求高 共享锁&#xff1a;读…...

sql-50练习题16-20

sql-50练习题16-20 前言数据库表结构介绍学生表课程表成绩表教师表 1-6 检索"01"课程分数小于60&#xff0c;按分数降序排列的学生信息1-7 按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩1-8 查询各科成绩最高分、最低分和平均分&#xff1a;以如下形式…...

算法通关村第四关|青铜|自己实现栈

1.自己实现栈——基于数组 top 有的地方指向栈顶元素&#xff0c;有的地方指向栈顶再往上的一个空单位&#xff0c;根据题目要求设计。 *这里将 top 设置为栈顶再往上的一个空单位。 import java.util.Arrays; class Mystack<T> {private Object[] stack;// 指向栈顶…...

Calcite 自定义优化器规则

1&#xff09;总结 1.创建 CSVProjectRule 继承 RelRule<CSVProjectRule.Config> a&#xff09;在 CSVProjectRule.Config 接口中实现匹配规则 Config DEFAULT EMPTY.withOperandSupplier(b0 ->b0.operand(LogicalProject.class).anyInputs()).as(Config.class);b…...

【flink】flink获取-D参数方式

参考官网 一、idea 本地运行 使用Flink官方的ParameterTool或者其他工具都可以。 二、集群运行flink run/run-application &#xff08;1&#xff09;ParameterTool 获取参数 以-D开头的参数&#xff1a; ParameterTool parameter ParameterTool.fromSystemProperties()…...

NLP之多循环神经网络情感分析

文章目录 代码展示代码意图代码解读知识点介绍 代码展示 import pandas as pd import tensorflow as tf# 构建RNN神经网络 tf.random.set_seed(1) df pd.read_csv("../data/Clothing Reviews.csv") print(df.info())df[Review Text] df[Review Text].astype(str) …...

【AutoML】AutoKeras 的安装和环境配置(VSCode)

本地环境中已经有太多的工作配置了&#xff08;Python、Java、Maven、Docker 等等&#xff09;&#xff0c;为了不影响其他环境运行&#xff0c;我选择直接在 VSCode 中创建工作空间并配置好 AutoKeras&#xff08;反正最后也是要在 VSCode 中进行开发的&#xff09;。 打开 V…...

树结构及其算法-用数组来实现二叉树

目录 树结构及其算法-用数组来实现二叉树 C代码 树结构及其算法-用数组来实现二叉树 使用有序的一维数组来表示二叉树&#xff0c;首先可将此二叉树假想成一棵满二叉树&#xff0c;而且第层具有个节点&#xff0c;按序存放在一维数组中。首先来看看使用一维数组建立二叉树的…...

知识图谱与大模型结合方法概述

《Unifying Large Language Models and Knowledge Graphs: A Roadmap》总结了大语言模型和知识图谱融合的三种路线&#xff1a;1&#xff09;KG增强的LLM&#xff0c;可在LLMs的预训练和推理阶段引入KGs&#xff1b;2&#xff09;LLM增强KG&#xff0c;LLM可用于KG构建、KG emb…...

ASO优化之如何制作Google Play的长短描述

应用的描述以及标题和图标是元数据中最关键的元素&#xff0c;可以影响用户是否决定下载我们的应用程序。简短描述的长度限制为80个字符&#xff0c;它提供了更多的有关应用背景信息的机会。 1、简短描述帮助用户快速了解我们应用。 确保内容丰富的同时&#xff0c;保持简洁和…...

Python-platform模块

platform目录 前言一、platform.system()二、platform.release()三、platform.python_version()四、platform.machine()五、platform.python_implementation()六、其他代码示例七、help总结前言 Python platform模块是一个用于获取和操作操作系统相关信息的内置模块。它提供了…...

Yolov5旋转框(斜框)检测自己的数据集,附带代码模型可以收敛

文章目录 1. 制作数据集1.1 标注数据集1.2标签转换1.3 数据集划分2. 环境搭建1.安装nms_rotated2.安装DOTA_devkit3. 代码讲解3.1坐标表示3.2 损失函数4.训练+测试链接后面附上百度网盘链接,内部包含数据集。 下一篇介绍tensorRT部署yolov5-obb 1. 制作数据集 ​ 标注软件为…...

嵌入式应用选择正确的系统设计方法:第三部分

产品质量低下的原因有很多&#xff0c;例如&#xff0c;产品制造粗糙&#xff0c;组件设计不当&#xff0c;架构不佳以及对产品的要求了解不多。点击领取嵌入式物联网学习路线 必须设计质量。 您不能测试出足够的错误来交付高质量的产品。的质量保证&#xff08;QA&#xff09…...

pthread_attr_getstacksize 问题

最近公司里遇到一个线程栈大小的问题&#xff0c;借此机会刚好学习一下这个线程栈大小相关的函数。如果公司里用的还是比较老的代码的话&#xff0c;都是用的 pthread 库支持线程的&#xff0c;而不是 c11 里的线程类。主要有两个相关函数&#xff1a;pthread_attr_setstacksiz…...

anaconda常见语法

anaconda常见语法 一、镜像 1.添加镜像channel conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/2.删除镜像channel conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/3.展示目前已有的镜像…...

reactive与ref VCA

简介 Vue3 最大的一个变动应该就是推出了 CompositionAPI&#xff0c;可以说它受ReactHook 启发而来&#xff1b;它我们编写逻辑更灵活&#xff0c;便于提取公共逻辑&#xff0c;代码的复用率得到了提高&#xff0c;也不用再使用 mixin 担心命名冲突的问题。 ref 与 reactive…...

小程序day01

简介: 小程序项目的基本结构 页面的组成部分 一个页面对应一个文件夹&#xff0c;所有有关的内容都放在一起。 JSON配置文件 2.app.json文件 3.project.config.json文件 4.sitemap.json文件 5.页面的.json配置文件 6. 新建小程序页面 7.修改项目首页 小程序代码构成 小程序的宿…...

redis主要支持的数据类型有哪些?—— 筑梦之路

Redis支持的主要数据类型&#xff1a; 1、字符串&#xff08;String&#xff09;&#xff1a;字符串是最简单的数据结构&#xff0c;可以存储文本或二进制数据。常用操作&#xff1a;设置值、获取值、追加、自增自减等。 2、列表&#xff08;List&#xff09;&#xff1a;列表是…...

解决国际阿里云服务器挂载云盘的问题!!

跟着云计算技术的开展&#xff0c;越来越多的企业和个人挑选运用云服务器。然而&#xff0c;在运用过程中&#xff0c;可能会遇到一些问题&#xff0c;比如云服务器无法挂载云盘。这篇文章将详细说明如何处理这个问题。 一、云服务器无法挂载云盘的原因 云服务器无法挂载云盘可…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...