MyBatis关系映射
文章目录
- 前言
- 一、一对一映射
- 1.1 创建实体
- 1.2 xml配置
- 二、一对多映射
- 2.1 创建实体
- 2.2 resultMap配置
- 2.3 测试
- 三、 多对多映射
- 3.1 创建实体
- 3.2 resultMap配置
- 3.3 测试
前言
MyBatis是一个Java持久化框架,它提供了一种将数据库表和Java对象之间进行关系映射的方式。这种关系映射可以通过XML配置文件或注解来定义。
在MyBatis中,关系映射是通过Mapper接口和SQL语句来实现的。Mapper接口定义了数据库操作的方法,而SQL语句则定义了具体的数据库操作。
在关系映射中,MyBatis提供了一些注解和XML配置来实现对象和数据库表之间的映射关系。例如,@Table注解可以用于指定Java对象对应的数据库表,@Column注解可以用于指定Java对象属性对应的数据库字段。
此外,MyBatis还支持一对一、一对多、多对一和多对多等复杂的关系映射。通过配置关联关系,可以在查询时自动加载相关联的对象。
一、一对一映射
一对一映射是指数据库中的两个表之间存在一对一的关系,即一个记录在一个表中只对应一个记录在另一个表中的情况。
1.1 创建实体
假设我们有两个表:student(学生表)和 id_card(身份证表)。每个学生只有一个身份证,而每个身份证只属于一个学生。
public class Student {private int id;private String name;private IdCard idCard;// 省略构造函数和getter/setter方法
}public class IdCard {private int id;private String number;private Student student;// 省略构造函数和getter/setter方法
}
1.2 xml配置
使用XML配置的方式,可以在Student类对应的中使用标签来定义关联关系:
<resultMap id="studentResultMap" type="com.xqx.model.Student"><!-- 省略其他映射配置 --><association property="idCard" javaType="com.xqx.model.IdCard"><id property="id" column="id_card_id"/><result property="number" column="id_card_number"/></association>
</resultMap>
通过以上配置,我们可以在查询学生信息时,自动加载关联的身份证信息。
二、一对多映射
一对多映射是指数据库中的两个表之间存在一对多的关系,即一个记录在一个表中对应多个记录在另一个表中的情况。例如,一个订单(Oeder)与一个订单详情(OrderItem)之间的关系。假设我们有以下表结构:

2.1 创建实体
建立一个OrderVo。OrderVo 类用于表示一个订单及其关联的订单项。
package com.xqx.vo;import com.xqx.model.Order;
import com.xqx.model.OrderItem;
import lombok.Data;import java.util.ArrayList;
import java.util.List;@Data
public class OrderVo extends Order {private List<OrderItem> orderItems = new ArrayList<>();
}
2.2 resultMap配置
<resultMap id="OrderVoMap" type="com.xqx.vo.OrderVo"><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result>//多关系使用collection<collection property="orderItems" ofType="com.xqx.model.OrderItem"><result column="order_item_id" property="orderItemId"></result><result column="product_id" property="productId"></result><result column="quantity" property="quantity"></result><result column="oid" property="oid"></result></collection></resultMap>
2.3 测试
OrderMapper
package com.xqx.mapper;import com.xqx.model.Order;
import com.xqx.vo.OrderVo;
import org.springframework.stereotype.Repository;@Repository
public interface OrderMapper {OrderVo selectbyOid(Integer boid);}
OrderBiz
package com.xqx.biz;import com.xqx.vo.OrderVo;public interface OrderBiz {OrderVo selectbyOid(Integer boid);
}
OrderBizImpl
package com.xqx.biz;import com.xqx.mapper.OrderMapper;
import com.xqx.vo.OrderVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class OrderBizImpl implements OrderBiz {@Autowiredprivate OrderMapper OrderMapper;@Overridepublic OrderVo selectbyOid(Integer boid) {return OrderMapper.selectbyOid(boid);}
}
Junit测试
package com.xqx.biz;import com.xqx.vo.OrderVo;
import org.junit.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;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:Spring-context.xml"})
public class OrderBizImplTest {@Autowiredprivate OrderBiz OrderBiz;@Testpublic void selectbyOid() {OrderVo orderVO = OrderBiz.selectbyOid(7);System.out.println(orderVO);orderVO.getOrderItems().forEach(System.out::println);}
}
测试结果

