MyBatis 关联映射详解
目录
一、创建表结构
1. 学生表 (student)
2. 教师表 (teacher)
二、一对一 & 多对一 关系映射
1. 连表查询(直接查询)
2. 分步查询(懒加载)
三、一对多 关系映射
1. 直接查询
2. 分步查询
四、MyBatis 延迟加载(懒加载)
1. 配置全局懒加载
2. 配置分步查询的懒加载
3. 测试代码
4. 强制立即加载(eager)
一、创建表结构
在 MyBatis 进行关联映射时,我们需要创建 student(学生表)和 teacher(教师表),并建立它们之间的关联。
1. 学生表 (student)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (`id` int(11) NOT NULL AUTO_INCREMENT,`Sname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,`age` int(11) DEFAULT NULL,`t_id` int(11) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;INSERT INTO `student` VALUES (1, '张三', '男', 18, 1);
INSERT INTO `student` VALUES (2, '李四', '女', 18, 1);
...SET FOREIGN_KEY_CHECKS = 1;
2. 教师表 (teacher)
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;DROP TABLE IF EXISTS `teacher`;
CREATE TABLE `teacher` (`id` int(11) NOT NULL AUTO_INCREMENT,`Tname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;INSERT INTO `teacher` VALUES (1, '张老师');
INSERT INTO `teacher` VALUES (2, '李老师');SET FOREIGN_KEY_CHECKS = 1;
二、一对一 & 多对一 关系映射
1. 连表查询(直接查询)
实体类
public class Student {private Integer id;private String Sname;private String sex;private Integer age;private Integer t_id;private Teacher teacher; // 关联的教师对象
}public class Teacher {private Integer id;private String Tname;
}
查询语句
<select id="getStudent1" resultMap="StudentTeacher1">SELECT student.id, student.Sname, teacher.TnameFROM studentLEFT JOIN teacher ON student.t_id = teacher.id
</select><resultMap id="StudentTeacher1" type="com.qcby.entity.Student"><result property="id" column="id"/><result property="Sname" column="Sname"/><association property="teacher" javaType="com.qcby.entity.Teacher"><result property="id" column="id"/><result property="Tname" column="Tname"/></association>
</resultMap>
2. 分步查询(懒加载)
<select id="getStudent" resultMap="StudentTeacher">SELECT * FROM student;
</select><resultMap id="StudentTeacher" type="com.qcby.entity.Student"><association property="teacher" column="t_id" javaType="com.qcby.entity.Teacher" select="getTeacher"/>
</resultMap><select id="getTeacher" resultType="com.qcby.entity.Teacher">SELECT * FROM teacher WHERE id = #{t_id};
</select>
三、一对多 关系映射
1. 直接查询
实体类
public class Teacher {private Integer id;private String Tname;private List<Student> students; // 一个老师有多个学生
}
查询语句
<select id="getTeacher" resultMap="TeacherStudent">SELECT teacher.id, teacher.Tname, student.SnameFROM teacherLEFT JOIN student ON student.t_id = teacher.id;
</select><resultMap id="TeacherStudent" type="com.qcby.entity.Teacher"><collection property="students" ofType="com.qcby.entity.Student"><result property="Sname" column="Sname"/></collection>
</resultMap>
2. 分步查询
<select id="getTeacher" resultMap="TeacherStudent2">SELECT * FROM teacher;
</select><resultMap id="TeacherStudent2" type="com.qcby.entity.Teacher"><collection property="students" column="id" ofType="com.qcby.entity.Student" select="getStudentByTeacherId" />
</resultMap><select id="getStudentByTeacherId" resultType="com.qcby.entity.Student">SELECT * FROM student WHERE t_id = #{t_id};
</select>
四、MyBatis 延迟加载(懒加载)
1. 配置全局懒加载
<settings><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/>
</settings>
2. 配置分步查询的懒加载
<association property="teacher" column="t_id" javaType="com.qcby.entity.Teacher"select="com.qcby.dao.TeacherDao.getTeacher" fetchType="lazy"/>
3. 测试代码
@Test
public void getStudent() {List<Student> studentList = mapper.getStudent();for (Student student : studentList) {System.out.println(student.getSex());}
}@Test
public void getStudentWithTeacher() {List<Student> studentList = mapper.getStudent();for (Student student : studentList) {System.out.println(student.getTeacher().getTname());}
}
4. 强制立即加载(eager)
<association property="teacher" column="t_id" javaType="com.qcby.entity.Teacher"select="com.qcby.dao.TeacherDao.getTeacher" fetchType="eager"/>
五、总结
- 一对一 & 多对一 可以使用 连表查询 或 分步查询(懒加载)。
- 一对多 关系可以使用 结果嵌套 或 查询嵌套。
- 懒加载 需要在 MyBatis 配置文件 和 映射 XML 里配置。
- 某些查询可以强制使用立即加载(eager),避免不必要的多次查询。
相关文章:
MyBatis 关联映射详解
目录 一、创建表结构 1. 学生表 (student) 2. 教师表 (teacher) 二、一对一 & 多对一 关系映射 1. 连表查询(直接查询) 2. 分步查询(懒加载) 三、一对多 关系映射 1. 直接查询 2. 分步查询 四、MyBatis 延迟加载&am…...
Shell特殊位置变量以及常用内置变量总结
目录 1. 特殊的状态变量 1.1 $?(上一个命令的退出状态) 1.2 $$(当前进程的 PID) 1.3 $!(后台进程的 PID) 1.4 $_(上一条命令的最后一个参数) 2.常用shell内置变量 2.1 echo&…...
LeetCode:96.不同的二叉搜索树
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:96.不同的二叉搜索树 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉…...
基于Springboot的智能学习平台系统【附源码】
基于Springboot的智能学习平台系统 效果如下: 系统登陆页面 系统主页面 课程详情页面 论坛页面 考试页面 试卷管理页面 考试记录页面 错题本页面 研究背景 随着互联网技术的普及,人们探索知识的方式逐渐转向数字化平台。传统的教学方法通常局限于固定…...
DeepSeek助力学术文献搜索!
搜集文献 宝子们如果是第一次发表学术论文,论文往往是会署名多个作者。在这种情况下,即便成功发表了论文,独立撰作或主导写作的挑战仍旧存在。那么,怎样才能独立地完成一篇属于自己的学术论文呢?对于初次尝试学术论文…...
阿里:基于路由和规划的多agent系统
📖标题:Talk to Right Specialists: Routing and Planning in Multi-agent System for Question Answering 🌐来源:arXiv, 2501.07813 🌟摘要 🔸利用大型语言模型(LLM),…...
@RestControllerAdvice 的作用
系列博客目录 文章目录 系列博客目录1.ControllerAdvice 有什么用主要功能 2.与 RestControllerAdvice 的区别3.苍穹外卖中的使用4.RestControllerAdvice可以指定范围吗(1)指定应用到某些包中的 RestController(2)指定应用到具有特…...
k均值聚类将数据分成多个簇
K-Means 聚类并将数据分成多个簇,可以使用以下方法: 实现思路 随机初始化 K 个聚类中心计算每个点到聚类中心的距离将点分配到最近的簇更新聚类中心重复上述过程直到收敛 完整代码: import torch import matplotlib.pyplot as pltdef kme…...
书生大模型实战营2
L0——入门岛 Python基础 Conda虚拟环境 虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。 创建新环境 首先,确保你已经安装了Anaconda或Minico…...
Excel 技巧21 - Excel中整理美化数据实例,Ctrl+T 超级表格(★★★)
本文讲Excel中如何整理美化数据的实例,以及CtrlT 超级表格的常用功能。 目录 1,Excel中整理美化数据 1-1,设置间隔行颜色 1-2,给总销量列设置数据条 1-3,根据总销量设置排序 1-4,加一个销售趋势列 2&…...
前端——js高级25.1.27
复习:对象 问题一: 多个数据的封装提 一个对象对应现实中的一个事物 问题二: 统一管理多个数据 问题三: 属性:组成:属性名属性值 (属性名为字符串,属性值任意) 方…...
学习数据结构(4)顺序表+单链表
1.顺序表算法题 题三: 2.单链表 (1)概念 链表是⼀种物理存储结构上非连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 (2)节点 节点的组成主要有两个部分:当前节点要保…...
GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁
利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统(GIS)在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…...
python:斐索实验(Fizeau experiment)
斐索实验(Fizeau experiment)是在1851年由法国物理学家阿曼德斐索(Armand Fizeau)进行的一项重要实验,旨在测量光在移动介质中的传播速度。这项实验的结果对当时的物理理论产生了深远的影响,并且在后来的相…...
MySQL查询优化(三):深度解读 MySQL客户端和服务端协议
如果需要从 MySQL 服务端获得很高的性能,最佳的方式就是花时间研究 MySQL 优化和执行查询的机制。一旦理解了这些,大部分的查询优化是有据可循的,从而使得整个查询优化的过程更有逻辑性。下图展示了 MySQL 执行查询的过程: 客户端…...
vue3相关知识点
title: vue_1 date: 2025-01-28 12:00:00 tags:- 前端 categories:- 前端vue3 Webpack ~ vite vue3是基于vite创建的 vite 更快一点 一些准备工作 准备后如图所示 插件 Main.ts // 引入createApp用于创建应用 import {createApp} from vue // 引入App根组件 import App f…...
基于springboot+vue的流浪动物救助系统的设计与实现
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
MySQL(单表访问)
今天是新年,祝大家新年快乐,但是生活还是得继续。 后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 大部分截图和文章采…...
UE5.3 C++ CDO的初步理解
一.UObject UObject是所有对象的基类,往上还有UObjectBaseUtility。 注释:所有虚幻引擎对象的基类。对象的类型由基于 UClass 类来定义。 这为创建和使用UObject的对象提供了 函数,并且提供了应在子类中重写的虚函数。 /** * The base cla…...
SpringBoot 中的测试jar包knife4j(实现效果非常简单)
1、效果图 非常快的可以看见你实现的接口 路径http://localhost:8080/doc.html#/home 端口必须是自己的 2、实现效果 2.1、导入jar包 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-star…...
RTX4090D加持下的OpenClaw:Qwen3-32B多任务并行处理实测
RTX4090D加持下的OpenClaw:Qwen3-32B多任务并行处理实测 1. 测试背景与硬件配置 去年底我入手了RTX4090D显卡,一直想找个机会测试它在AI工作负载下的真实表现。最近在部署OpenClaw时,发现其多任务调度能力对显存和计算资源的需求极高&#…...
告别Moom!用Hammerspoon实现Mac窗口精准控制(附完整快捷键表+配置文件)
用Hammerspoon打造Mac高效工作流:从窗口管理到自动化脚本 每次看到同事花十几秒拖动窗口调整大小,或者在不同显示器间来回切换应用时,我总忍不住想分享这个改变我工作效率的神器。Hammerspoon——这个完全免费的开源工具,让我彻底…...
G-Helper:华硕ROG笔记本性能调校的轻量级解决方案
G-Helper:华硕ROG笔记本性能调校的轻量级解决方案 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: h…...
AI早报 | 2026.03.29(周日)
🤖 AI 早报 | 2026.03.29(周日) 采集时间:2026-03-29 13:25 (Asia/Shanghai) 🛡️ 安全/治理 1️⃣ Anthropic 安全漏洞泄露下一代模型 Mythos Anthropic 公司遭遇数据安全事件,未受保护的数据存储中泄露了…...
爬虫对抗:ZLibrary 反爬机制实战分析(第二版)
摘要: 本文从爬虫工程化角度,详细分析 ZLibrary 站点的常见反爬策略,包括 IP 限流、Cookie 校验、请求头检测、人机验证、接口签名等,并给出对应的 Python 实战对抗思路与代码示例。本文仅用于网络安全技术学习与反爬防护研究&…...
百川2-13B-4bits模型商用指南:OpenClaw自动化服务合规部署要点
百川2-13B-4bits模型商用指南:OpenClaw自动化服务合规部署要点 1. 商用授权与合规基础 百川2-13B-4bits模型作为国内少数明确开放商用申请的大语言模型,其授权体系与常见的开源协议有本质区别。我在实际部署过程中发现,很多开发者容易忽略一…...
国科大研一CS选课避坑指南:从算法分析到模式识别,我的踩坑与真香体验
国科大研一CS选课避坑指南:从算法分析到模式识别,我的踩坑与真香体验 第一次踏入国科大雁栖湖校区的图书馆时,我被落地窗外绵延的燕山山脉震撼得说不出话——直到发现座位插座没电、WiFi信号时断时续,才意识到理想与现实的参差。这…...
AnimateDiff部署指南:SD1.5+Motion Adapter显存优化版保姆级教程
AnimateDiff部署指南:SD1.5Motion Adapter显存优化版保姆级教程 1. 项目简介 想用几句话就让AI帮你生成一段流畅的视频吗?AnimateDiff就是这样一个神奇的工具。与那些需要你先提供一张图片才能生成视频的模型不同,AnimateDiff可以直接根据你…...
ComfyUI插件避坑指南:国内用户如何解决模型下载和安装问题
ComfyUI插件避坑指南:国内用户如何解决模型下载和安装问题 如果你是一名国内用户,想要使用ComfyUI的插件来提升工作效率,那么你可能会遇到一些令人头疼的问题。模型下载缓慢、安装报错、依赖冲突...这些问题不仅浪费时间,还容易让…...
OpenClaw 的模型推理是否支持异步非阻塞调用?如何实现?
在讨论OpenClaw模型推理是否支持异步非阻塞调用之前,不妨先回想一下日常生活中的一个场景。假设你需要同时处理几件事:一边用洗衣机洗衣服,一边在厨房煮汤,同时还在回复工作邮件。如果这三件事必须一件接一件地做,等衣…...
