4.4Java EE——多对多查询

news2024/7/4 4:30:39

订单和商品多对多关系图

         在实际项目开发中,多对多的关联关系非常常见。以订单和商品为例,一个订单可以包含多种商品,而一种商品又可以属于多个订单,订单和商品属于多对多关联关系,订单和商品之间的关联关系如图。

        在数据库中,多对多的关联关系通常使用一个中间表来维护,中间表中的订单id作为外键关联订单表的id,中间表中的商品id作为外键关联商品表的id。这三个表之间的关系如图。

下面以订单表与商品表之间的多对多关系为例,讲解如何使用MyBatis处理多对多的关系

  1. 在名为mybatis的数据库中创建名称为tb_product的商品表和名称为tb_ordersitem 的中间表,同时在表中预先插入几条数据。
CREATE TABLE tb_product (

  id INT(32) PRIMARY KEY AUTO_INCREMENT,

  NAME VARCHAR(32), price DOUBLE );

# 插入3条数据

INSERT INTO tb_product VALUES ('1', 'Java基础入门', '44.5');

INSERT INTO tb_product VALUES ('2', 'Java Web 程序开发入门', '38.5');

INSERT INTO tb_product VALUES ('3', 'SSM框架整合实战', '50.0');

# 创建一个名称为tb_ordersitem 的中间表

CREATE TABLE tb_ordersitem (

  id INT(32) PRIMARY KEY AUTO_INCREMENT,

  orders_id INT(32),

  product_id INT(32),

  FOREIGN KEY (orders_id) references tb_orders (id),

FOREIGN KEY (product_id) references tb_product (id));

INSERT INTO tb_ordersitem VALUES ('1', '1', '1');

INSERT INTO tb_ordersitem VALUES ('2', '1', '3');

INSERT INTO tb_ordersitem VALUES ('3', '3', '3');

2、创建持久化类Product,并在类中定义商品id、商品名称、商品单价等属性,以及与订单关联的属性。

public class Product {

    private Integer id;      private String name;

    private Double price;

    private List<Orders> orders; //关联订单属性

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public List<Orders> getOrders() {
        return orders;
    }

    public void setOrders(List<Orders> orders) {
        this.orders = orders;
    }

    @Override

    public String toString() {

        return "Product [id=" + id + ", name=" + name

                + ", price=" + price + "]";}

}

3、在商品持久化类中,除了需要添加订单的集合属性外,还需要在订单持久化类(Orders.java)中增加商品集合的属性及其对应的getter/setter方法,Orders类中添加的代码如下。

// 关联商品集合属性

private List<Product> productList;

// 省略getter/setter方法,以及重写的toString()方法

4、创建订单实体映射文件OrdersMapper.xml,用于编写订单信息的查询SQL语句,并在映射文件中编写多对多关联映射查询的配置信息。

<mapper namespace="com.mac.mapper.OrdersMapper">

   <select id="findOrdersWithPorduct"parameterType="Integer" 

resultMap="OrdersWithProductResult">

select * from tb_orders WHERE id=#{id} </select>

   <resultMap type="Orders" id="OrdersWithProductResult">

<id property="id" column="id" /><result property="number" column="number" />

<collection property="productList" column="id" ofType="Product" 

     select=“com.mac.mapper.ProductMapper.findProductById" ></collection>

</resultMap>

</mapper>

5、创建商品实体映射文件ProductMapper.xml,用于编写订单与商品信息的关联查询SQL语句。 

<mapper namespace="com.mac.mapper.ProductMapper">

<select id="findProductById" parameterType="Integer" 

                                       resultType="Product">

