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

mybatis的多对一、一对多的用法

目录

1、使用VO聚合对象(可以解决这两种情况)

多对一:

一对多:

2、非聚合的多对一做法:

3、非聚合的一对多做法:


1、使用VO聚合对象(可以解决这两种情况)

当我需要多对一、一对多时,可以创建VO聚合对象。

例如:学生类和老师类,会出现多对一、一对多的情况。此时创建一个聚合类,里面包含所需要的学生类和老师类的属性。并先查询出前面的内容,再根据前面的内容查询出后面的内容。

多对一:

数据库设计,学生表中有一个tid来匹配老师id:

 

在学生类和老师类后,再创建出一个聚合类:

@Data
public class Student {private Integer id;private String username;private Integer tid;
}
@Data
public class Teacher {private Integer id;private String username;
}
@Data
public class StudentAndTeacher {private Integer id;private String username;private Teacher teacher;
}

写出查询所有学生和根据学生类里的tid查询老师: 

@Mapper
public interface AllMapper {List<Student> AllStudent();Teacher AllTeacherByTid(Integer tid);
}
    <select id="AllStudent" resultType="com.example.demo.entity.Student">select * from student;</select><select id="AllTeacherByTid" resultType="com.example.demo.entity.Teacher">select * from teacher where id=#{tid};</select>

通过聚合类,把这两个查询到的内容聚合到一起:

    @Testpublic void AllStudent() {List<Student> students = allMapper.AllStudent();for (Student student : students) {StudentAndTeacher studentAndTeacher = new StudentAndTeacher();studentAndTeacher.setId(student.getId());studentAndTeacher.setUsername(student.getUsername());studentAndTeacher.setTeacher(allMapper.AllTeacherByTid(student.getTid()));System.out.println(studentAndTeacher);}}

结果如下:

一对多:

学生类和老师类一样,但是聚合类不一样,因为现在的主体是老师,而不是学生。

@Data
public class Student {private Integer id;private String username;private Integer tid;
}
@Data
public class Teacher {private Integer id;private String username;
}
@Data
public class TeacherAndStudent {private Integer id;private String username;private List<Student> studentList;
}

写出查询所有老师和根据老师的id去学生表里查对应tid的学生: 

@Mapper
public interface AllMapper {List<Teacher> AllTeacher();List<Student> AllStudentById(Integer id);
}
    <select id="AllTeacher" resultType="com.example.demo.entity.Teacher">select * from teacher;</select><select id="AllStudentById" resultType="com.example.demo.entity.Student">select * from student where tid=#{id};</select>

通过聚合类,把这两个查询到的内容聚合到一起:

    @Testpublic void AllTeacher() {List<Teacher> Teachers = allMapper.AllTeacher();for (Teacher teacher : Teachers) {List<Student> students = allMapper.AllStudentById(teacher.getId());TeacherAndStudent studentAndTeacher = new TeacherAndStudent();studentAndTeacher.setId(teacher.getId());studentAndTeacher.setUsername(teacher.getUsername());studentAndTeacher.setStudentList(students);System.out.println(studentAndTeacher);}}

结果如下:

2、非聚合的多对一做法:

知识点:association标签是用在多对一时,当一个类中有其他类作为该类的属性时,要用到这个标签。

此时的Student类中有一个属性是Teacher类:

@Data
public class Student {private Integer id;private String username;private Teacher teacher;
}
@Data
public class Teacher {private Integer id;private String username;
}
@Mapper
public interface AllMapper {List<Student> AllStudent();
}

这里用resultMap来匹配。 

要注意两点:

1、result 标签里的property对应的是java类的属性名,column对应的是select 标签里查询出来的字段名。并且要注意,若多个表的字段名相同,必须要用别名区分,并在column中写上别名而非字段名。

2、association 标签中,property对应的是Student类中的teacher属性,类型为Student类,这里的类型用javaType而不是Type。

    <select id="AllStudent" resultMap="StudentAndTeacher">select s.id sid, s.username susername, t.id tid, t.username tusernamefrom student s, teacher twhere s.tid = t.id;</select><resultMap id="StudentAndTeacher" type="com.example.demo.entity.Student"><result property="id" column="sid"></result><result property="username" column="susername"></result><association property="teacher" javaType="com.example.demo.entity.Teacher"><result property="id" column="tid"></result><result property="username" column="tusername"></result></association></resultMap>
 @Testpublic void StudentAndTeacher() {List<Student> students = allMapper.AllStudent();for (Student student : students) {System.out.println(student);}}

