Mybatis 多对一的处理

8. 多对一的处理

多对一的理解:

  • 多个学生对应一个老师
  • 如果对于学生这边,就是一个多对一的现象,即从学生这边关联一个老师!

8.1. 数据库的设计

CREATE TABLE `teacher` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO teacher(`id`, `name`) VALUES (1, '秦老师'); CREATE TABLE `student` (`id` INT(10) NOT NULL,`name` VARCHAR(30) DEFAULT NULL,`tid` INT(10) DEFAULT NULL,PRIMARY KEY (`id`),KEY `fktid` (`tid`),CONSTRAINT `fktid` FOREIGN KEY (`tid`) REFERENCES `teacher` (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('1', '小明', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('2', '小红', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('3', '小张', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('4', '小李', '1'); 
INSERT INTO `student` (`id`, `name`, `tid`) VALUES ('5', '小王', '1');

8.2. 搭建测试环境

【Lombok的使用】

  1. IDEA安装Lombok插件
  2. 引入Maven依赖
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.10</version>
</dependency>

在代码中增加注解

 @Data //GET,SET,ToString,有参,无参构造
public class Student {private int id;private String name;private int tid;private Teacher teacher;
}
 @Data //GET,SET,ToString,有参,无参构造public class Teacher {private int id;private String name;}

编写实体类对应的Mapper接口 【两个】

    • 无论有没有需求,都应该写上,以备后来之需!
public interface StudentMapper {
}
public interface TeacherMapper {
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.mapper.StudentMapper"></mapper>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.mapper.TeacherMapper"></mapper>

8.3. 按查询嵌套处理

  1. 给StudentMapper接口增加方法
//获取所有学生及对应老师的信息
public List<Student> getStudents();
  1. 编写对应的Mapper文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.mapper.StudentMapper"><!--需求:获取所有学生及对应老师的信息思路:1. 获取所有学生的信息2. 根据获取的学生信息的老师ID->获取该老师的信息3. 思考问题,这样学生的结果集中应该包含老师,该如何处理呢,数据库中我们一般使用关联查询?1. 做一个结果集映射:StudentTeacher2. StudentTeacher结果集的类型为 Student3. 学生中老师的属性为teacher,对应数据库中为tid。多个 [1,...)学生关联一个老师=> 一对一,一对多4. 查看官网找到:association – 一个复杂类型的关联;使用它来处理关联查询--><select id="getStudents" resultMap="StudentTeacher">select * from student</select><resultMap id="StudentTeacher" type="Student"><!--association关联属性  property属性名 javaType属性类型 column在多的一方的表中的列名--><association property="teacher"  column="tid" javaType="Teacher" select="getTeacher"/></resultMap><!--这里传递过来的id,只有一个属性的时候,下面可以写任何值association中column多参数配置:column="{key=value,key=value}"其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的字段名。--><select id="getTeacher" resultType="teacher">select * from teacher where id = #{id}</select></mapper>
  1. 编写完毕去Mybatis配置文件中,注册Mapper!
  2. 注意点说明:
<resultMap id="StudentTeacher" type="Student"><!--association关联属性  property属性名 javaType属性类型 column在多的一方的表中的列名--><association property="teacher"  column="{id=tid,name=tid}" javaType="Teacher" select="getTeacher"/>
</resultMap>
<!--
这里传递过来的id,只有一个属性的时候,下面可以写任何值
association中column多参数配置:
column="{key=value,key=value}"
其实就是键值对的形式,key是传给下个sql的取值名称,value是片段一中sql查询的字段名。
-->
<select id="getTeacher" resultType="teacher">select * from teacher where id = #{id} and name = #{name}
</select>
  1. 测试
@Test
public void testGetStudents(){SqlSession session = MybatisUtils.getSession();StudentMapper mapper = session.getMapper(StudentMapper.class);List<Student> students = mapper.getStudents();for (Student student : students){System.out.println("学生名:"+ student.getName()+"\t老师:"+student.getTeacher().getName());}
}

8.4. 按结果嵌套处理

除了上面这种方式,还有其他思路吗?

我们还可以按照结果进行嵌套处理;

  1. 除了上面这种方式,还有其他思路吗?

我们还可以按照结果进行嵌套处理;

  1. 接口方法编写
public List<Student> getStudents2();
  1. 编写对应的mapper文件
<!--
按查询结果嵌套处理
思路:
1. 直接查询出结果,进行结果集的映射
-->
<select id="getStudents2" resultMap="StudentTeacher2" >select s.id sid, s.name sname , t.name tnamefrom student s,teacher twhere s.tid = t.id
</select><resultMap id="StudentTeacher2" type="Student"><id property="id" column="sid"/><result property="name" column="sname"/><!--关联对象property 关联对象在Student实体类中的属性--><association property="teacher" javaType="Teacher"><result property="name" column="tname"/></association>
</resultMap>
  1. 去mybatis-config文件中注入【此处应该处理过了】
  2. 测试
@Test
public void testGetStudents2(){SqlSession session = MybatisUtils.getSession();StudentMapper mapper = session.getMapper(StudentMapper.class);List<Student> students = mapper.getStudents2();for (Student student : students){System.out.println("学生名:"+ student.getName()+"\t老师:"+student.getTeacher().getName());}
}

8.5. 小结

  • 按照查询进行嵌套处理就像SQL中的子查询
  • 按照结果进行嵌套处理就像SQL中的联表查询

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

《Structure-from-Motion Revisited》论文解析——COLMAP

一、论文简介 这篇论文的标题是《Structure-from-Motion Revisited》&#xff0c;作者是Johannes L. Schnberger和Jan-Michael Frahm&#xff0c;分别来自北卡罗来纳大学教堂山分校和苏黎世联邦理工学院。这篇论文主要讨论了一种新的增量式结构从运动&#xff08;Structure-fro…

渑池县中药材产业党委莅临河南广宇企业管理集团有限公司参观交流

11月14日&#xff0c;渑池县人大副主任、工商联主席杨航率县中药材产业党委代表团一行13人&#xff0c;莅临河南广宇集团参观交流。河南广宇集团总经理王峰、副总经理王培等领导热情接待并陪同参观、座谈。 代表团一行首先参观了集团旗下郑州美信中医院&#xff08;庚贤堂中医药…

Cherno OpenGL(18 ~ 24)

混合 默认情况下 OpenGL 不执行任何混合&#xff0c;它只需要你们渲染的东西&#xff0c;然后把它渲染成不透明的东西。 之前我们渲染了红色方块&#xff0c;在它上面我们以某种形式渲染了一个半透明的蓝色方块&#xff08;不透明的蓝色方块会直接覆盖红色方块&#xff09;&am…

HashMap源码分析下

HashMap 环境 JDK11 HashMap是用哈希表结构&#xff08;链表散列&#xff1a;数组链表&#xff09;实现&#xff0c;结合数组和链表的优点。扩容时当链表长度超过 6 时&#xff0c;链表转换为红黑树。 public class HashMap<K,V> extends AbstractMap<K,V>impleme…

【Golang】——Gin 框架简介与安装

文章目录 1. Gin 框架概述1.1 什么是 Gin 框架&#xff1f;1.2 为什么选择 Gin&#xff1f;1.3 使用场景 2. 安装 Go 与 Gin 框架2.1 安装 Go 语言环境2.2 初始化 Go 项目2.3 安装 Gin 框架 3. 编写第一个 Gin 应用3.1 Gin 最小化示例代码代码解读3.2 运行程序3.3 测试服务 4. …

南京邮电大学《智能控制技术》期末抢救(上)

一、智能控制的提出 传统控制方法包括经典控制和现代控制——基于被控对象精确模型的控制方式&#xff0c;缺乏灵活性和应变能力&#xff0c;适于解决线性、时不变性等相对简单的控制问题。传统控制方法在实际应用中遇到很多难解决的问题&#xff0c;主要表现以下几点&#xff…

系统设计-系统回调通知设计

系统回调通知设计 消息类型容错机制消息协议负载均衡监控&告警很多公司的架构都存在与外界系统有交互,交互难免会有一些同步请求、回调通知等。且公司一般网络的出入口都是只有一个,而各个业务条线只要存在和外界系统有业务往来,都会存在回调通知,所以可以设计一个公司…

Seatunnel2.3.5的FTP无法读取中文路径的问题

问题原因 Seatunnel的connector-file下的ftp包中关于读取文件的路径没有对路径进行编码导致当有中文的时候会出现乱码 修改源码 我们需要修改两处位置 一处是判断路径是否存在的方法 一处是读取文件的流的地方 修改判断文件是否存在的地方 这个文件的路径是org/apache/sea…

基于java的果蔬种植销售一体化服务平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

【云岚到家】-day10-1-状态机增删查

【云岚到家】-day10-1-状态机增删查 1 订单管理1&#xff09;订单管理管什么&#xff1f; 2 基础设计2.1 订单状态流转1&#xff09;订单状态流转图2&#xff09;订单状态3&#xff09;服务单状态 2.2 数据库设计1&#xff09;表设计2&#xff09;分库分表 2.3 状态机设计1&…

ICML24|通用时间序列预测大模型思路

论文标题&#xff1a;Unified Training of Universal Time Series Forecasting Transformers GitHub链接&#xff1a;https://github. com/SalesforceAIResearch/uni2ts 论文链接&#xff1a;https://arxiv.org/pdf/2402.02592 前言 普适预测器是一个能够处理任何时间序列预…

LRU(Least Recently Used,最近未使用)

一、LRU的由来 lru的引入主要是和内存回收有关。 属于内核的大部分page是不能够进行回收的&#xff0c;比如内核栈、内核代码段、内核数据段以及大部分内核使用的page&#xff0c;它们都是不能够进行回收的&#xff1b; 相反&#xff0c;进程使用的page&#xff0c;比如进程…

网盘聚合搜索项目Aipan(爱盼)

本文软件由网友 刘源 推荐&#xff1b; 简介 什么是 Aipan&#xff08;爱盼&#xff09; ? Aipan&#xff08;爱盼&#xff09;是一个基于 Vue 和 Nuxt.js 技术构建的开源网盘搜索项目。其主要目标是为用户提供一个能够自主拥有和管理的网盘搜索网站。该项目持续维护和更新&a…

i春秋-Hash(__wakeup沉默、序列化)

练习平台地址 竞赛中心 题目描述 题目内容 啥也没有就一个标签跳转 点击后的确发生了跳转 观察到url中有key和hash两个值&#xff0c;猜测hash是key的hash 查看源代码发现确实是 $hashmd5($sign.$key);the length of $sign is 8 解密得到$sign应该为kkkkkk01 构造122的hash i…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的智能蒙绮英语学习系统设计与实现

开题报告 随着全球化的不断深入&#xff0c;英语作为国际通用语言&#xff0c;其重要性日益凸显。掌握英语不仅可以拓宽个人的视野和知识面&#xff0c;还可以增强个人竞争力&#xff0c;为个人职业发展带来更多机会。因此&#xff0c;开发一款能够帮助用户更高效地学习英文单…

Blender vs 3dMax谁才是3D软件的未来?

在探讨Blender与3ds Max谁才是3D软件的未来时&#xff0c;我们需要从多个维度对这两款软件进行详细分析。 Blender的优势 开源免费&#xff1a;Blender是一款完全免费的开源3D创作套件&#xff0c;这使得它成为独立艺术家、业余爱好者和小型工作室的首选。用户无需承担巨额的…

ubuntu安装cuda、cudnn和TensoRT【分步安装】

我说实话&#xff0c;这个环境安装真的要了老命&#xff0c;太tm恶心了。 因为遇到了很多问题&#xff0c;非常之恶心 问题一&#xff1a;版本对应 问题二&#xff1a;下载具慢 问题三&#xff1a;上NVIDIA有时候上不去 问题四&#xff1a;找到对应版本点不了 问题五&…

基于树莓派的边缘端 AI 目标检测、目标跟踪、姿态估计 视频分析推理 加速方案:Hailo with ultralytics YOLOv8 YOLOv11

文件大纲 加速原理硬件安装软件安装基本设置系统升级docker 方案Demo 测试目标检测姿态估计视频分析参考文献前序树莓派文章hailo加速原理 Hailo 发布的 Raspberry Pi AI kit 加速原理,有几篇文章介绍的不错 https://ubuntu.com/blog/hackers-guide-to-the-raspberry-pi-ai-ki…

网络工程实验一:静态路由的配置

#实验仅供参考&#xff0c;勿直接粘贴复制&#xff0c;用以学习交流# 1、实验目的&#xff1a; 熟悉eNSP网络仿真工具平台。 掌握静态路由配置方法。 能够配置路由器接口地址。 2、实验内容&#xff1a; 2.1、安装对应的软件&#xff1a; &#xff08;1&#xff09;Virtual …