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 b
        where a.cno = b.cno and
              b.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 bb
          ON 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());
        }
    }

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

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

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

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

相关文章

leetcode 155. 最小栈

2023.10.31 本题关键在于要求在能在常数时间内检索出最小元素。 其他四个方法都可以用普通的栈进行实现&#xff0c;最后一个方法“获取堆栈中最小元素” 可以借助一个新栈&#xff0c;专门用于存储栈中最小值的。具体细节看java代码&#xff1a; class MinStack {private De…

一百九十八、Java——IDEA项目中有参构造、无参构造等快捷键(持续梳理中)

一、目的 由于IDEA项目中有很多快捷键&#xff0c;可以很好的提高开发效率&#xff0c;因此整理一下 二、快捷键 &#xff08;一&#xff09;快捷键生成public static void main(String[] args) {} 快捷键&#xff1a;psvm &#xff08;二&#xff09;快捷键在test中创建cn…

Linux服务器使用GPU技巧

进行深度学习实验的时候用pytorch-gpu&#xff0c;经常要与GPU打交道&#xff1b; 所以经常遇到奇奇怪怪的问题&#xff1b; 查看GPU占用情况 watch -n 10 nvidia-smi 使用技巧 torch.nn.DataParallel() CLASStorch.nn.DataParallel(module, device_idsNone, output_devic…

AntDB数据库荣获 “2023年信创物联网优秀服务商”

日前&#xff0c;在2023世界数字经济大会暨第十三届智博会 2023京甬信创物联网产融对接会上&#xff0c;AntDB数据库再获殊荣&#xff0c;获评“2023年信创物联网优秀服务商”。 图1&#xff1a;2023年信创物联网优秀服务商颁奖现场 信创物联网是信息技术应用创新与物联网的结…

mac录屏快捷键指南,轻松录制屏幕内容!

“大家知道mac电脑有录屏快捷键吗&#xff0c;现在录屏不太方便&#xff0c;每次都花很多时间&#xff0c;要是有录屏快捷键&#xff0c;应该会快速很多&#xff0c;可是哪里都找不到&#xff0c;有人知道吗&#xff1f;帮帮我&#xff01;” 苹果的mac电脑以其精美的设计和卓…

java商城免费搭建 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

波浪理论第3波anzo capital昂首资本3个方法3秒确认

要想通过波浪理论在交易中赚取最大利润&#xff0c;确认第三波必不可少&#xff0c;因为第三波通常是趋势中最大和最强的一波&#xff0c;今天anzo capital昂首资本3个方法3秒确认。 首先&#xff0c;第一个确认方法—斜率。 通常&#xff0c;第三波的斜率会比第一波更陡峭&a…

钡铼技术助力ARM工控机在智慧交通中的创新应用

在交通运输领域&#xff0c;钡铼技术ARM工控机可以实现以下功能&#xff1a; 实时监控和管理&#xff1a;利用钡铼技术ARM工控机&#xff0c;可以对交通运输中的车辆、船只、飞机等进行实时监测和管理&#xff0c;帮助调度员提高车辆调度和路线规划的准确性和效率。 安全保障&…

查看局域网内另外一个电脑屏幕

查看局域网内另外一个电脑屏幕是一个相对简单但实用的技术。在局域网中&#xff0c;我们可以使用远程桌面、网络发现和共享、软件等技术来实现这一目标。 今天重点讲解一下&#xff0c;如何通过域之盾软件来查看另一个电脑屏幕&#xff1a; 1、部署软件&#xff0c;安装提示一…

软件测试优秀的测试工具,会用三款工作效率能提升一半

我们将常用的测试工具分为10类。 1. 测试管理工具 2. 接口测试工具 3. 性能测试工具 4. C/S自动化工具 5.白盒测试工具 6.代码扫描工具 7.持续集成工具 8.网络测试工具 9.app自动化工具 10.web安全测试工具 注&#xff1a;工具排名没有任何意义。 大多数初学者&…

