mybatis 的多表查询

文章目录

    • 多表查询
      • 一对一
      • 一对多

多表查询

一对一

  • 开启代码片段编写

image-20250406211401870

image-20250406211421125

专注于 SQL的 编写

  • JDBC 的写法,注重于 SQL

image-20250406212503288

  • mybatis 在 一对一查询时,核心在于
    • 建立每个表对应的实体类
    • 主键根据 主键 id 进行查询,副标根据 设定外键进行查询 在 SQL编写上简单很多
    • 通过注解,对映射结果进行处理,让二者产生联系,来实现多表查询

image-20250406213406652

  • 学生详情实体类
package com.yanyu.mybatis2.po;import lombok.Data;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 21:26* @description:student_detail 表的 字段映射实体类*/
@Data
public class StudentDetail {private Integer id;private Integer studentId;private String addr;
}
  • 学生实体类
package com.yanyu.mybatis2.po;import lombok.Data;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 21:25* @description:student 表的 字段映射实体类*/
@Data
public class Student {private Integer id;private String name;private String stuid;private String major;
//  连接  学生详情的字段StudentDetail studentDetail;}
  • 接口设计
    • 分别编写查询student student_detail 的操作,根据 各自的主键 id
    • 处理映射结果集

image-20250406220831138

package com.yanyu.mybatis2.mapper;import com.yanyu.mybatis2.po.Student;
import com.yanyu.mybatis2.po.StudentDetail;
import org.apache.ibatis.annotations.One;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 21:39* @description:多表查询,一对一*/
public interface StudentOneToOne {
//    根据  id  主键  查询 副标 学生详情 结果自然就是  StudentDetail@Select("""select id,student_id,addr from student_detail where student_id=#{student_id}""")
//    进行副表的结果映射@Results({@Result(id = true,column = "id",property = "id"),@Result(column = "student_id",property = "studentId"),@Result(column = "addr",property = "addr")})StudentDetail selectStudentDetail(Integer student_id);//注意开启驼峰(appllication.properties)
//    根据 主表的 主键  id 进行  查询、@Select("""select id,name,stuid,major from student where id=#{id}""")
//    映射结果@Results({@Result(id = true,column = "id",property = "id"),@Result(column = "name",property = "name"),@Result(column = "stuid",property = "stuid"),@Result(column = "major",property = "stuid"),@Result(column = "id",property = "studentDetail",one = @One(select = "com.yanyu.mybatis2.mapper.StudentOneToOne.selectStudentDetail",fetchType = FetchType.LAZY))
//            将主表 student  的主键 id  作为  参数传递到  副表查询 的  方法中,本质 :  student.id = student_detail.student_id})Student selectStudent(Integer id);/** FetchType.LAZY 的作用
延迟加载(Lazy Loading):当设置为 FetchType.LAZY 时,关联的实体或集合不会在主实体被加载时立即加载。相反,它们会在真正需要访问这些关联数据时才被加载。
* 这种策略可以减少数据库查询的次数,提高性能,尤其是在关联数据量较大时。
按需加载:只有在访问关联属性时,Hibernate 才会发起额外的数据库查询来加载这些数据。
对比 FetchType.EAGER
FetchType.EAGER:表示立即加载。当主实体被加载时,关联的实体或集合也会被立即加载。这种策略适用于关联数据量较小且经常需要一起使用的场景,但可能会导致性能问题
* ,尤其是在关联数据量较大或关联关系较复杂时。
FetchType.LAZY:表示延迟加载。只有在真正需要访问关联数据时才会加载,适用于关联数据量较大或关联关系较复杂的情况,可以有效减少不必要的数据库查询。* */
}

image-20250406221128414

一对多

image-20250406222822632