结果如下:

3、非聚合的一对多做法:

知识点:collection标签是用在一对多时,当一个类中有其他类集合作为该类的属性时,要用到这个标签。

此时的Teacher类中有一个属性是List<Student>:

@Data
public class Student {private Integer id;private String username;private Integer tid;
}
@Data
public class Teacher {private Integer id;private String username;private List<Student> students;
}
@Mapper
public interface AllMapper {List<Teacher> AllTeacher();
}

这里用resultMap来匹配。 

要注意两点:

1、result 标签里的property对应的是java类的属性名,column对应的是select 标签里查询出来的字段名。并且要注意,若多个表的字段名相同,必须要用别名区分,并在column中写上别名而非字段名。

2、collection标签中,property对应的是Teacher类中的students属性,类型为List,这里的类型用javaType而不是Type,ofType指的是List的泛型。

    <select id="AllTeacher" resultMap="TeacherAndStudent">select s.id sid, s.username susername, s.tid stid, t.id tid, t.username tusernamefrom student s, teacher twhere s.tid = t.id;</select><resultMap id="TeacherAndStudent" type="com.example.demo.entity.Teacher"><result property="id" column="tid"></result><result property="username" column="tusername"></result><collection property="students" javaType="List"        ofType="com.example.demo.entity.Student"><result property="id" column="sid"></result><result property="username" column="susername"></result><result property="tid" column="stid"></result></collection></resultMap>
    @Testpublic void StudentAndTeacher() {List<Teacher> teachers = allMapper.AllTeacher();for (Teacher teacher : teachers) {System.out.println(teacher);}}

此时结果:

相关文章:

mybatis的多对一、一对多的用法

目录 1、使用VO聚合对象&#xff08;可以解决这两种情况&#xff09; 多对一&#xff1a; 一对多&#xff1a; 2、非聚合的多对一做法&#xff1a; 3、非聚合的一对多做法&#xff1a; 1、使用VO聚合对象&#xff08;可以解决这两种情况&#xff09; 当我需要多对一、一对…...

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言&#xff1a;在当今数字化时代&#xff0c;分布式系统和大数据处理变得愈发普遍&#xff0c;消息队列作为其中的关键组件&#xff0c;承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…...

前端发送Ajax请求的技术Axios

目录 1.引入Axios文件 2.使用Axios发送请求 2.1请求方法的别名 请求的URL地址怎么来的&#xff1f; 后端实现 前后端交互 1.引入Axios文件 <script src"https://unpkg.com/axios/dist/axios.min.js"></script> 2.使用Axios发送请求 2.1请求方法的…...

第17章:Python TDD回顾与总结货币类开发

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

opencv_KDTree_搜索介绍及示例

cv::flann::KDTreeIndexParams 说明&#xff0c;使用&#xff1f; cv::flann::KDTreeIndexParams 是 OpenCV 中用于配置 KD 树&#xff08;K-Dimensional Tree&#xff09;索引参数的类。KD 树是一种用于多维空间中的点搜索的数据结构&#xff0c;常用于最近邻搜索等问题。在…...

Windows 上安装 MongoDB 的 zip 包

博主介绍&#xff1a; 大家好&#xff0c;我是想成为Super的Yuperman&#xff0c;互联网宇宙厂经验&#xff0c;17年医疗健康行业的码拉松奔跑者&#xff0c;曾担任技术专家、架构师、研发总监负责和主导多个应用架构。 近期专注&#xff1a; RPA应用研究&#xff0c;主流厂商产…...

先进制造aps专题二十七 西门子opcenter aps架构分析

欧美的商业aps&#xff0c;主要就是sap apo,西门子opcenter aps,达索quintiq 从技术的层面&#xff0c;西门子aps是不如sap apo的&#xff0c;但是西门子aps是西门子数字化工厂产品的核心&#xff0c;有很多特色&#xff0c;所以分析 西门子aps主要分计划器和排产器两个部分 计…...

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…...

机器学习——什么是代价函数?

1.代价函数的定义 首先,提到代价函数是估计值和实际值的差,这应该是指预测值和真实值之间的差异,用来衡量模型的好坏。 在一元线性模型中,模型是直线,有两个参数,可能是斜率和截距。 通过调整这两个参数,让代价函数最小,这应该是说我们要找到最佳的斜率和截距,使得预测…...

docker 部署 MantisBT

