MyBatis中复杂查询(一对多和多对一)

一,介绍

        在MyBatis中处理一对多(1)和多对一(N:1)关系是常见的需求,尤其是在操作数据库中存在关联表时。这些关系的管理能让数据查询更加直观和灵活。下面分别介绍如何在MyBatis中配置和查询这两种类型的关系。

二,一对多(1)关系

        一对多关系指的是一个记录在一个表中可以关联多个记录在另一个表中。例如,一个课程可以有多个学生。通常我们需要用外键关联学生与课程并一同返回结果。

 2.1映射配置

        首先在MyBatis的映射文件中配置这种关系。假设我们有两个实体类:Course和 Student,其中 Course可以有多个 Student。

2.2 Course类

public class Course {
    private int id;
    private String name;
    private List<Student> students; // 课程对应的学生列表
    // getters 和 setters
}

2.3 Student类:

public class Student {
    private int id;
    private String name;
    private int courseId; // 外键
    // getters 和 setters
}

2.4 Mapper文件

<select id="selectCourse" resultMap="CourseResultMap">
    SELECT * FROM Course
    LEFT JOIN Student ON Course.id = Student.course_id
    WHERE Course.id = #{id}
</select>

<resultMap id="CourseResultMap" type="Course">
    <id property="id" column="id" />
    <result property="name" column="name" />
    <collection property="students" ofType="Student"
                resultMap="StudentResultMap"/>
</resultMap>

<resultMap id="StudentResultMap" type="Student">
    <id property="id" column="id" />
    <result property="name" column="name" />
    <result property="courseId" column="course_id" />
</resultMap>

二,多对一(N:1)关系

        多对一关系指的是多个记录在一个表中可以关联到另一个表中的单个记录。例如,多个学生可以属于同一个课程。

 2.1 映射配置(添加字段名与类属性名不一致的情况)

        通过映射文件中的配置来指定数据库字段名和类属性名之间的对应关系。我在多对一(N:1)关系的例子中加入字段名和参数名不一样的情况。比如,在数据库中字段名为id而在类中的对应字段名为courseId。

2.2 Student类:

public class Student {
    private int id;
    private String name;
    private int courseId; // 对应数据库中的 course_id 字段
    private Course course; // 关联的课程对象
    // getters 和 setters
}

2.3 Course类

public class Course {
    private int courseId; // 注意,这里使用了 courseId 而不是 id
    private String name;
    // getters 和 setters
}

2.4 Mapper文件配置

<!-- 结果映射定义,处理字段名和属性名不一致的情况 -->
<resultMap id="CourseResultMap" type="Course">
    <id property="courseId" column="id" />  <!-- 映射数据库的 id 字段到类的 courseId 属性 -->
    <result property="name" column="name" />
</resultMap>

<resultMap id="StudentResultMap" type="Student">
    <id property="id" column="id" />
    <result property="name" column="name" />
    <result property="courseId" column="course_id" />  <!-- 映射数据库的 course_id 字段到类的 courseId 属性 -->
    <association property="course" javaType="Course"
                 resultMap="CourseResultMap" />
</resultMap>

<!-- 查询学生及其课程信息,处理字段名映射 -->
<select id="selectStudent" resultMap="StudentResultMap">
    SELECT Student.id, Student.name, Student.course_id,
           Course.id, Course.name
    FROM Student
    JOIN Course ON Student.course_id = Course.id
    WHERE Student.id = #{id}
</select>

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

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

相关文章

c++习题05-斐波那契数列

目录 一&#xff0c;问题 二&#xff0c;思路 三&#xff0c;代码 一&#xff0c;问题 二&#xff0c;思路 根据题目&#xff0c;可以自己列出斐波那契数列&#xff08;前四个&#xff09;如下&#xff1a; 通过列出来的值&#xff0c;可以发现&#xff0c;前两个都是1&…

如何优化圆柱晶振32.768KHz的外壳接地?

圆柱晶振32.768KHz在电子设备中扮演着重要的角色&#xff0c;其精确的时钟信号对于许多应用至关重要。为了确保晶振的稳定性和准确性&#xff0c;外壳接地是一个关键步骤。 一、外壳接地的目的 外壳接地的主要目的是为了防止信号干扰。当晶振的外壳接地后&#xff0c;它相当于…

联合概率密度函数

目录 1. 什么是概率密度由联合概率密度求概率参考链接 1. 什么是概率密度 概率密度到底在表达什么&#xff1f; 外卖在20-40分钟内送达的概率 随机变量落在[20,40]之间的概率。下图中&#xff0c;对总面积做规范化处理&#xff0c;令总面积1&#xff0c; f ( x ) f(x) f(x)则成…

创建本地仓库

一、新建挂载目录 二、将挂载本地镜像挂载到目录 三、配置yum仓库 一、新建挂载目录 mkdir /BenDiCangKu 二、将挂载本地镜像挂载到目录 1、先连接本地光盘 2、挂载光盘 mount /dev/sr0 /BenDiCangKu 3、查看挂载 由此可见挂载成功 三、配置yum仓库 1、新建yum仓库文件…

Zabbix6.4安装教程

目录 前言 主要功能 常见应用场景 一. 环境准备 二. 部署安装 三. Web页面安装 前言 Zabbix是一个开源的企业级监控解决方案&#xff0c;用于监控各种网络设备、服务器、应用程序和云资源。它能够提供全面的监控、告警和数据分析功能&#xff0c;帮助管理员及时发现和解决…

测试几个 ocr 对日语的识别情况