  • 与一对一类似
    • 主表根据 id 查,副表根据 student_id 查
    • 副表映射的每个实体类都是一个对象,以集合形式出现在 主表的实体类中
package com.yanyu.mybatis2.po;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 22:32* @description:课程实体类*/
@Data
public class Course {private Integer id;private Integer studentId;private String name;
//  一个学生对应多个 课程,课程以集合形式出现在  学生类中}
package com.yanyu.mybatis2.po;import lombok.Data;import java.util.List;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 22:34* @description:学生与课程*/
@Data
public class StudentCourse {private Integer id;private String name;private String stuid;private String major;private List<Course> courses;
}
package com.yanyu.mybatis2.mapper;import com.yanyu.mybatis2.po.Course;
import org.apache.ibatis.annotations.*;
import org.apache.ibatis.mapping.FetchType;import java.util.List;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/6 22:37* @description:*/
public interface StudentCourse {
//    根据  student_id 查课程 并 按 副表   主键  id 进行分组@Select("""select id,student_id,name from coursewhere student_id = #{student_id}order by id""")@Results(id = "studentCourse",value = {@Result(id = true, column = "id", property = "id"),@Result(column = "student_id", property = "studentId"),@Result(column = "name", property = "name")})List<Course> selectCourse(Integer student_id);
//    主表@Select("""select id,name,stuid,major from studentwhere id = #{id}""")@Results({@Result(id = true,column = "id",property = "id"),@Result(column = "name",property = "name"),@Result(column = "stuid",property = "stuid"),@Result(column = "major",property = "major"),@Result(column = "id",property = "courses",many = @Many(select = "com.yanyu.mybatis2.mapper.StudentCourse.selectCourse",fetchType = FetchType.LAZY))
//            将主表 student  的主键 id  作为  参数传递到  副表查询 的  方法中,本质 :  student.id = course.student_id})com.yanyu.mybatis2.po.StudentCourse selectStudentCourse(Integer id);}
  • 调错:看得懂就看(cause caused by),看不到,直接把错误复制,百度

image-20250406232036742

image-20250406232940467

  • 注意接口名和实体类名一样时,要特别留意 包名

image-20250406233241320

小结:

  • 各自查询各自的,然后再利用 one = @one many = @Many 进行关联

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

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

相关文章

Scrapy爬虫实战:如何用Rules实现高效数据采集

Scrapy是一个强大的Python爬虫框架&#xff0c;而其中的Rules类则为爬虫提供了更高级的控制方式。本文将详细介绍如何在Scrapy中使用Rules&#xff0c;以及各个参数的具体作用&#xff0c;并结合实际场景说明Rules的必要性。 为什么需要Rules&#xff1f; 在Web爬取过程中&…

ActiveMQ 性能优化与网络配置实战(一)

一、引言 在当今分布式系统和微服务架构盛行的时代&#xff0c;消息中间件作为实现系统间异步通信、解耦和削峰填谷的关键组件&#xff0c;其重要性不言而喻。ActiveMQ 作为一款广泛应用的开源消息中间件&#xff0c;凭借其对多种消息协议的支持、灵活的部署方式以及丰富的功能…

免费视频压缩软件

一、本地软件&#xff08;支持离线使用&#xff09; 1. HandBrake 平台&#xff1a;Windows / macOS / Linux 特点&#xff1a;开源免费&#xff0c;支持多种格式转换&#xff0c;提供丰富的预设选项&#xff08;如“Fast 1080p”快速压缩&#xff09;&#xff0c;可自定义分…

消除AttributeError: module ‘ttsfrd‘ has no attribute ‘TtsFrontendEngine‘报错输出的记录

#工作记录 尝试消除 消除“模块ttsfrd没有属性ttsfrontendengine”的错误的记录 报错摘录&#xff1a; Traceback (most recent call last): File "F:\PythonProjects\CosyVoice\webui.py", line 188, in <module> cosyvoice CosyVoice(args.model_di…

Acrel-EIoT 能源物联网云平台在能耗监测系统中的创新设计

摘要 随着能源管理的重要性日益凸显&#xff0c;能耗监测系统成为实现能源高效利用的关键手段。本文详细介绍了基于安科瑞Acrel-EIoT能源物联网云平台的能耗监测系统的设计架构与应用实践。该平台采用分层分布式结构&#xff0c;涵盖感知层、网络层、平台层和应用层&#xff0…

计算机网络-同等学力计算机综合真题及答案

计算机网络-同等学力计算机综合真题及答案 &#xff08;2003-2024&#xff09; 2003 年网络 第二部分 计算机网络&#xff08;共 30 分&#xff09; &#xff08;因大纲变动因此 2004 年真题仅附真题&#xff0c;不作解析。&#xff09; 一、填空题&#xff08;共 10 分&#…

PyTorch常用命令详解:助力深度学习开发

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…

深度学习:梯度下降法的数学原理

梯度下降法——是一种最优化算法,用于找到函数的局部极小值或全局最小值。它基于函数的梯度(或偏导数)信息来更新参数,目标是通过逐渐调整参数值来最小化目标函数的值。在机器学习算法中,梯度下降是最常采用的方法之一,尤其是在深度学习模型中,BP反向传播方法的核心就是…

刷leetcodehot100返航版--哈希表5/5、5/6

回顾一下之前做的哈希&#xff0c;貌似只有用到 unordered_set&#xff1a;存储无序元素unordered_map&#xff1a;存储无序键值对 代码随想录 常用代码模板2——数据结构 - AcWing C知识回顾-CSDN博客 1.两数之和5/5【30min】 1. 两数之和 - 力扣&#xff08;LeetCode&am…

openwrt 使用quilt 打补丁(patch)

1,引入 本文简单解释如何在OpenWRT下通过quilt命令打补丁--patch&#xff0c;也可查看openwrt官网提供的文档 2&#xff0c;以下代码通过编译net-snmp介绍 ① 执行编译命令之后&#xff0c;进入build_dir的net-snmp-5.9.1目录下&#xff0c;改目录即为snmp最终编译的目录了 /…

【开发工具】Window安装WSL及配置Vscode获得Linux开发环境

笔者面试时需要本地IDE手撕代码并测试&#xff0c;但是windows开发环境用不习惯&#xff0c;Min64和json配置也比较麻烦&#xff0c;因此采用WSLvscode的方式快速配置Linux开发环境 WSL安装 直接在微软商店搜索WSL即可 系统设置 开始菜单搜索启用或关闭 Windows 功能&…

【C语言】初阶数据结构相关习题(一)

&#x1f386;个人主页&#xff1a;夜晚中的人海 今日语录&#xff1a;人的生命似洪水在奔流&#xff0c;不遇着岛屿、暗礁&#xff0c;难以激起美丽的浪花。——奥斯特洛夫斯基 文章目录 ⭐一、判定是否互为字符重排&#x1f389;二、 回文排列&#x1f680;三、字符串压缩&am…

MySQL----数据库的操作

1. 查看数据库 语法&#xff1a;show databases; 示例展示&#xff1a; 2. 创建库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] database_name[CHARACTER SET charset_name][COLLATE collation_name]; 注意&#xff1a;[] 为可选项 {} 为必选项 database_name 为数据…

Dagger中编译import报找不到ProvideClientFactory,initialize中ProvideClientFactory爆红

解决方案&#xff1a;将对应Module移到主模块&#xff0c;可能是依赖循环使用导致或者是模块之间无法访问及通信导致 为了重现问题&#xff0c;我还远了此操作

Nacos源码—4.Nacos集群高可用分析四

大纲 6.CAP原则与Raft协议 7.Nacos实现的Raft协议是如何写入数据的 8.Nacos实现的Raft协议是如何选举Leader节点的 9.Nacos实现的Raft协议是如何同步数据的 10.Nacos如何实现Raft协议的简版总结 8.Nacos实现的Raft协议是如何选举Leader节点的 (1)初始化RaftCore实例时会开…

拟南芥T2T基因组-文献精读127

A near-complete assembly of an Arabidopsis thaliana genome 拟南芥基因组的近乎完整组装 拟南芥&#xff08;Arabidopsis thaliana&#xff09;基因组序列作为广泛应用的模式物种&#xff0c;为植物分子生物学研究提供了巨大的推动力。在基因组序列首次发布后的20多年&…

一个关于fsaverage bem文件的说明

MNE文档&#xff1a;基于模板 MRI 的 EEG 前向算子 Head model and forward computation 在了解了脑图谱发展的过程之后&#xff0c;对脑的模版有了更深的认识&#xff0c;所以&#xff0c;对于之前使用的正向的溯源文件&#xff0c;进行一下解析&#xff0c;查看包含的信息&a…

C#学习第21天:安全与加密(Security and Cryptography)

核心概念 1. 什么是加密&#xff1f; 加密&#xff1a;加密是一种将数据转换为一种不可读形式的方法&#xff0c;只有持有相应密钥的人才能解密并读取数据。目的&#xff1a;确保数据的机密性和安全性&#xff0c;特别是在传输过程中过防止未授权访问。 2. 加密类型 对称加密…

OpenCV 图形API(77)图像与通道拼接函数-----对图像进行几何变换函数remap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对图像应用一个通用的几何变换。 函数 remap 使用指定的映射对源图像进行变换&#xff1a; dst ( x , y ) src ( m a p x ( x , y ) , m a p y…

在线时间戳转换工具

给大家推荐一个在线时间戳转换工具 点击跳转-鸽鸽在线工具 这个工具除了时间戳转换&#xff0c;到首页还能选择使用很多其他小工具&#xff0c;欢迎使用