1. docker 安装MantisBT docker pull vimagick/mantisbt:latest 2.先运行实例&#xff0c;复制配置文件 docker run -p 8084:80 --name mantisbt -d vimagick/mantisbt:latest 3. 复制所需要配置文件到本地路径 docker cp mantisbt:/var/www/html/config/config_inc.php.…...

02内存结构篇(D1_自动内存管理)

目录 一、内存管理 1. C/C程序员 2. Java程序员 二、运行时数据区 1. 程序计数器 2. Java虚拟机栈 3. 本地方法栈 4. Java堆 5. 方法区 运行时常量池 三、Hotspot运行时数据区 四、分配JVM内存空间 分配堆的大小 分配方法区的大小 分配线程空间的大小 一、内存管…...

Centos 8 交换空间管理

新增swap 要增加 Linux 系统的交换空间&#xff0c;可以按照以下步骤操作&#xff1a; 1. 创建一个交换文件 首先&#xff0c;选择文件路径和大小&#xff08;例如&#xff0c;增加 1 GB 交换空间&#xff09;。 sudo fallocate -l 1G /swapfile如果 fallocate 不可用&…...

“深入浅出”系列之数通篇:(5)TCP的三次握手和四次挥手

TCP&#xff08;传输控制协议&#xff09;的三次握手和四次挥手是TCP连接建立和释放的过程。 一、TCP三次握手 TCP三次握手是为了建立可靠的连接&#xff0c;确保客户端和服务器之间的通信能力。具体过程如下&#xff1a; 第一次握手&#xff1a;客户端向服务器发送一个带有…...

接口测试及接口测试常用的工具

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xff…...

使用rpc绕过咸鱼sign校验

案例网站是咸鱼 找到加密函数i()&#xff0c;发现参数是由token时间戳appkeydata构成的 js客户端服务 考虑到网站可能有判断时间戳长短而让请求包失效的可能&#xff0c;我们请求包就直接用它的方法生成 下面我们先把token和h置为键值对tjh123 再把方法i()设为全局变量my_…...

NPC与AI深度融合结合雷鸟X3Pro AR智能眼镜:引领游戏行业沉浸式与增强现实新纪元的畅想

if… NPC&#xff08;非玩家角色&#xff09;与AI&#xff08;人工智能&#xff09;的深度融合&#xff0c;正引领游戏行业迈向一个全新的沉浸式与增强现实&#xff08;AR&#xff09;相结合的新时代。这一创新不仅预示着游戏体验的质变&#xff0c;更可能全面革新游戏设计与叙…...

【物联网】ARM核介绍

文章目录 一、芯片产业链1. CPU核(1)ARM(2)MIPS(3)PowerPc(4)Intel(5)RISC-V 2. SOC芯片(1)主流厂家(2)产品解决方案 3. 产品 二、ARM核发展1. 不同架构的特点分析(1)VFP(2)Jazelle(3)Thumb(4)TrustZone(5)SIMD(6)NEON 三、ARM核(ARMv7)工作模式1. 权限级别(privilege level)2.…...

Android系统定制APP开发_如何对应用进行系统签名

前言 当项目开发需要使用系统级别权限或frame层某些api时&#xff0c;普通应用是无法使用的&#xff0c;需要在AndroidManifest中配置sharedUserId&#xff1a; AndroidManifest.xml中的android:sharedUserId“android.uid.system”&#xff0c;代表的意思是和系统相同的uid&a…...

Tesla Free-Fall Attack:特斯拉汽车网络安全事件纪要

Tesla Free-Fall Attack&#xff1a;特斯拉汽车网络安全事件纪要 1. 引言 Tesla Free-Fall Attack 是由腾讯科恩实验室&#xff08;Tencent Keen Security Lab&#xff09;于2016年9月对特斯拉Model S汽车实施的一次远程攻击事件&#xff0c;揭示了汽车网络安全的严重漏洞&am…...

网络安全工程师学习路线

https://www.processon.com/view/link/6584f06465b7eb6189e99508 1、HTML基本语言 常用标签、表单、上传页面、登录页面、超链接2、javascript基本语法 变量、函数、流程控制语法、post请求、ajax请求、输入数据到页面、文件上传3、mysql基本用法 增删改查 infromation_sch…...

别再手动写矩阵了!用Eigen库提升你的C++数值计算效率(性能对比实测)