测试几个 ocr 对日语的识别情况 1. EasyOCR2. PaddleOCR3. Deepdoc&#xff08;识别pdf中图片&#xff09;4. Deepdoc&#xff08;识别pdf中文字&#xff09;5. Nvidia neva-22b6. Claude 3.5 sonnet 识别图片中的文字7. Claude 3.5 sonnet 识别 pdf 中表格8. OpenAI gpt-4o 识…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十)-git(2)

下面是一些git的常用命令和基本操作&#xff0c;可以当做平常的笔记查询&#xff0c;用于学习&#xff01;&#xff01;&#xff01; 文章目录 前言 一、git 二、git常用命令 总结 前言 下面是一些git的常用命令和基本操作&#xff0c;可以当做平常的笔记查询&#xff0c;用于…

UE4_材质基础_切线空间与法线贴图

学习笔记&#xff0c;不喜勿喷&#xff0c;侵权立删&#xff0c;祝愿大家生活越来越好&#xff01; 一、切线空间 在《OpenGL基础11&#xff1a;空间》中提到了观察空间、裁剪空间、世界空间等。切线空间和它们一样&#xff0c;都属于坐标空间 上面就是一个…

基于jeecgboot-vue3的Flowable流程-集成仿钉钉流程(二)增加基本的发起人审批与多用户多实例

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、AssigneeNode 增加approvalText public abstract class AssigneeNode extends Node {// 审批对象private AssigneeTypeEnum assigneeType;// 表单内人员private String formUser;// 表…

【智能制造-10】样条曲线、贝塞尔曲线、B样条

什么是样条&#xff1f; 样条是通过一组指定点集而生成平滑曲线的柔性带。 什么是B样条&#xff1f; B样条就相当于一个函数&#xff0c;这个函数在系数不同时就可以变化成各种曲线的形状。 B样条的优势&#xff1f; 保留了Bezier曲线的优势可局部修改&#xff0c;调整某一…

专题三:Spring源码中新建module

前面我们构建好了Spring源码&#xff0c;接下来肯定迫不及待来调试啦&#xff0c;来一起看看大名鼎鼎ApplicationContext 新建模块 1、基础步骤 1.1 自定义模块名称如&#xff1a;spring-self 1.2 选择构建工具因为spring使用的是gradle&#xff0c;所以这边需要我们切换默认…

21.【C语言】顺序结构和选择结构之if

顺序结构 从上至下&#xff0c;按顺序执行代码 选择结构 1.if语句 01零分支 if (条件)表达式; 02双分支 详见第10篇 if (条件) { ... } else { ... }03多分支 使用if嵌套 if (条件1)表达式1 else if (条件2)表达式2 else if (条件3)表达式3 else if (条件4)表达式4 .…

Patch SCN使用说明---惜分飞

软件说明 该软件是惜分飞&#xff08;https://www.xifenfei.com&#xff09;开发&#xff0c;仅用来查看和修改Oracle数据库SCN(System Change Number),主要使用在数据库因为某种原因导致无法正常启动的情况下使用该工具进行解决.特别是Oracle新版本中使用隐含参数,event,orad…

jmeter-beanshell学习2-beanshell断言

继续写&#xff0c;之前写了获取变量&#xff0c;设置变量&#xff0c;今天先写个简单点的断言。 一般情况用响应断言&#xff0c;就挺好使&#xff0c;但是自动化还要生成报告&#xff0c;如果断言失败了&#xff0c;要保存结果&#xff0c;只能用beanshell处理&#xff0c;顺…

mysql在windows下的安装

一&#xff0c;软件安装 只修改开头的系统盘 二&#xff0c;环境变量配置 找到MySQL安装目录对应的bin目录复制路径粘贴过来 三&#xff0c;cmd

通过端口和进程pid查找启动文件/脚本

今天审计一个程序又让GPT给我上了一课&#xff0c;记一下笔记&#xff1a; 1、首先该程序开启了8080端口&#xff0c;使用如下命令得到pid为1817 netstat -tunlp|grep 80802、使用pid得到父进程 pstree -ps 1817输出结果如下&#xff1a; 3、看出程序是由systemd启动的&…

Windows 玩转大模型第一天:大模型本地部署,调用大模型API可直接工程化应用(全部代码和详细部署流程)

Ollama 是一个开源框架&#xff0c;专为在本地机器上便捷部署和运行大型语言模型&#xff08;LLM&#xff09;而设计。 以下是其主要特点和功能概述&#xff1a; 1. 简化部署&#xff1a;Ollama 目标在于简化在 Docker 容器中部署大型语言模型的过程&#xff0c;使得非专业用…

信创-办公软件应用工程师认证

随着国家对信息技术自主创新的战略重视程度不断提升&#xff0c;信创产业迎来前所未有的发展机遇。未来几年内&#xff0c;信创产业将呈现市场规模扩大、技术创新加速、产业链完善和国产化替代加速的趋势。信创人才培养对于推动产业发展具有重要意义。应加强高校教育、建立人才…

【EFK】efk 8收集docker容器日志测试

前言 目前&#xff0c;efk 全家桶已经更新到版本8 了&#xff0c;本章节我们使用8版本的elk搭建日志收集系统&#xff0c;了解它的配置运行过程&#xff0c;方便以后在更复杂的环境中更好的使用。 版本默认就是8最新的&#xff0c;也可以自己指定其他8的版本 elasticsearch: …

DisFormer:提高视觉动态预测的准确性和泛化能力

最新的研究进展已经显示出目标中心的表示方法在视觉动态预测任务中可以显著提升预测精度&#xff0c;并且增加模型的可解释性。这种表示方法通过将视觉场景分解为独立的对象&#xff0c;有助于模型更好地理解和预测场景中的变化。 尽管在静态图像的解耦表示学习方面已经取得了一…