三、 多对多映射
多对多映射是指多个对象与多个对象具有多对多的关系。以根据书籍id查找关联属性类别为例

3.1 创建实体
vo对象
package com.xqx.vo;import com.xqx.model.BookCategory;
import com.xqx.model.Book;
import lombok.Data;
import java.util.List;@Data
public class BookVo extends Book {private List<BookCategory> bookc = new ArrayList<>();
}
3.2 resultMap配置
<resultMap id="BookVoMap" type="com.xqx.vo.BookVo" ><result column="book_id" property="bookId"></result><result column="book_name" property="bookName"></result><result column="price" property="price"></result><collection property="bookc" ofType="com.xqx.model.Category"><result column="category_id" property="categoryId"></result><result column="category_name" property="categoryName"></result></collection></resultMap><!--根据书籍的id查询书籍的信息及所属属性--><select id="selectByBookId" resultMap="BookVoMap" parameterType="java.lang.Integer">SELECT*FROMt_hibernate_book b,t_hibernate_category c,t_hibernate_book_category bcWHEREb.book_id = bc.bidAND c.category_id = bc.bcidAND b.book_id = #{bid}</select>
3.3 测试
BookMapper
package com.xqx.mapper;import com.xqx.model.Book;
import com.xqx.vo.BookVo;
import org.springframework.stereotype.Repository;@Repository
public interface BookMapper {HbookVo selectByBid(Integer bid);}
BookBiz
package com.xqx.biz;import com.xqx.vo.BookVo;public interface BookBiz {HbookVo selectByBid(Integer bid);
}
BookBizImpl
package com.xqx.biz;import com.xqx.mapper.BookMapper;
import com.xqx.vo.BookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class BookBizImpl implements BookBiz {@Autowiredprivate BookMapper BookMapper;@Overridepublic BookVo selectByBid(Integer bid) {return BookMapper.selectByBid(bid);}
}
junit测试
package com.xqx.biz;import com.xqx.vo.BookVo;
import org.junit.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;@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:Spring-context.xml"})
public class BookBizImplTest {@Autowiredprivate BookBiz BookBiz;@Testpublic void selectByBid() {BookVo bookVo = BookBiz.selectByBid(8);System.out.println(bookVo);BookVo.getHcategory().forEach(System.out::println);}
}