别再手动写矩阵了&#xff01;用Eigen库提升你的C数值计算效率&#xff08;性能对比实测&#xff09; 在科学计算和工程仿真领域&#xff0c;矩阵运算如同空气般无处不在。从计算机视觉中的三维重建到金融工程里的蒙特卡洛模拟&#xff0c;开发者们每天都在与各种规模的矩阵打交…...

OpenClaw学习总结_IV_认证与安全_3:Authorization与Policies详解

IV. 认证与安全 - 3. Authorization 与 Policies &#x1f4cd; 课程位置 阶段&#xff1a;IV. 认证与安全 课序&#xff1a;第 3 课 前置知识&#xff1a;IV-2. Authentication 后续课程&#xff1a;IV-4. Multi-Account Patterns&#x1f3af; 本课核心问题&#xff08;你不懂…...

告别AD转Cadence的迷茫:OrCAD Capture CIS 16.6新建工程与环境设置保姆级指南

告别AD转Cadence的迷茫&#xff1a;OrCAD Capture CIS 16.6新建工程与环境设置保姆级指南 从Altium Designer切换到Cadence OrCAD&#xff0c;就像从自动挡汽车换到手动挡——虽然最终目的地相同&#xff0c;但操作方式截然不同。我至今记得第一次打开OrCAD时那种无处下手的窘迫…...

Ubuntu 24.04 上Ollama的部署、模型管理与服务化实战

1. 为什么选择Ollama搭建本地LLM环境 最近两年&#xff0c;大型语言模型&#xff08;LLM&#xff09;的火爆程度有目共睹。但很多开发者遇到一个现实问题&#xff1a;云端API不仅费用高&#xff0c;还存在数据隐私和响应延迟的困扰。这时候Ollama就像及时雨一样出现了——这个不…...

【医疗数据挖掘黄金流程】:20年临床统计专家亲授R语言6步标准化建模法(附NIH验证模板)

第一章&#xff1a;医疗数据挖掘的临床价值与R语言选型依据医疗数据挖掘正深刻重塑临床决策范式。从电子健康档案&#xff08;EHR&#xff09;中提取隐含模式&#xff0c;可辅助早期疾病预警、个性化治疗路径推荐及药物不良反应监测。例如&#xff0c;在糖尿病管理中&#xff0…...

别只用AI写脚本了,现在AI打广告可真是城会玩了!

金磊 发自 凹非寺量子位 | 公众号 QbitAI咱就是说啊&#xff0c;现在的广告可真是城会玩了——像下面这个再正常不过的短视频剧情&#xff0c;当镜头切到宝宝喝牛乳的时候&#xff0c;啪的一下&#xff0c;左下角就精准弹出了奶粉广子&#xff1a;以为这是人为提前设置好的&…...

GD32F103C8T6上跑FreeRTOS:保姆级移植教程,从源码下载到LED闪烁测试

GD32F103C8T6移植FreeRTOS实战指南&#xff1a;从零构建实时操作系统 第一次拿到GD32开发板时&#xff0c;我盯着这块"国产STM32"看了半天——引脚兼容、外设相似&#xff0c;但真要把成熟的FreeRTOS移植上去&#xff0c;还是遇到了不少坑。本文将用最接地气的方式&a…...

AXI基础知识学习

1、AXI通道主从之间5个通信通道&#xff1a;写操作使用如下通道&#xff1a;&#xff08;1&#xff09;主——>从&#xff0c;主使用AW通道发送写地址&#xff0c;主使用W通道发送数据&#xff1b;&#xff08;2&#xff09;从——>主&#xff0c;写操作完成之后&#xf…...

如何在TI-28388 DSP的CM核上快速搭建freeRTOS环境(附LED控制实战)

在TI-28388 DSP的CM核上构建freeRTOS开发环境的完整指南 1. 环境准备与硬件配置 在开始freeRTOS移植之前&#xff0c;我们需要确保开发环境配置正确。TI-28388 DSP是一款多核处理器&#xff0c;包含两个C28x核和一个ARM Cortex-M4核&#xff08;CM核&#xff09;。我们将专注于…...

企业级OpenClaw集中部署安全架构避坑全攻略

只需1小时全链路加固&#xff0c;让OpenClaw稳定上线、合规无忧 在一次大型制造业项目中&#xff0c;某金融客户耗时三个月完成OpenClaw功能对接&#xff0c;却因忽略安全配置&#xff0c;半天内被黑客扫光知识库、篡改AI流程&#xff0c;直接触发合规问责。你是否也担心“一装…...