MyBatis中至关重要的关系映射----全方面介绍

目录

一 对于映射的概念

1.1 三种关系映射

1.2 resultType与resultMap的区别

resultType:

resultMap:

二,一对一关联查询

2.1 嵌套结果集编写

2.2 案例演示

三,一对多关联查询

3.1 嵌套结果集编写

 3.3 案例演示

四,多对多关联查询 

4.1 嵌套结果集编写

 4.2 案例演示

一 对于映射的概念

     在关系型数据库中,表与表之间存在着三种关联映射关系,分别为一对一关系、一对多关系和多对多关系。  那在 MyBatis 中,通过 association 元素来处理对象与对象之间关联关系,association 元素提供了一系列属性用于维护数据表之间的关系。association 元素是 resultMap元素的子元素,它有两种配置方式,嵌套查询方式和嵌套结果集方式。

1.1 三种关系映射

一对一关联映射:

      这种关系表示两个实体类之间存在唯一的对应关系,通常通过在表之间使用外键来建立连接。在 MyBatis 中可以使用 association 元素来实现一对一关联映射

一对多关联映射:

     这种关系表示一个实体类关联多个其他实体类的实例。例如,在数据库中,一个文章可以对应多个评论。在 MyBatis 中可以使用 collection 元素来实现一对多关联映射

多对多关联映射:

         这种关系表示两个实体类之间存在多对多的关系,通常通过中间表来实现。例如,一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。在 MyBatis 中可以使用中间表和联合查询来实现多对多关联映射。

1.2 resultType与resultMap的区别

resultType:

使用 resultType,我们直接指定了查询结果的类型,它通常用于简单的查询语句,不需要复杂的映射关系。优点是简单直观,缺点是不能进行复杂的映射操作(实体类没有该属性的情况)。

resultMap:

    而使用 resultMap,我们可以更加灵活地映射查询结果到任意类型的 Java 对象上。通过定义一个 resultMap,我们可以指定每个查询结果列与 Java 对象属性之间的映射关系。优点是功能强大,可以进行各种复杂的映射操作,缺点是需要编写更多的 XML 配置代码

二,一对一关联查询

这里需要建一个VO类,VO是Value Object的缩写,是一轻量级的数据结构,用于在视图层与业务逻辑层之间传递数据。VO通常用于表示视图层所需的数据,这些数据来自于业务逻辑层或数据访问层。VO的主要目的是将业务逻辑层的数据结构转换为视图层可以使用的数据结构 。简单来说就是用于关系映射时的结果接收

下面我们利用订单项以及订单来描述一对一的关系,所以我们建立一个OrderitemVo

OrderitemVo:

public class OrderitemVo extends Orderitem {private Order order;public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}

2.1 嵌套结果集编写

<resultMap id="OrderitemvoMap" type="com.Bing.vo.OrderitemVo"><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><association property="order" javaType="com.Bing.model.Order"><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result></association></resultMap><select id="selectByOiid" resultMap="OrderitemvoMap" parameterType="java.lang.Integer">select * from t_hibernate_order o,t_hibernate_order_item oi where o.order_id=oi.oid and oi.order_item_id=#{oiid}</select>

2.2 案例演示

接口类并实现

接口Biz编写:

public interface OrderitemBiz {OrderitemVo selectByOiid(Integer oiid);
}

实现类Impl类继承Biz:

@Service
public class OrderitemImpl implements OrderitemBiz {@Autowiredprivate OrderitemMapper OrderitemMapper;@Overridepublic OrderitemVo selectByOiid(Integer oiid) {return OrderitemMapper.selectByOiid(oiid);}
}

Test类编写:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderitemImplTest {@Autowiredprivate OrderitemBiz OrderitemBiz;@Testpublic void selectByOiid() {OrderitemVo orderitemVo = OrderitemBiz.selectByOiid(27);System.out.println(orderitemVo);System.out.println(orderitemVo.getOrder());}
}

测试运行结果:

三,一对多关联查询

下面我们利用订单以及订单项来描述一对多的关系,所以我们建立一个OrderVo。

注意:要使用list集合

public class OrderVo extends Order {private List<Orderitem> orderitems=new ArrayList<>();public List<Orderitem> getOrderitems() {return orderitems;}public void setOrderitems(List<Orderitem> orderitems) {this.orderitems = orderitems;}@Overridepublic String toString() {return "OrderVo{" +"orderitems=" + orderitems +'}';}
}

3.1 嵌套结果集编写

 <resultMap id="OrderMap" type="com.Bing.vo.OrderVo" ><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result><collection property="orderitems" ofType="com.Bing.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><select id="byOid" resultMap="OrderMap" parameterType="java.lang.Integer" >select * from t_hibernate_order o,t_hibernate_order_item oi where o.order_id=oi.oidand o.order_id=#{oid}</select>

 3.3 案例演示

接口类并实现

接口Biz编写:

public interface OrderBiz {OrderVo byOid(Integer id);
}

实现Impl类继承Biz:

@Service
public class OrderBizImpl implements OrderBiz {@Autowiredprivate OrderMapper orderMapper;@Overridepublic OrderVo byOid(Integer id) {return orderMapper.byOid(id);}
}

Test类编写:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderBizImplTest {
@Autowired
private OrderBiz orderBiz;@Testpublic void byOid() {OrderVo orderVo = orderBiz.byOid(7);System.out.println(orderVo);orderVo.getOrderitems().forEach(System.out::println);}
}

测试类运行结果:

四,多对多关联查询 

我们以书籍有多个类别以及每个类别又有多本书的这种关系来实操多对多关系的查询

HbookVo:

public class HbookVo  extends HBook {private List<HCategory> hcategory;public List<HCategory> getHcategory() {return hcategory;}public void setHcategory(List<HCategory> hcategory) {this.hcategory = hcategory;}
}

4.1 嵌套结果集编写

<resultMap id="HbookVo" type="com.Bing.vo.HbookVo" ><result column="book_id" property="bookId"></result><result column="book_name" property="bookName"></result><result column="price" property="price"></result><collection property="hcategory" ofType="com.Bing.model.HCategory"><result column="category_id" property="categoryId"></result><result column="category_name" property="categoryName"></result></collection></resultMap><select id="selectByBid" resultMap="HbookVo" parameterType="java.lang.Integer">SELECT*
FROMt_hibernate_book b,t_hibernate_book_category bc,t_hibernate_category c
WHEREb.book_id = bc.bidAND bc.cid = c.category_idAND b.book_id =#{bid}</select>

 4.2 案例演示

接口类并实现

接口Biz编写:

public interface HBookBiz {HbookVo selectByBid(Integer bid);
}

实现类Impl类继承Biz:

@Service
public class HBookBizImpl implements HBookBiz {@Autowiredprivate HBookMapper hbookMapper;@Overridepublic HbookVo selectByBid(Integer bid) {return hbookMapper.selectByBid(bid);}
}

Test类编写:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HBookBizImplTest {@Autowiredprivate HBookBiz hbookBiz;@Testpublic void selectByBid() {HbookVo hbookVo = hbookBiz.selectByBid(8);System.out.println(hbookVo);hbookVo.getHcategory().forEach(System.out::println);}
}

Test类运行结果:

                                好啦,今天的分享就到这了,希望能够帮到你呢!😊😊   

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

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

相关文章

统计教程|PASS实现两计量指标的的Pearson相关分析时的样本量估计

在临床研究中我们经常会研究两个观察指标间是否有联系&#xff0c;如人的身高与体重、体温与脉搏次数、药物剂量与反应等&#xff0c;相关分析就是研究观察指标间相关关系的统计方法&#xff0c;由于不同资料类型其分析方法有所差异&#xff0c;故本节主要讲解的是定量资料的线…

综合实训-------成绩管理系统 V1.1

综合实训-------成绩管理系统 V1.1 1、一维数组数据double 2、我们用元素的位置来当学号。 1、录入数据 【5个数据】或【通过文件的方式取数据】 2、显示数据 3、添加一条记录 4、修改一条记录 5、删除一条记录 6、查找一条记录。【输入学号&#xff0c;显示成绩】 7、统计。【…

使用Python进行Base64编码和解码

假设您有一个想要通过网络传输的二进制图像文件。您很惊讶对方没有正确接收该文件 - 该文件只是包含奇怪的字符&#xff01; 嗯&#xff0c;您似乎试图以原始位和字节格式发送文件&#xff0c;而所使用的媒体是为流文本而设计的。 避免此类问题的解决方法是什么&#xff1f;答…

说说你了解的 Nginx

分析&回答 nginx性能数据 高并发连接: 官方称单节点支持5万并发连接数&#xff0c;实际生产环境能够承受2-3万并发。内存消耗少: 在3万并发连接下&#xff0c;开启10个nginx进程仅消耗150M内存 (15M10150M) 1. 正向、反向代理 所谓“代理”&#xff0c;是指在内网边缘 …

C++信息学奥赛1177:奇数单增序列

#include<bits/stdc.h> using namespace std; int main(){int n;cin>>n; // 输入整数 n&#xff0c;表示数组的大小int arr[n]; // 创建大小为 n 的整型数组for(int i0;i<n;i) cin>>arr[i]; // 输入数组元素for(int i0;i<n;i){ // 对数组进行冒泡排序f…

uniapp-秋云图表 ucharts echarts 对比与关系

科普&#xff1a; 秋云图表库&#xff0c;包含二种配置属性对应二种js配置文件。 一种是 &#xff1a;echarts.js,一种是 &#xff1a; ucharts。 二者的配置属性不一样&#xff01; ucharts和echarts对比 ucharts和echarts都是用于数据可视化的开源JavaScript库&#xff0c;它…

gRPC-Gateway 快速实战