众和策略:微软大动作

当地时间周二&#xff0c;美股首要指数全线收涨。但从月度数据来看&#xff0c;美股首要指数录得“三连跌”&#xff0c;10月份&#xff0c;道指跌1.36%&#xff0c;标普500指数跌2.2%&#xff0c;纳指跌2.78%。其间&#xff0c;标普和道指均为2020年3月以来初次呈现三个月连跌…

Unity 粒子特效-第四集-光球闪烁特效

一、特效预览 二、制作原理 光球素材资源 链接&#xff1a;https://pan.baidu.com/s/1XzWpQU2zX_wupMXSW7RxwA?pwdvu5r 提取码&#xff1a;vu5r 1.素材介绍 仔细看&#xff0c;我们的粒子贴图是&#xff08;如下&#xff09;&#xff0c;一颗球球 2.步骤介绍 1.光球动画的…

Zynq UltraScale+ XCZU5EV 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存DP 输出 5、vivado工程详解PL端FPGA硬件设计…

【设计模式】第25节:行为型模式之“访问者模式”

一、简介 访问者模式允许一个或者多个操作应用到一组对象上&#xff0c;设计意图是解耦操作和对象本身&#xff0c;保持类职责单一、满足开闭原则以及应对代码的复杂性。 二、优点 分离操作和数据结构增加新操作更容易集中化操作 三、适用场景 数据结构稳定&#xff0c;操…

职场好物:乐歌M9S升降办公电脑台,告别久坐办公,升职加薪就选它

办公是现代生活不可避免的组成部分&#xff0c;科技的快速发展&#xff0c;给了我们更多新的生活方式&#xff0c;促使我们更加关注自己的身体状况&#xff0c;我们挨过了饭都吃不饱的年代&#xff0c;随着办公人群的不断扩张&#xff0c;不知道你有没有发现身边人或多或少都有…

光学雨量计:更灵敏可靠、更智能的降雨监测工具

光学雨量计&#xff1a;更灵敏可靠、更智能的降雨监测工具 降雨量信息是评估大气环境和降水研究的关键指标&#xff0c;也是环境监测和农业安全监测的重要参数。目前&#xff0c;我们通常使用翻斗式或光学雨量计来监测降雨量&#xff0c;这些工具能够感知自然界的降雨量&#…

数据智能化管理:企业网站备案信息API的应用案例

引言 在数字化时代&#xff0c;企业备案信息管理变得愈发重要。无论是为了合规性还是提高业务运营效率&#xff0c;企业都需要有效管理其网站备案信息。幸运的是&#xff0c;现代技术为企业提供了强大的工具&#xff0c;如企业网站备案信息API&#xff0c;可帮助他们更智能地管…

pycharm怎么运行python代码

创建项目 在PyCharm中&#xff0c;你可以创建一个项目来组织和管理你的Python代码。项目是一个存放代码文件的文件夹&#xff0c;它可以包含多个模块和包。 启动PyCharm后&#xff0c;选择“Create New Project”来创建一个新项目。 在弹出的对话框中&#xff0c;选择项目的位…

2023年云栖大会来啦!!(2022年就已经深受震撼)

2023云栖大会已经开始啦&#xff0c;让我们来回顾回顾去年的云栖大会吧。 云栖大会是中国阿里巴巴集团每年举办的一项技术盛会&#xff0c;前身可追溯到2009年的地方网站峰会&#xff0c;2011年演变为阿里云开发者大会&#xff0c;2015年正式更名为“云栖大会”&#xff0c;并且…

英语——歌曲篇——500 Miles(离家五百里)

乡村音乐&#xff08;country music&#xff09;《500 Miles(离家五百里)》以一种怀乡、寻根 的意识&#xff0c;用思念留住时光还有一点哲理的味道&#xff0c;乡村音乐多年以来都不曾淡出大家的视野&#xff0c;确实有值得留恋的情怀。 500 Miles [The Brothers Four离家五…