MyBatis关联关系映射详解
前言
在使用MyBatis进行数据库操作时,关联关系映射是一个非常重要的概念。它允许我们在数据库表之间建立关联,并通过对象之间的关系来进行数据查询和操作。本文将详细介绍MyBatis中的关联关系映射,包括一对一、一对多和多对多关系的处理方法。
一、 什么是关联关系映射?
关联关系映射是指在数据库表之间建立关联关系,并将这种关系映射到对象之间的关系。在关系型数据库中,我们通常使用外键来建立表与表之间的关联。
在 MyBatis 中,通过 association 元素来处理对象与对象之间关联关系,association 元素提供了一系列属性用于维护数据表之间的关系。association 元素是 resultMap元素的子元素,它有两种配置方式,嵌套查询方式和嵌套结果映射方式。
二、MyBatis的关系映射方式
MyBatis提供了两种主要的关系映射方式:基于XML配置和基于注解。
1.基于XML配置的关系映射
在基于XML配置的方式中,我们需要编写一个XML文件来描述数据库表和Java对象之间的映射关系。这个XML文件通常包含以下几个部分:
- 数据库连接信息:包括数据库的URL、用户名、密码等。
- SQL语句:包括查询、插入、更新、删除等操作的SQL语句。
- 结果映射:将查询结果映射到Java对象的属性上。
通过这个XML文件,MyBatis可以根据配置信息自动生成对应的SQL语句,并将查询结果映射到Java对象上。
2.基于注解的关系映射
在基于注解的方式中,我们可以使用注解来描述数据库表和Java对象之间的映射关系。通过在Java对象的属性上添加注解,我们可以指定该属性对应的数据库字段名、数据类型等信息。
相比于XML配置方式,基于注解的方式更加简洁和灵活。但是需要注意的是,注解方式不支持动态SQL语句的生成,因此在一些复杂的场景下可能不太适用。
三、如何使用MyBatis进行关系映射?
要使用MyBatis进行关系映射,我们需要完成以下几个步骤:
- 引入MyBatis的依赖:在项目的配置文件中添加MyBatis的依赖,以便能够使用MyBatis的功能。
- 配置数据库连接信息:在配置文件中添加数据库的连接信息,包括URL、用户名、密码等。
- 编写SQL语句:根据业务需求,编写对应的SQL语句,包括查询、插入、更新、删除等操作。
- 定义Java对象:定义与数据库表对应的Java对象,并在对象的属性上添加注解或在XML文件中进行配置。
- 执行数据库操作:通过MyBatis提供的API,执行数据库操作,包括查询、插入、更新、删除等操作。
四、关于关系映射的一些建议
- 尽量使用基于注解的关系映射方式,因为它更加简洁和灵活。
- 在编写SQL语句时,尽量使用参数化查询,以避免SQL注入攻击。
- 在定义Java对象时,尽量使用包装类而不是基本类型,以避免空指针异常。
- 在执行数据库操作时,尽量使用事务来保证数据的一致性和完整性。
五、关联关系映射
数据库表

