“MyBatis中的关联关系配置与多表查询“

目录

  • 引言
    • 一、一对多关系配置
    • 二、一对一关系配置
    • 三、多对多关系配置
    • 总结

在这里插入图片描述

引言

在数据库应用开发中,经常会遇到需要查询多个表之间的关联关系的情况。MyBatis是一个流行的Java持久层框架,它提供了灵活的配置方式来处理多表查询中的一对多、一对一和多对多关系。本文将介绍如何在MyBatis中配置和使用这些关联关系。

一、一对多关系配置

在数据库中,一对多关系是指一个表的一条记录对应另一个表的多条记录。在MyBatis中,我们可以通过以下步骤来配置和使用一对多关系:

  1. 创建实体类
    首先,我们需要创建两个实体类,分别表示一对多关系中的一方和多方。例如,我们创建一个Order类和一个OrderItem类,其中一个订单可以对应多个订单项。

public class Order {private Long id;private String orderNo;private List<OrderItem> orderItems;// 省略getter和setter方法
}public class OrderItem {private Long id;private String productName;// 省略getter和setter方法
}package com.yuan.vo;import com.yuan.model.Order;
import com.yuan.model.OrderItem;import java.util.ArrayList;
import java.util.List;/*** @author 叶秋* @site* @company 卓京公司* @create 2023-09-01 11:48*/
public class OrderVO extends Order {private List<OrderItem> list = new ArrayList<>();public List<OrderItem> getList() {return list;}public void setList(List<OrderItem> list) {this.list = list;}
}
  1. 创建Mapper接口和XML文件
    接下来,我们需要创建Mapper接口和对应的XML文件来定义查询方法和SQL语句。在XML文件中,我们可以使用MyBatis的标签来配置一对多关系。
<!-- OrderMapper.xml -->
<mapper namespace="com.yuan.mapper.OrderMapper"><resultMap id="OrderVoMap" type="com.yuan.vo.OrderVO" ><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result><collection property="list" ofType="com.yuan.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="demo1" resultMap="OrderVoMap" parameterType="java.lang.Integer" >select * from t_hibernate_order o ,t_hibernate_order_item oit where o.order_id = oit.oid and o.order_id = #{oid}</select>
</mapper>
  1. 编写查询方法
    最后,我们在Mapper接口中定义查询方法,并在XML文件中配置对应的SQL语句。
package com.yuan.Biz;import com.yuan.vo.OrderVO;/*** @author 叶秋* @site* @company 卓京公司* @create 2023-09-01 13:08*/
public interface OrderBiz {OrderVO demo1(Integer oid);
}
  1. 使用一对多关系查询
    现在,我们可以在代码中使用一对多关系查询了。
package com.yuan.Biz.Impl;import com.yuan.Biz.OrderBiz;
import com.yuan.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;/*** @author 叶秋* @site* @company 卓京公司* @create 2023-09-01 13:13*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})public class OrderBizImplTest {@Autowiredprivate  OrderBiz orderBiz;@Testpublic void demo1() {OrderVO orderVO = orderBiz.demo1(7);System.out.println(orderVO);orderVO.getList().forEach(System.out::println);}
}

二、一对一关系配置

  1. 创建实体类
    首先,我们需要创建两个实体类,分别表示一对多关系中的一方和一方。例如,我们创建一个Order类和一个OrderItem类,其中一个订单可以对应一个订单项。

public class Order {private Long id;private String orderNo;private List<OrderItem> orderItems;// 省略getter和setter方法
}public class OrderItem {private Long id;private String productName;// 省略getter和setter方法
}package com.yuan.vo;import com.yuan.model.Order;
import com.yuan.model.OrderItem;/*** @author 叶秋* @site* @company 卓京公司* @create 2023-09-01 13:58*/
public class OrderItemVo extends OrderItem {private Order order;public Order getOrder() {return order;}public void setOrder(Order order) {this.order = order;}
}
  1. 创建Mapper接口和XML文件
    接下来,我们需要创建Mapper接口和对应的XML文件来定义查询方法和SQL语句。在XML文件中,我们可以使用MyBatis的标签来配置一对一关系。
 <resultMap id="OrderItemVoMap" type="com.yuan.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.yuan.model.Order"><result column="order_id" property="orderId"></result><result column="order_no" property="orderNo"></result></association></resultMap><select id="demo2" resultMap="OrderItemVoMap" parameterType="java.lang.Integer" >select * from t_hibernate_order o ,t_hibernate_order_item oit where o.order_id = oit.oid and oit.order_item_id = #{oiid}</select>
  1. 编写查询方法
    最后,我们在Mapper接口中定义查询方法,并在XML文件中配置对应的SQL语句。