SELECT * from tb_product where id IN(

   SELECT product_id FROM tb_ordersitem  

WHERE orders_id = #{id}   )

</select>

</mapper>

6、将新创建的映射文件OrdersMapper.xml和ProductMapper.xml的文件路径配置到核心配置文件mybatis-config.xml中。

<mapper resource="com/mac/mapper/OrdersMapper.xml" />

<mapper resource="com/mac/mapper/ProductMapper.xml" />

7、在测试类MyBatisTest中,编写多对多关联查询的测试方法findOrdersTest()。

public void findOrdersTest() {

    // 1.生成SqlSession对象

    SqlSession session = MyBatisUtils.getSession(); 

    // 2.查询id为1的订单中的商品信息

    Orders orders = session.selectOne("com.mac.mapper."

                           + "OrdersMapper.findOrdersWithPorduct", 1);

    System.out.println(orders);// 3.输出查询结果信息

    session.close();// 4.关闭SqlSession

}

8、查询订单及关联商品的另一方式

        除了使用嵌套查询的方式查询订单及其关联的商品信息外,还可以在OrdersMapper.xml中使用嵌套结果的方式进行查询。

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

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

相关文章

springboot家政服务管理平台

本系统为了数据库结构的灵活性所以打算采用MySQL来设计数据库&#xff0c;而java技术&#xff0c;B/S架构则保证了较高的平台适应性。本文主要介绍了本系统的开发背景&#xff0c;所要完成的功能和开发的过程&#xff0c;主要说明了系统设计的重点、设计思想。 本系统主要是设…

通信算法之177: 基于Matlab的OFDM通信系统关键基带算法设计7-流程

一. 接收算法流程 1.1 粗同步&#xff08;分组检测&#xff09; 1.2 载波同步&#xff08;精细频偏估计&#xff09; 多普勒频偏和晶振。频率偏差&#xff0c;会破坏子载波间的正交性&#xff0c;且这种频差对相位的影响还具有累加性。 1.3 精同步&#xff08;OFDM起始&…

软件工程——第10章面向对象分析知识点整理

本专栏是博主个人笔记&#xff0c;主要目的是利用碎片化的时间来记忆软工知识点&#xff0c;特此声明&#xff01; 文章目录 1.分析工作主要包括哪三项内容&#xff1f; 2.面向对象分析是一个怎样的过程&#xff1f; 3.需求陈述是一成不变的吗&#xff1f; 4.复杂问题的对象…

web信息收集----网站指纹识别

文章目录 一、网站指纹&#xff08;web指纹&#xff09;二、CMS简介三、指纹识别方法3.1 在线网站识别3.2 工具识别3.3 手动识别3.4 Wappalyzer插件识别 一、网站指纹&#xff08;web指纹&#xff09; Web指纹定义&#xff1a;Web指纹是一种对目标网站的识别技术&#xff0c;通…

敞篷超跑造型,还支持4KHz回报,雷柏VT960 Pro游戏鼠标体验

想要在游戏中获得精准、迅速的操作反馈&#xff0c;鼠标的配置很重要&#xff0c;之前雷柏推出的支持4KHz的高回报率鼠标&#xff0c;很适合高刷显示器使用&#xff0c;最近我也上手了一款雷柏VT960 Pro。这只无线游戏鼠标采用了一种镂空“超跑”的外观设计&#xff0c;还带有个…

【C语言基础】内存布局和作用域

(꒪ꇴ꒪(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误…

UnityVR--机械臂场景10-简单流水线应用2

目录 一. 前言 二. 事件中心修改 三. 机械臂加入DoTween的运动 四. 机械臂关节的控制 一. 前言 上一篇已经完成了流水线的搭建&#xff0c;本篇要完成的是&#xff1a;1. 事件中心的修改&#xff1b;2. 机械臂的DoTween运动改造&#xff1b; 本篇是在事件中心2和机械臂场景…

macOS Ventura 13.5beta5(22G5072a)发布

系统介绍 黑果魏叔 7 月 11 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5 开发者预览版 Beta 5 更新&#xff08;内部版本号&#xff1a;22G5072a&#xff09;&#xff0c;本次更新距离上次发布隔了 12 天。 macOS Ventura 带来了台前调度、连续互通相机、Fa…

Python自动化办公:提升效率,释放潜力(借助AI实现)

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。搜…

解密混沌工程——混沌工程实践

随着近两年的数字化转型需求激增&#xff0c;混沌工程这门新兴学科在证券业、银行业备受青睐。尽管混沌工程诞生至今已经有十余年&#xff0c;但对大部分公司的研发团队而言&#xff0c;它仍是一个比较陌生的领域。 混沌工程该如何实施&#xff1f; 上一期我们说到&#xff0c…

Spring Event事件用法 Spring Boot Event事件发布和订阅 Spring Event事件发布 Spring Event事件订阅

Spring Event事件用法 Spring Boot Event事件发布和监听 Spring Event事件发布 Spring Event事件订阅 一、概述 在Spring中可以使用 Spring Event 事件机制&#xff0c;实现功能解耦合。 本文 主要讲解 Spring Event的用法 &#xff0c;至于那些 介绍啊&#xff0c;观察者模式&…

开悟AIArena,深度学习神经网络,暑假开悟比赛的学习

目录 1.赛题简介 1.1.赛题目标 1.2.地图介绍 1.3.规则介绍 2.环境介绍 2.1.观测空间&#xff08;Observation Space&#xff09; 2.1.1.原始数据&#xff1a; 2.1.2.特征数据 2.1.3.特征提取 2.2.动作空间&#xff08;Action Space&#xff09; 2.3.坐标介绍&#xf…

1.MySQL - WindTerm Linux 使用

目录 一、云服务器的使用 二、Linux 和 发行版 三、云服务器的基本操作 四、WindTerm&#xff08;一款 SSH 客户端&#xff09; 4.1 设置 WindTerm 外观 4.2 打开文件管理器 4.3 连接云服务器 4.4 参数 4.5 常见命令 4.5.1 清理屏幕&#xff08;滚屏&#xff09; …

【雕爷学编程】Arduino动手做(158)---VL53L0X激光测距模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

TCP 协议(一)报文结构

TCP 协议&#xff08;一&#xff09;报文结构 TCP 协议&#xff08;二&#xff09;连接与断开 TCP 协议&#xff08;三&#xff09;十种核心机制 TCP 提供面向连接的通信传输&#xff0c;面向连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。无论…

从零开始——springboot增删改查小demo

首先&#xff0c;先创建数据库 -----sushe,然后创建表 person&#xff0c;表结构是这样的&#xff0c;一共四个字段。 向里面添加一些寝室成员数据即可。 INSERT INTO person(p_id,p_name,p_phone,p_score)VALUES (1,李阳,123456,7890), (2,张骞,123456,7890), (3,马康敬,1234…

【C语言】指针概要

文章目录 一、什么是指针二、指针类型三、野指针四、二级指针五、字符指针六、数组指针定义数组名 七、函数指针 一、什么是指针 指针就是地址&#xff0c;口语中说的指针通常指的是指针变量。我们可以通过&&#xff08;取地址操作符&#xff09;取出变量的内存起始地址&a…

Nginx转发域名与新增SSL证书校验

1.申请SSL证书 各大资源&#xff1a;SSL免费证书资源 2.我选择的是站点服务 申请成功的界面&#xff1a; 官网安装教程&#xff1a;看看就好系列 3.下载成功后把文件当道nginx中的目录下 4.编写nginx.config配置 增加server配置 通过监听zlXXX.cc域名访问 重定向到https…

C人脸识别

1、原始图片&#xff1a; 2、灰度化下&#xff1a; 3、均值滤波&#xff1a; 4、 二值图加边缘检测 5、生成积分图 6、把待检测的人脸区域划分为25个&#xff0c;因为是一个数组&#xff0c;这样分别统计每个区域的像素个数&#xff1a; x0: 60, y0: 100, x1: 157, y1: 200 …

X86架构上的Linux操作系统安装与配置ARM架构(并进行示例测试/为DDS编译打基础)

1 查看Linux操作系统是运行在X86架构还是ARM架构平台上2 X86和ARM到底是什么关系&#xff1f;3 X86、ARM、Linux三者的关系到底是什么&#xff1f;&#xff08;大白话理解&#xff09;4、在X86架构的Linux操作系统上搭建ARM架构并进行测试&#xff08;看elf文件的类型是否属于a…