1.一对一关联关系映射
一对一关联关系是指两个表之间的关系是一对一的。在数据库中,我们可以通过外键来建立这种关系。在MyBatis中,我们可以使用嵌套查询或嵌套结果映射来处理一对一关系。
嵌套查询
嵌套查询是指在查询主表的同时,通过子查询查询关联表的数据。在MyBatis中,我们可以使用<select>标签来定义子查询,并通过resultMap将查询结果映射到对象中。
<select id="getUserWithAddress" resultMap="userResultMap">SELECT * FROM userWHERE id = #{id}
</select><resultMap id="userResultMap" type="com.ctb.vo.User"><id property="id" column="id"/><result property="name" column="name"/><association property="address" javaType="Address"><id property="id" column="address_id"/><result property="city" column="city"/><result property="street" column="street"/></association>
</resultMap>
嵌套结果映射
嵌套结果映射是指将主表和关联表的查询结果分别映射到不同的对象中,并通过对象之间的关系建立关联。在MyBatis中,我们可以使用<resultMap>标签的<collection>子标签来定义嵌套结果映射。
<select id="getUserWithAddress" resultMap="userResultMap">SELECT u.id, u.name, a.id as address_id, a.city, a.streetFROM user uJOIN address a ON u.address_id = a.idWHERE u.id = #{id}
</select><resultMap id="userResultMap" type="com.ctb.vo.UserVo"><id property="id" column="id"/><result property="name" column="name"/><collection property="addresses" ofType="Address"><id property="id" column="address_id"/><result property="city" column="city"/><result property="street" column="street"/></collection>
</resultMap>
2.一对多关联关系映射
一对多关联关系是指一个表的一条记录对应多个关联表的记录。在数据库中,我们可以通过外键来建立这种关系。在MyBatis中,我们可以使用嵌套查询或嵌套结果映射来处理一对多关系。
嵌套查询
嵌套查询是指在查询主表的同时,通过子查询查询关联表的数据。在MyBatis中,我们可以使用<select>标签来定义子查询,并通过resultMap将查询结果映射到对象中。
<select id="getUserWithOrders" resultMap="userResultMap">SELECT * FROM userWHERE id = #{id}
</select><resultMap id="userResultMap" type="com.ctb.vo.User"><id property="id" column="id"/><result property="name" column="name"/><collection property="orders" ofType="Order"><id property="id" column="order_id"/><result property="name" column="order_name"/></collection>
</resultMap>
嵌套结果映射
嵌套结果映射是指将主表和关联表的查询结果分别映射到不同的对象中,并通过对象之间的关系建立关联。在MyBatis中,我们可以使用<resultMap>标签的<collection>子标签来定义嵌套结果映射。
<select id="getUserWithOrders" resultMap="userResultMap">SELECT u.id, u.name, o.id as order_id, o.name as order_nameFROM user uJOIN orders o ON u.id = o.user_idWHERE u.id = #{id}
</select><resultMap id="userResultMap" type="com.ctb.vo.User"><id property="id" column="id"/><result property="name" column="name"/><collection property="orders" ofType="Order"><id property="id" column="order_id"/><result property="name" column="order_name"/></collection>
</resultMap>
3.多对多关联关系映射
多对多关联关系是指两个表之间的关系是多对多的。在数据库中,我们需要通过中间表来建立这种关系。在MyBatis中,我们可以使用嵌套查询或嵌套结果映射来处理多对多关系。
嵌套查询
嵌套查询是指在查询主表的同时,通过子查询查询关联表的数据。在MyBatis中,我们可以使用<select>标签来定义子查询,并通过resultMap将查询结果映射到对象中。
<select id="getUserWithRoles" resultMap="userResultMap">SELECT * FROM userWHERE id = #{id}
</select><resultMap id="userResultMap" type="com.ctb.vo.User"><id property="id" column="id"/><result property="name" column="name"/><collection property="roles" ofType="Role"><id property="id" column="role_id"/><result property="name" column="role_name"/></collection>
</resultMap>
嵌套结果映射
嵌套结果映射是指将主表和关联表的查询结果分别映射到不同的对象中,并通过对象之间的关系建立关联。在MyBatis中,我们可以使用<resultMap>标签的<collection>子标签来定义嵌套结果映射。
<select id="getUserWithRoles" resultMap="userResultMap">SELECT u.id, u.name, r.id as role_id, r.name as role_nameFROM user uJOIN user_role ur ON u.id = ur.user_idJOIN role r ON ur.role_id = r.idWHERE u.id = #{id}
</select><resultMap id="userResultMap" type="com.ctb.vo.User"><id property="id" column="id"/><result property="name" column="name"/><collection property="roles" ofType="Role"><id property="id" column="role_id"/><result property="name" column="role_name"/></collection>
</resultMap>
4.Vo类是什么
VO类是指值对象(Value Object),它是一种在计算机编程中常用的概念。值对象是一种用于封装数据的对象,它的主要作用是表示某个特定的值或一组相关的值。
在软件开发中,我们经常需要处理各种数据,比如用户信息、订单信息等。而值对象就是用来表示这些数据的。它通常包含一些属性(比如姓名、年龄、价格等),这些属性的值可以根据需要进行修改。
与值对象相关的一个重要概念是不可变性。值对象通常是不可变的,也就是说一旦创建了一个值对象,它的属性值就不能再被修改。这样可以确保值对象的数据始终保持一致性,避免了数据被意外修改的风险。
值对象在软件开发中有很多应用场景,比如在领域驱动设计中,可以用值对象来表示领域中的概念;在数据传输中,可以用值对象来封装需要传输的数据;在函数式编程中,值对象可以作为函数的参数或返回值。
下面简单编写一下VO类,以及编写测试类一对多的关系(其它就不过多赘述了)
package com.ctb.vo;import com.ctb.model.User;
import com.ctb.model.UserRole;import java.util.ArrayList;
import java.util.List;/*** @author 彪* @remark* @create */
public class UserVo extends User{private List<UserRole> userroles = new ArrayList<>();public List<UserRole> getUserRoles() {return userRole;}public void setUserRoles(List<UserRole> userRoles) {this.userRoles = userRoles;}
}
测试类
package com.ctb.biz;import com.ctb.vo.UserVo;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;/*** @author 彪* @remark* @create */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:spring-mybatis.xml"})
public class UserBizTest {@Autowiredprivate UserBiz userBiz;@Testpublic void selectByUid() {//获取用户信息UserVo userVo = userBiz.selectByUid(7);System.out.println(userVo);
//获取角色信息userVo.getUserRole().forEach(System.out::println);}
}
六、总结
关联关系映射是MyBatis中非常重要的概念之一。通过合理地使用关联关系映射,我们可以更加方便地进行数据库操作,并提高代码的可读性和可维护性。在实际开发中,我们应根据具体的业务需求来选择合适的关联关系映射方式,并合理地设计数据库表结构。
相关文章:
MyBatis关联关系映射详解
前言 在使用MyBatis进行数据库操作时,关联关系映射是一个非常重要的概念。它允许我们在数据库表之间建立关联,并通过对象之间的关系来进行数据查询和操作。本文将详细介绍MyBatis中的关联关系映射,包括一对一、一对多和多对多关系的处理方法…...
常用电子元器件基础知识
目录 一、电阻 二、电容 三、电感 四、保险丝 五、二极管 一、电阻 概念:顾名思义,就是增加电流通过的阻力的。 就像是在水渠中放入东西,能阻止水的顺利通过也是一个道理。 基于电阻的电气特性,电阻在电路中主要有以下四个…...
git撤销还未push的的提交
怎样撤销掉上图中的提交呢 使用以下代码即可提交 git reset --soft HEAD^...
MySQL--数据库基础
数据库分类 数据库大体可以分为 关系型数据库 和 非关系型数据库 常用数据类型 数值类型: 分为整型和浮点型: 字符串类型 日期类型...
Excel相关笔记
1、找出B列中A列没有的数据并放在C列 公式:IF(ISNA(VLOOKUP(B1,$A 1 : 1: 1:A$4,1,FALSE)),B1,“”)...
RouterOS-配置PPPoEv4v6 Server
1 接口 ether3 出接口 ether4 内网接口 2 出接口 出接口采用PPPoE拨号SLAAC获取前缀,手动配置后缀 2.1 选择出接口interface,配置PPPoE client模式 2.2 配置PPPoE client用户名和密码 2.3 从PPPoE client获取前缀地址池 2.4 给出接口选择前缀并配置…...
PhpStorm软件安装包分享(附安装教程)
目录 一、软件简介 二、软件下载 一、软件简介 PhpStorm是一款由JetBrains开发的专业PHP集成开发环境(IDE),旨在提供全面的PHP开发支持。它是基于IntelliJ IDEA平台构建的,具有强大的功能和工具,可以帮助开发人员提高…...
JavaScript设计模式(三)——单例模式、装饰器模式、适配器模式
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
LeetCode:有序数组的平方
题目 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变…...
数学分析:势场
首先从散度的物理解释开始。首先,在球内的向量场的散度的积分,等于它在球边界上的流量的积分。所以根据积分中值定理,我们可以这么理解散度,它就是这个体积内的速度场的平均密度。而速度场只和源有关,所以它表示的某个…...
MySQL 中 MyISAM 与 InnoDB 引擎的区别
分析&回答 区别很多,大家说出下面几点,面试就应该 OK 了 1) 事务支持 MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速…...
【javascript】禁止浏览器调试前端页面
目录 为啥要禁止?无限 debugger基础禁止调试解决对策 为啥要禁止? 由于前端页面会调用很多接口,有些接口会被别人爬虫分析,破解后获取数据,为了杜绝这种情况,最简单的方法就是禁止人家调试自己的前端代码 …...
Oracle Non-CDB配置 TDE(透明数据加密) 的过程
说明 此文档虽然是针对non CDB而写,但是对于CDB的操作过程也是类似的,即在CDB$ROOT中设置完成wallet设置后,在PDB中设置和打开MEK即可。 先决条件 请确保目录$ORACLE_SID/admin/$ORACLE_SID存在,例如此目录为: /u01/app/oracl…...
MySQL——常见问题
NULL和空值的区别 1、空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时,只能查出字段中没有不为NULL的或者为 NULL 的,不能查出空值。 3、判断NULL 用IS NULL 或者 is no…...
在FPGA上快速搭建以太网
在本文中,我们将介绍如何在FPGA上快速搭建以太网 (LWIP )。为此,我们将使用 MicroBlaze 作为主 CPU 运行其应用程序。 LWIP 是使用裸机设计以太网的良好起点,在此基础上我们可以轻松调整软件应用程序以提供更详细的应用…...
如何防范 AI 盗取你的密码
现如今,随着人工智能(AI)应用的普及和快速迭代,几乎任何人都可以轻而易举地利用AI进行密码破解之类的攻击。这已经引起了业界的担忧。下面,我将围绕着:密码破解究竟意味着什么,基于AI的密码猜测…...
华清远见第六课程作业day3
类 栈 #include <iostream>using namespace std;class Sta{ private:int *data;int top; public:Sta():data(new int(128)){top-1;cout<<"stack::无参构造:"<<endl;}~Sta(){delete data;cout<<"stack::析构函数:"<<this<…...
Rabbitmq配置定义
RabbitMQ 环境变量 RabbitMQ 的环境变量都是以"RABBITMQ_"开头的,可以在Shell 环境中设置,也可以在配置文件中定义。默认的配置文件如下: ## /etc/rabbitmq/rabbitmq-env.conf 定义配置文件: /va/lib/rabbitmq/ 的目…...
2023年数模国赛时间分配
2023年数模国赛时间分配 写在前面赛前准备第一天(9.7 18:00发布题目)第二天(9.8)第三天(9.9)第四天(9.10 20:00提交)总结 写在前面 国赛马上就要开始啦 今年的比赛时间是9月7日&…...
kubernetes(K8S)笔记
文章目录 大佬博客简介K8SDocker VS DockerDockerK8S简介K8S配合docker相比较单纯使用docker 大佬博客 Kubernetes(通常缩写为K8s)是一个用于自动化容器化应用程序部署、管理和扩展的开源容器编排平台。它的构造非常复杂,由多个核心组件和附加…...
Burp Suite实战进阶:用LingJing内置的burp-labs靶机打通从入门到专家22关(含解题思路)
Burp Suite实战进阶:用LingJing内置的burp-labs靶机打通从入门到专家22关(含解题思路) 在网络安全领域,Burp Suite无疑是渗透测试工程师最得力的工具之一。然而,很多学习者在掌握了基础操作后,往往会陷入&q…...
FindSomething:革新性网页智能信息提取工具完全指南
FindSomething:革新性网页智能信息提取工具完全指南 【免费下载链接】FindSomething 基于chrome、firefox插件的被动式信息泄漏检测工具 项目地址: https://gitcode.com/gh_mirrors/fi/FindSomething 在数字时代,网页中隐藏的敏感信息和数据模式往…...
YOLOv8工业缺陷检测推理延迟骤降63%:基于TensorRT量化+ONNX Runtime定制化内核的完整链路
第一章:YOLOv8工业缺陷检测推理延迟骤降63%:基于TensorRT量化ONNX Runtime定制化内核的完整链路在高吞吐产线场景下,YOLOv8原生PyTorch模型在Jetson AGX Orin上单帧推理延迟达84.2ms(输入尺寸640640),严重制…...
Python 装饰器实战:用@syntax 优雅地增强函数功能
# Python 装饰器实战:用syntax 优雅地增强函数功能## 什么是装饰器?装饰器(Decorator)是 Python 中的一种高级特性,它允许你在不修改原函数代码的情况下,动态地给函数添加功能。简单来说,装饰器…...
如何在Mac上免费本地运行Stable Diffusion:Mochi Diffusion终极指南
如何在Mac上免费本地运行Stable Diffusion:Mochi Diffusion终极指南 【免费下载链接】MochiDiffusion Run Stable Diffusion on Mac natively 项目地址: https://gitcode.com/gh_mirrors/mo/MochiDiffusion 还在寻找能在Mac上完美运行Stable Diffusion的免费…...
刚刚,英伟达革了自己的命:智能体自主进化7天,干掉所有算子工程师、GPU专家
这应该是今天刚刚出炉的、最炸裂的文章。在很多算子开发的微信群组,已经掀起了轩然大波。「这或许是超人类智能在软件领域的真正首次展露。」英伟达许冰刚刚在 X 上发出了如此断言。他所评论的,正是他与 Terry Chen 和 Zhifan Ye 为共同一作的一项英伟达…...
AR.js实战指南:如何在Web浏览器中构建高效增强现实应用
AR.js实战指南:如何在Web浏览器中构建高效增强现实应用 【免费下载链接】AR.js Image tracking, Location Based AR, Marker tracking. All on the Web. 项目地址: https://gitcode.com/gh_mirrors/arj/AR.js 在移动设备普及的今天,增强现实&…...
OpenClaw技能开发指南:为ollama-QwQ-32B编写自定义模块
OpenClaw技能开发指南:为ollama-QwQ-32B编写自定义模块 1. 为什么需要自定义技能开发 上周我需要每天手动查询三个城市的天气数据来生成日报,这种重复劳动让我开始思考:能否让OpenClaw帮我自动完成?当我发现现有的天气技能包都不…...
Phi-4-Reasoning-Vision惊艳案例:模糊图像增强后多步逻辑推理还原
Phi-4-Reasoning-Vision惊艳案例:模糊图像增强后多步逻辑推理还原 1. 项目概述 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具,专为双卡4090环境优化。这款工具能够处理复杂的图像推理任务,…...
EasyAnimateV5-7b-zh-InP在计算机网络教学视频生成中的应用
EasyAnimateV5-7b-zh-InP在计算机网络教学视频生成中的应用 1. 引言 计算机网络课程的教学一直面临着一个难题:如何将抽象的网络协议、拓扑结构和数据传输过程直观地展示给学生。传统的静态图片和文字描述往往难以让学生真正理解数据包是如何在网络中流动的&#…...
