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

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

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

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

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

相关文章

Qt:删除QWidget中的所有布局和组件

技术要点&#xff1a; 1、调用QWidget::layout()可获取组件的布局&#xff1b; 2、QLayout::count() 可获取布局内的子项数量&#xff0c;包括子布局和子组件&#xff1b; 3、QLayout::itemAt(int index) 可根据索引获取相应的子项&#xff1b; 4、QLayout::removeWidget(Q…

手机通讯类、ip查询、智能核验、生活常用API接口推荐

手机通讯类 手机号码归属地&#xff1a;提供三大运营商的手机号码归属地查询。 空号检测&#xff1a;通过手机号码查询其在网活跃度&#xff0c;返回包括空号、停机等状态。 手机在网状态&#xff1a;支持传入三大运营商的号码&#xff0c;查询手机号在网状态&#xff0c;返…

linux mysql 创建数据库并配置用户远程管理

要在Linux上创建MySQL数据库并配置用户以实现远程管理&#xff0c;您可以执行以下步骤&#xff1a; 1. 登录到MySQL服务器&#xff1a; 在您的Linux终端中&#xff0c;使用以下命令登录到MySQL服务器。您需要提供MySQL服务器的用户名和密码。 mysql -u root -p 输入密码后&a…

几种软件开发方法对比

几种软件开发方法对比 1 综述 软件开发方法是一种使用早已定义好的技术集及符号表示习惯来组织软件生产的过程。 本文对净室方法、结构化方法、面向对象方法、原型法、逆向工程等方法进行梳理&#xff0c;并对各种开发方法特点、优点进行对比。 2 净室方法 2.1 特点 净…

asp.net旅游交流管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 旅游交流管理信息系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net旅游交流网站1 应用技…

学术生活|如何有效参与学术会议

参与学术会议是研究生展示自己、提高学术能力、拓展人脉关系的重要途径。拟参会者可以从研究参加人员名单&#xff0c;找共同点&#xff0c;平等地与大佬展开交流。进行有用的学术社交需要真诚、多积累个人学术作品和发表&#xff0c;并不要仅仅加微信。这些经验将帮助学者更好…

阿里云的OSS云存储的基本使用

阿里云官网&#xff1a;阿里云-计算&#xff0c;为了无法计算的价值 通过阿里云官网&#xff0c;登录进入用户的界面&#xff0c;在搜索框中输入OSS&#xff0c;然后进入阿里云的对象存储OSS的控制台。&#xff08;未开通的开通即可&#xff09; 创建 Bucket 点击【Bucket 列…

Product owner的职责

Product owner就是产品的负责人。Product owner的职责就是使Scrum团队创造增量能够实现产品价值最大化。那么Product owner该如何做呢&#xff1f;作为Scrum团队的一员&#xff0c;他&#xff08;她&#xff09;要为团队提供清晰的产品信息&#xff0c;如产品的愿景、目标。当然…

执行source命令显示 command not found

1&#xff09;修改完成/etc/profile&#xff0c;使其生效 source /etc/profile -提示找不到命令 试试&#xff1a;A&#xff09;locate source /etc/profile 试试&#xff1a;B&#xff09;usr/bin/source /etc/profile 也就是source命令无法识别而已&#xff0c;至…

4.数据库的基本操作

1.创建数据库 系统安装完成后会有部分默认数据库存在: 注意&#xff1a;mysql的语句每一个输入完后要有分号才能写下一个 这初始的四个库不要删除 其中:mysql数据库中存储用户访问权限。 创建自己的数据库命令如下: create database database_name&#xff08;数据库名字&am…

Stable Diffusion系列(二):ControlNet基础控件介绍

文章目录 线稿提取类Canny&#xff1a;边缘检测SoftEdge&#xff1a;软边缘检测Lineart&#xff1a;精细线稿提取Scribble/Sketch&#xff1a;涂鸦提取MLSD&#xff1a;建筑领域的线条提取 3D提取类Normal map&#xff1a;法线贴图Depth&#xff1a;深度计算Segmentation&#…

linux 出现Access-Your-Private-Data.desktop README.txt

参考:https://blog.csdn.net/h66295112/article/details/81085643 参考:https://askubuntu.com/questions/71708/how-do-i-open-access-your-private-data-desktop 原因应该是通过terminal修改了ubuntu密码&#xff0c;然后重启 THIS DIRECTORY HAS BEEN UNMOUNTED TO PROTECT…

Nginx 部署多个安全域名,多个服务【工作记录】

以下是本人通过Docker 部署的Nginx挂载出来的文件目录 先看下 nginx.conf 配置文件内容&#xff1a;如下 ps&#xff1a;当前文件就是安装后的初始内容&#xff0c;无修改。主要关注最后一行 include /etc/nginx/conf.d/*.conf;表示引入其他目录下的.conf配置文件&#xff1b;…

在线数据库关系图设计工具,选Itbuilder

一旦数据库超出了人类可消化的大小&#xff0c;使用关系图工具来辅助其设计就变得至关重要。创建数据库听起来像是一个复杂的过程&#xff0c;但使用现代数据库图表工具&#xff0c;情况并非如此。 itbuilder在线数据库设计工具使用户可以创建和导入数据库关系图以查看数据库对…

【Java笔试强训】Day8(WY20 两种排序方法、HJ108 求最小公倍数)

WY20 两种排序方法 链接&#xff1a;两种排序方法 题目&#xff1a; 考拉有n个字符串字符串&#xff0c;任意两个字符串长度都是不同的。考拉最近学习到有两种字符串的排序方法&#xff1a; 1.根据字符串的字典序排序。例如&#xff1a; “car” < “carriage” < “c…

如何与极星Polestar建立 EDI连接?

Polestar是一家总部位于瑞典的电动汽车制造商&#xff0c;是沃尔沃汽车集团&#xff08;Volvo Car Group&#xff09;的子公司。Polestar专注于开发和制造高性能电动汽车&#xff0c;并在可持续性、创新和技术方面进行了重点投资。他们的目标是推动电动汽车市场的发展&#xff…

网络协议--TCP的超时与重传

21.1 引言 TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认&#xff0c;它就重传该数据。对任何实现而言&#xff0c;关键之处就在于超时和重…

Matplotlib教程(非常详细)(第一部分)

Matplotlib是一款免费开源的Python数据可视化工具。 Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一&#xff0c;支持跨平台运行&#xff0c;它是 Python 常用的 2D 绘图库&#xff0c;同时它也提供了一部分 3D 绘图接口。Matplotlib 通常与 NumPy、Pandas 一起使用&…

Go语言入门-函数

函数 函数的声明 在Go语言中&#xff0c;函数的声明方式有以下几种&#xff1a; 普通函数声明 普通函数声明是最基本的函数声明方式&#xff0c;它的语法如下&#xff1a; func 函数名(参数列表) 返回值类型 {// 函数体 }其中&#xff0c;参数列表可以是零个或多个参数&am…

【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介

&#x1f389;&#x1f389;&#x1f389; 欢迎各位来到小白 p i a o 的学习空间&#xff01; \color{red}{欢迎各位来到小白piao的学习空间&#xff01;} 欢迎各位来到小白piao的学习空间&#xff01;&#x1f389;&#x1f389;&#x1f389; &#x1f496; C\Python所有的入…