package com.yuan.Biz;import com.yuan.model.OrderItem;/*** @author 叶秋* @site* @company 卓京公司* @create 2023-09-01 14:03*/
public interface OrderItemBiz {OrderItem demo2( Integer oiid);
}
  1. 使用一对一关系查询
    现在,我们可以在代码中使用一对多关系查询了。
package com.yuan.Biz.Impl;import com.yuan.Biz.OrderItemBiz;
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;/*** @author 叶秋* @site* @company 卓京公司* @create 2023-09-01 14:06*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class OrderItemBizImplTest {@Autowiredprivate OrderItemBiz orderItemBiz;@Testpublic void demo2() {System.out.println(orderItemBiz.demo2(27));}
}

三、多对多关系配置

在数据库中,多对多关系是指两个表之间存在多对多的关系。在MyBatis中,我们可以通过以下步骤来配置和使用多对多关系:

  1. 创建实体类
    首先,我们需要创建两个实体类,分别表示多对多关系中的两个表。例如,我们创建一个User类和一个Role类,一个用户可以拥有多个角色,一个角色也可以被多个用户拥有。
package com.yuan.model;import lombok.ToString;@ToString
public class HBook {private Integer bookId;private String bookName;private Float price;public HBook(Integer bookId, String bookName, Float price) {this.bookId = bookId;this.bookName = bookName;this.price = price;}public HBook() {super();}public Integer getBookId() {return bookId;}public void setBookId(Integer bookId) {this.bookId = bookId;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public Float getPrice() {return price;}public void setPrice(Float price) {this.price = price;}
}package com.yuan.model;import lombok.ToString;@ToString
public class HBookCategory {private Integer bcid;private Integer bid;private Integer cid;public HBookCategory(Integer bcid, Integer bid, Integer cid) {this.bcid = bcid;this.bid = bid;this.cid = cid;}public HBookCategory() {super();}public Integer getBcid() {return bcid;}public void setBcid(Integer bcid) {this.bcid = bcid;}public Integer getBid() {return bid;}public void setBid(Integer bid) {this.bid = bid;}public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}
}package com.yuan.model;import lombok.ToString;@ToString
public class HCategory {private Integer categoryId;private String categoryName;public HCategory(Integer categoryId, String categoryName) {this.categoryId = categoryId;this.categoryName = categoryName;}public HCategory() {super();}public Integer getCategoryId() {return categoryId;}public void setCategoryId(Integer categoryId) {this.categoryId = categoryId;}public String getCategoryName() {return categoryName;}public void setCategoryName(String categoryName) {this.categoryName = categoryName;}
}package com.yuan.vo;import com.yuan.model.HBook;
import com.yuan.model.HCategory;import java.util.List;/*** @author 叶秋* @site* @company 卓京公司* @create 2023-09-01 20:35*/
public class HbookVo extends HBook {private List<HCategory> categories ;public List<HCategory> getCategories() {return categories;}public void setCategories(List<HCategory> categories) {this.categories = categories;}
}
  1. 创建Mapper接口和XML文件
    接下来,我们需要创建Mapper接口和对应的XML文件来定义查询方法和SQL语句。在XML文件中,我们可以使用MyBatis的标签来配置多对多关系。
<resultMap id="HookVoMap" type="com.yuan.vo.HbookVo" ><result column="book_id" property="bookId"></result><result column="book_name" property="bookName"></result><result column="price" property="price"></result><collection property="categories" ofType="com.yuan.model.HCategory"><result column="category_id" property="categoryId"></result><result column="category_name" property="categoryName"></result></collection></resultMap><select id="demo3" resultMap="HookVoMap" parameterType="java.lang.Integer">select * from t_hibernate_book b ,t_hibernate_book_category bc,t_hibernate_category cwhere b.book_id = bc.bidand bc.cid = c.category_idand b.book_id = #{bid}</select>
  1. 编写查询方法
    最后,我们在Mapper接口中定义查询方法,并在XML文件中配置对应的SQL语句。