相关文章:
MyBatis关系映射
文章目录 前言一、一对一映射1.1 创建实体1.2 xml配置 二、一对多映射2.1 创建实体2.2 resultMap配置2.3 测试 三、 多对多映射3.1 创建实体3.2 resultMap配置3.3 测试 前言 MyBatis是一个Java持久化框架,它提供了一种将数据库表和Java对象之间进行关系映射的方式。…...
DVWA失效的访问控制
失效的访问控制,可以认为是系统对一些功能进行了访问或权限限制,但因为种种原因,限制并没有生效,造成失效的访问控制漏洞,比如越权等 这里以DVWA为例,先访问低难度的命令执行并抓包 删除cookie,并在请求头…...
docker 笔记2 Docker镜像和数据卷
参考: 1.镜像是什么?(面试题) 是一种轻量级、可执行的独立软件包,它包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文…...
java springboot 时间格式序列化 UTC8
背景 我们在项目中使用序列化和反序列化组件中,默认一般采用Jackson,如果遇到特殊配置,我们该怎么配置呢,大致有如下两种方式:采用配置文件【application.yml】和代码配置 配置文件 比如添加jackson节点 spring:jac…...
攻防世界-Get-the-key.txt
原题 解题思路 notepad看到,这应该是一个压缩包,解压。 但是解压的时候提示格式不对,不是zip,rar可以。解压出来有一个key.txt,打开就行。...
MyBatisPlus之DQL编程控制
🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 MyBatisPlus之DQL编程控制 一、 条件查询方式&…...
本地使用GFPGAN进行图像人脸修复
人脸修复 1.下载项目和权重文件2.部署环境3.下载权重文件4.运行代码5.网页端体验 首先来看一下效果图 1.下载项目和权重文件 https://github.com/iptop/GFPGAN-for-Video.git2.部署环境 根据README文件部署好环境,额外还需要: cd GFPGAN-1.3.8 pyt…...
Linux--进程概念
1.什么是程序?什么是进程?有什么区别? 程序:是静态的概念,gcc xxx.c -o pro 磁盘中生成的pro文件,叫做程序。 进程:是程序的一种与运行活动,通俗的意思是程序跑起来了,系…...
dex2oat编译模式、触发场景、命令强制执行
dex2oat简单理解就是把delvik虚拟机的可执行文件dex转化成AndroidRuntime虚拟机的可执行文件oat。 Android T版本由PKMS下发命令、native层进程installd负责具体执行dex2oat操作。installd回去调用dex2oat64完成编译工作,可以将dex2oat64理解成一个程序。源码路径&…...
深度学习 | TCN时间卷积神经网络模型答疑
深度学习 | TCN时间卷积神经网络模型答疑 目录 深度学习 | TCN时间卷积神经网络模型答疑问题汇总问题回答参考资料问题汇总 1.使用 TCN 进行序列建模有哪些优势? 2.TCN 的特征? 问题回答 1.使用 TCN 进行序列建模具备以下优势: 并行性。与 RNN 中后继时间步长的预测必须等待…...
Linux之修改服务端口号
本次演示以SSH服务为例,SSH默认监听端口是22,先保留了22端口,所以我们要进入ssh的配置文件添加新端口并注释或删掉原有端口。 1、使用vi编辑器修改文件 sshd_config,路径是/etc/ssh/sshd_config,找到“#Port 22”,添加新的端口号10086。 2、如果你关闭了…...
LeetCode笔记:Weekly Contest 361
LeetCode笔记:Weekly Contest 361 0. 吐槽1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-361 0. …...
Springboot快速搭建Web API项目
内容概述 SpringBoot最常见得用途就是web api项目。 本文介绍使用自动配置功能,通过最简洁的pom依赖,快速搭建一个示例项目。 实现的功能为:接收http请求并返回json格式的数据。 一、配置pom.xml依赖 1.引入springweb依赖 <dependenc…...
数据结构day06(单向循环链表、双向链表)
双向链表的练习代码 head.h #ifndef __HEAD_H__ #define __HEAD_H__ #include <stdio.h> #include <stdlib.h> #include <string.h> typedef int database; typedef struct double_link_list{union{database data;int len;};struct double_link_list* pre;…...
zabbix -- 新建主机
目录 一、新建主机 二、新建监控项 IP主机192.168.136.55zabbix控制端/服务端192.168.136.56zabbix被控端/客户端 一、新建主机 主机参数 名称、群组(每台主机必须属于某个主机组内)、ip、端口 创建完成,如果你的ZBX为灰色,代…...
=>符号含义
>主要有两方面的作用,一个限制属性状态,另一个简化匿名委托和Lambda 用法一:定义只读属性 public class ManPeople { public string Sex > "男";public string Name { get; set; }}public class WomanPeople { publi…...
Docker+Jenkins(blueocean)+Gitee构建CICD流水线实战
一、配置JDK 1.1 编辑profile文件 vim /etc/profile export JAVA_HOME/home/jdk/jdk1.8.0_301 export JRE_HOME$JAVA_HOME/jre export CLASSPATH.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib export PATH$PATH:$JAVA_HOME/bin:$JRE_HOME/bin 1.2 使配置生效 source /etc/pro…...
Redis快速入门
文章目录 0. Redis介绍1. Centos下Redis安装2. redis.conf配置文件介绍3. redis相关命令4.redis中发布订阅和事务4.1 发布订阅(Pub/Sub)4.2 事务 5. redis封装系统服务6. 问题与解决6.1 启动Redis报错:Could not create Server TCP listening…...
EasyExcel 修改导出的文件属性
EasyExcel 修改导出的文件属性 导出的文件有多种属性,本文只针对sheet名称进行举例 需要自定义拦截器 ExcelWriter excelWriter EasyExcel.write(fileName).withTemplate(stream).registerWriteHandler(new TemplateSheetStrategyHandler()).build()registerWriteHandler (n…...
电子班牌云平台系统——智慧校园管理工具,多媒体信息发布、走班排课、家校互通、物联控制、教务管理、考勤管理、素质评价、日常办公
电子班牌云平台源码,saas模式微服务架构 电子班牌是一款智慧校园管理工具,也是校园多媒体展示平台。智慧班牌融合了多媒体信息发布、走班排课、家校互通、物联控制、教务管理、考勤管理、素质评价、日常办公等一系列应用,是校园管理的现代化手…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