今天来分享一波 gRPC-Gateway &#xff0c; 之前咱们有分享过什么是 gRPC 及其使用方式&#xff0c;可以看看这些关于 gRPC 的历史文章&#xff1a; gRPC介绍 gRPC 客户端调用服务端需要连接池吗&#xff1f; gRPC的拦截器 gRPC的认证 分享一下 gRPC- HTTP网关 I 今天主要是分…

Python学习教程:进程的调度

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 要想多个进程交替运行&#xff0c;操作系统必须对这些进程进行调度&#xff0c; 这个调度也不是随即进行的&#xff0c;而是需要遵循一定的法则&#xff0c;由此就有了进程的调度算法。 python更多源码/资料/解答/教程等 …

keepalived 主备都存在vip, keepalived主备跨网段配置;keepalived主备服务器不在同一个网段怎么配置

keepalived 主备都有vip问题&#xff1b;主备服务器不在同一个网段怎么配置 主机&#xff1a;128.192.10.10 备机&#xff1a;128.192.11.11 备机&#xff1a;128.192.22.22 # keepalived的配置文件增加如下配置即可实现 # 主机&#xff1a;128.192.10.10 vrrp_instance VI_1 {…

uni-app 之 安装uView,安装scss/sass编译

uni-app 之 安装uView&#xff0c;安装scss/sass编译 image.png image.png image.png 点击HBuilder X 顶部&#xff0c;工具&#xff0c;插件安装&#xff0c;安装新插件 image.png image.png 安装成功&#xff01; 注意&#xff0c;一定要先登录才可以安装 image.png 1. 引…

【python】—— 函数详解

前言&#xff1a; 本期&#xff0c;我们将要讲解的是有关python中函数的相关知识&#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;函数是什么 &#xff08;二&#xff09;语法格式 &#xff08;三&#xff09;函数参数 &#xff08;四&#xff09;函…

webpack实战:某网站JS逆向分析

文章目录 1. 写在前面2. 抓包分析3. 扣加密代码 1. 写在前面 好的逆向能够帮助我们了解加密实现&#xff0c;然后根据加密方式&#xff08;md5,base64,res,des,rsa…)还原加密算法的过程。可以看看我之前的这篇文章&#xff1a;快速定位查找加密方式特征与技巧 目标站点&#…

什么是rem单位和em单位?它们有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ rem 和 em 单位⭐ rem 单位&#xff08;Root Em&#xff09;⭐ em 单位⭐ 区别总结⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入…

java八股文面试[多线程]——newWorkStealingPool

newWorkStealingPool是什么&#xff1f; newWorkStealingPool简单翻译是任务窃取线程池。 newWorkStealingPool 是Java8添加的线程池。和别的4种不同&#xff0c;它用的是ForkJoinPool。 使用ForkJoinPool的好处是&#xff0c;把1个任务拆分成多个“小任务”&#xff0c;把这…

UDP 广播

一、UDP 通信图解 UDP通信、本地套接字_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/132523536?spm1001.2014.3001.5501 #include <sys/types.h> #include <sys/socket > ssize_t sendto(in…

hadoop学习:mapreduce的wordcount时候,继承mapper没有对应的mapreduce的包

踩坑描述&#xff1a;在学习 hadoop 的时候使用hadoop 下的 mapreduce&#xff0c;却发现没有 mapreduce。 第一反应就是去看看 maven 的路径对不对 settings——》搜索框搜索 maven 检查一下 Maven 路径对不对 OK 这里是对的 那么是不是依赖下载失败导致 mapreduce 没下下…

MySQL总复习

目录 登录 显示数据库 创建数据库 删除数据库 使用数据库 创建表 添加数据表数据 查询表 添加数据表多条数据 查询表中某数据 增insert 删delete 改update 查select ​ where like ​编辑 范围查找 order by 聚合函数 count max min sum avg g…

风险评估

风险评估概念 风险评估是一种系统性的方法&#xff0c;用于识别、评估和量化潜在的风险和威胁&#xff0c;以便组织或个人能够采取适当的措施来管理和减轻这些风险。 风险评估的目的 风险评估要素关系 技术评估和管理评估 风险评估分析原理 风险评估服务 风险评估实施流程

提升生产效率,降低运维成本:纺织业物联网网关应用

在众多物联网技术应用中纺织业正逐渐崭露头角。物联网技术通过无线连接纺织设备、PLC、传感器&#xff0c;实现了纺织厂的生产数据信息的远程监控和数据采集、远程管理&#xff0c;为企业提供了更高效、智能的生产方式。智联物联小编在本文中将重点介绍纺织业物联网的应用与通讯…

【USRP】调制解调系列7:GMSK、MSK、基于labview的实现

MSK 在数字调制中&#xff0c;最小频移键控&#xff08;Minimum-Shift Keying&#xff0c;缩写&#xff1a;MSK&#xff09;是一种连续相位的频移键控方式&#xff0c;在1950年代末和1960年代产生。与偏移四相相移键控&#xff08;OQPSK&#xff09;类似&#xff0c;MSK同样将…