package com.yuan.Biz.Impl;import com.yuan.Biz.HBookBiz;
import com.yuan.mapper.HBookMapper;
import com.yuan.vo.HbookVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author 叶秋* @site* @company 卓京公司* @create 2023-09-01 21:23*/
@Service
public class HBookBizImpl implements HBookBiz {@Autowiredprivate HBookMapper hBookMapper;@Overridepublic HbookVo demo3(Integer bid) {return hBookMapper.demo3(bid);}}
  1. 使用多对多关系查询
    现在,我们可以在代码中使用多对多关系查询了。
package com.yuan.Biz.Impl;import com.yuan.Biz.HBookBiz;
import com.yuan.vo.HbookVo;
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;/*** @author 叶秋* @site* @company 卓京公司* @create 2023-09-01 21:24*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring-context.xml"})
public class HBookBizImplTest {@Autowiredprivate HBookBiz hBookBiz;@Testpublic void demo3() {HbookVo hbookVo = hBookBiz.demo3(8);System.out.println(hbookVo);hbookVo.getCategories().forEach(System.out::println);}
}

总结

本文介绍了在MyBatis中配置和使用一对多和多对多关系的方法。通过合理的实体类设计、Mapper接口和XML文件的配置,我们可以方便地进行多表查询,并丰富了应用程序的功能和灵活性。
补充内容:在实际开发中,我们还可以使用MyBatis的动态SQL和缓存等特性来进一步优化查询性能和提高开发效率。希望本文对您在MyBatis中处理关联关系有所帮助。

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

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

相关文章

DVWA靶场搭建

目录 配置环境&#xff1a; 1、将下载好的压缩包放置php的WWW根目录下 2、改文件配置 3、查看mysql用户名和密码&#xff0c;将其修改值靶场配置文件中 4、完成后我们就可以在浏览器输入127.0.0.1/dvwa进入靶场 测试XSS注入&#xff1a; 配置环境&#xff1a; githhub下…

DEAP库文档教程一

DEAP是一个新的用于快速验证和测试新想法的演化计算框架。它致力于直接地构建算法和数据结构的简单化。它可以很好地应用在并行机制中。下面的文档将会展示许多关键概念以及构建你自己的演化算法时的一些特征。 第一步 1、总览(从这里开始) 2、安装 3、如何进入端口?(porting…

新型安卓恶意软件使用Protobuf协议窃取用户数据

近日有研究人员发现&#xff0c;MMRat新型安卓银行恶意软件利用protobuf 数据序列化这种罕见的通信方法入侵设备窃取数据。 趋势科技最早是在2023年6月底首次发现了MMRat&#xff0c;它主要针对东南亚用户&#xff0c;在VirusTotal等反病毒扫描服务中一直未被发现。 虽然研究…

浪潮云海护航省联社金融上云,“一云多芯”赋能数字农业

农村金融是现代金融体系的重要组成部分&#xff0c;是农业农村发展的重要支撑力量&#xff0c;而统管全省农商行及农信社的省级农村信用社联合社&#xff08;以下简称&#xff1a;省联社&#xff09;在我国金融系统中占据着举足轻重的地位。省联社通常采用“大平台小法人”的发…

每日一题(复制带随机指针的链表)

每日一题&#xff08;复制带随机指针的链表&#xff09; 138. 复制带随机指针的链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 由于每个链表还包含了一个random节点指向了链表中的随机节点&#xff0c;所以并不能直接照搬复制原链表。首先想到的暴力思路是复…

Docker构建Springboot项目,并发布测试

把SpringBoot项目打包成Docker镜像有两种方案&#xff1a; 全自动化&#xff1a;先打好docker镜像仓库&#xff0c;然后在项目的maven配置中配置好仓库的地址&#xff0c;在项目里配置好Dockerfile文件&#xff0c;这样可以直接在idea中打包好后自动上传到镜像仓库&#xff0c…

多因素认证与身份验证:分析不同类型的多因素认证方法,介绍如何在访问控制中使用身份验证以增强安全性

随着数字化时代的到来&#xff0c;信息安全问题变得愈发重要。在网络世界中&#xff0c;用户的身份往往是保护敏感数据和系统免受未经授权访问的第一道防线。单一的密码已经不再足够&#xff0c;多因素认证&#xff08;MFA&#xff09;应运而生&#xff0c;成为提升身份验证安全…

嵌入式学习笔记(1)ARM的编程模式和7种工作模式

ARM提供的指令集 ARM态-ARM指令集&#xff08;32-bit&#xff09; Thumb态-Thumb指令集&#xff08;16-bit&#xff09; Thumb2态-Thumb2指令集&#xff08;16 & 32 bit&#xff09; Thumb指令集是对ARM指令集的一个子集重新编码得到的&#xff0c;指令长度为16位。通常在…

利用MarkovJunior方法生成迷宫和图形的MATLAB演示[迷宫生成、贪吃蛇、地图生成、图案生成]

利用MarkovJunior方法生成迷宫和图形的MATLAB演示[迷宫生成、贪吃蛇、地图生成、图案生成] 0 前言1 介绍MarkovJunior2 迷宫生成2.1 深度优先迷宫生成2.2 广度优先迷宫生成 3 其它生成图案3.1 地牢地图3.2 贪吃蛇3.3 植物花 惯例声明&#xff1a;本人没有相关的工程应用经验&am…

sql语句中的ddl和dml

操作数据库&#xff1a;CRUD C&#xff08;create&#xff09; 创建 *数据库创建出来默认字符集为utf8 如果要更改字符集就 Create database 名称 character set gbk&#xff08;字符集&#xff09; *创建数据库&#xff1a;create database 名称 *先检查是否有该数据库在…

zemax混合式非序列模拟

基础设置&#xff1a; 3D视图效果&#xff1a; 接下来用非序列模式设计一个多焦透镜 平行光束经过多焦透镜时&#xff0c;会汇聚在不同焦距处 非序列模式的编辑器如图&#xff1a; 注意不要点击左侧的非序列模式&#xff0c;那个时纯粹的非序列&#xff0c;会清除序列模式的数…

Linux gdb调式的原理

文章目录 一、原理分析二、dmoe测试2.1 hello.s2.2 demo演示 参考资料 一、原理分析 #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <…

M2DGR数据集各相机话题名与外参名的对应关系

M2DGR数据集除了视觉惯性器件、天向相机&#xff0c;还有6个安装在同一平面、参数一致的鱼眼相机。 本文对这6个相机的安装位置、外参、topic话题进行区分。 安装图&#xff1a; 6个鱼眼相机 fish-eye camera装载在同一层。 外参情况 fish-eye camera在calibration_results…

解决Jackson解析JSON时出现的Illegal Character错误

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Vue2项目练手——通用后台管理项目第五节

Vue2项目练手——通用后台管理项目 首页组件布局面包屑&tag面包屑使用组件使用vuex存储面包屑数据src/store/tab.jssrc/components/CommonAside.vuesrc/components/CommonHeader.vue tag使用组件文件目录CommonTag.vueMain.vuetabs.js 用户管理页新增功能使用的组件页面布局…

第49节:cesium 倾斜模型osgb转3dtiles,并加载(含源码+视频)

结果示例: 完整步骤: 1、启动并登陆cesiumlab 2、准备OSGB模型数据(含下载地址) 链接:https://pan.quark.cn/s/46ac7b0b2bed 提取码:TvWL3、倾斜模型切片 选择倾斜模型data文件夹 空间参考、零点坐标 默认 强制双面关闭、无光照 打开

Debian12搭建Nextcloud最新版并frp到二级域名

起因&#xff1a;因为台风的原因&#xff0c;要居家办公&#xff0c;但正值公司业务最要紧的时刻&#xff0c;所以需要搭建远程共享&#xff0c;结果发现基于原有的经验&#xff0c;已经难以适应版本更新带来的问题&#xff0c;所以就解决方法&#xff0c;进行了一次重新总结&a…

【狂神】Spring5笔记(10-19)

又是美好而努力的一天呀~ __ /|* * * * * * / * * * / * * * * / * * * * * * * happy valentines day * * * * …

stable diffusion实践操作-提示词插件安装与使用

本文专门开一节写提示词相关的内容&#xff0c;在看之前&#xff0c;可以同步关注&#xff1a; stable diffusion实践操作 正文 1、提示词插件安装 1.1、 安装 1.2 加载【应用更改并重载前端】 1.3 界面展示 1.3.-4 使用 里面有个收藏列表&#xff0c;可以收藏以前的所有提示…

gin框架

【狂神说】Gin框架一小时上手 | 快速转型GoWeb开发 | Go语言零基础教程_哔哩哔哩_bilibili 1.介绍 2.简单程序 1&#xff09;gin.GET/POST/PUT/DELETE函数 Go Gin 简明教程 | 快速入门 | 极客兔兔 (geektutu.com) 我的理解是&#xff1a;这类函数就像是在监听接口一样&…