Mybatis的关联关系-多对多

在进行数据库原理的时候,我们将E-R图的实体转化为我们的表时,有时要考虑到多对多的关系。比如下图:

我们可以转化为下面的表:

因为User和Orders是1:n的关系,所以Orders有一个外键。

t_orders表

idnumberuser_id(外键)
11111111111
21111111121
31111111131
41111111142

因为多对多关系需要一个额外的表来辅助:

t_ordersitem表

idorders_idproduct_id
111
212
313
422
531

t_product表

idnameprice
1香蕉8.8
2苹果15
39

我们知道,一个订单中可以都多个种类的水果,同一种类的水果也可以在不同的订单中。

我们现在的需求是,根据订单的id,查询出订单信息的同时,还要查出其包含的水果。(原来如果只按照id查询智,那么只会查出来id和编号number)。

第一步创建POJO类

public class Orders {
    private Integer id;
    private String number;
    private List<Product> productList;  //这个是为了,当查询Orders时,结果中嵌套包含的水果

    //......


}
public class Product {
    private Integer id;
    private String name;
    private Double price;

    private List<Orders> ordersList;  //这个是为了后期,想实现“根据水果的id,查看有哪些订单包含了这个产品”


    // ......

}

第二步,编写.xml映射文件

方法一,一条SQL查完

    <select id="findOrdersWithProduct1" parameterType="Integer" resultMap="OrdersWithProduct1">
        SELECT o.*,p.id as pid ,p.name,p.price
        FROM t_orders o,t_product p,t_ordersitem oi
        where o.id=#{id} and oi.orders_id=o.id and oi.product_id=p.id
    </select>

    <resultMap id="OrdersWithProduct1" type="Orders">
        <id property="id" column="id"></id>
        <result property="number" column="number"></result>
        <collection property="productList" ofType="Product">
            <id property="id" column="pid"></id>
            <result property="name" column="name"></result>
            <result property="price" column="price"></result>
        </collection>
    </resultMap>

注意:我们<select>标签嵌套的SQL查询的结果如下(这里我们将#{id}替换为了1):

然后我们仔细观察,结果中Orders(id,number,user_id)=(1,111111111,1)这个是我们要查的type="Orders"这个类型抽象出来的一个对象,但是查出来有重复的多条记录。<collection>会将重复的这个自动封装为一个Orders对象。然后是将后面要嵌套的对象进行映射。

第三步,引入映射文件到配置文件

在mybatus-config核心配置文件的<mappers>下引入:

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

第四步测试

方法二,嵌套SQL查询

    <select id="findOrdersWithProduct" parameterType="Integer" resultMap="OrdersWithProduct">
        select *
        from t_orders
        where id = #{id}
    </select>

    <resultMap id="OrdersWithProduct" type="Orders">
        <id property="id" column="id"></id>
        <result property="number" column="number"></result>
        <collection property="productList" column="id" ofType="Product" select="com.cupk.mapper.ProductMapper.findProductByOid"></collection>
    </resultMap>

首先编写查找“主类-Orders”的SQL语句,然后再用<collection>进行查询,这里的column="id"的意思是将上面SQL中接受的id,传给后面的select=的语句。

<mapper namespace="com.cupk.mapper.ProductMapper">
    <select id="findProductByOid" parameterType="Integer" resultType="Product">
        SELECT * from t_product WHERE id in (SELECT product_id from t_ordersitem WHERE orders_id=#{id})
    </select>
</mapper>

注意:这里也是嵌套查询。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp使用easyinput文本框显示输入的字数和限制的字数

uniapp使用easyinput文本框显示输入的字数和限制的字数 先上效果图&#xff1a; 整体代码如下&#xff1a; <template><view class"nameInfoContent"><uni-easyinput class"uni-mt-5" suffixIcon"checkmarkempty" v-model&quo…

Redis 事务 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 事务 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 事务 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 事务…

基础数据结构及算法——AVL树【自平衡二叉搜索树】解决失衡

历史 AVL 树是一种自平衡二叉搜索树&#xff0c;由托尔哈斯特罗姆在 1960 年提出并在 1962 年发表。它的名字来源于发明者的名字&#xff1a;Adelson-Velsky 和 Landis&#xff0c;他们是苏联数学家&#xff0c;于 1962 年发表了一篇论文&#xff0c;详细介绍了 AVL 树的概念和…

VoLTE 微信令:SBC 功能篇之 超长呼叫释放信令流程

目录 1. SBC 的位置及超长呼叫释放功能简介 2. VoLTE 超长通话,SBC 释放呼叫流程 博主wx:yuanlai45_csdn 博主qq:2777137742 想要 深入学习 5GC IMS 等通信知识(加入 51学通信),或者想要 cpp 方向修改简历,模拟面试,学习指导都可以添加博主低价指导哈。 1. SBC 的位置及…

使用 Python 的 BeautifulSoup(bs4)解析复杂 HTML

使用 Python 的 BeautifulSoup&#xff08;bs4&#xff09;解析复杂 HTML&#xff1a;详解与示例 在 Web 开发和数据分析中&#xff0c;解析 HTML 是一个常见的任务&#xff0c;尤其是当你需要从网页中提取数据时。Python 提供了多个库来处理 HTML&#xff0c;其中最受欢迎的就…

华尚实业集团家居产业园总部中心项目奠基仪式成功举办

金秋风景如画&#xff0c;十月天高云淡。良辰阳光灿烂&#xff0c;吉时热闹非凡。2024年10月23日上午&#xff0c;华尚实业集团家居产业园总部中心项目奠基仪式在增城经济技术开发区宁西园区项目现场隆重举行&#xff0c;标志着华尚实业集团家居产业园总部中心建设正式拉开帷幕…

基于Java语言的充电桩管理系统

介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充电桩系统桩直连协议 软件架构 1、提供云快充底层桩直连协议&#xff0c;版本为云快充1.5&#xff0c;对于没有对接过充电桩系统的开发者尤为合适&#xff1b; 2、包含&#xff1a;启…

安卓项目复制修改包名称打包失败处理——android studio

处理方法 将资源包名称直接替换为新的包名称&#xff0c;不管错误直接生成。

skynet的cluster集群

集群的使用 现在的游戏服务器框架中&#xff0c;分布式是一种常见的需求。一个游戏服务器组通常可以分成网关服务器、登录服务器、逻辑服务器、跨服服务器等等。 在skynet中&#xff0c;我们可以通过cluster来组建一个集群&#xff0c;实现分布式的部署。 示例 我们先来看一…

Win11安装基于WSL2的Ubuntu

1. 概述 趁着还没有完全忘记&#xff0c;详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程。不得不说WSL2现在被微软开发的比较强大了&#xff0c;还是很值得安装和使用的&#xff0c;笔者就通过WSL2安装的Ubuntu成功搭建了ROS环境。 2. 详论 2.1 子系统安装 在Win11搜…

在Debian上安装向日葵

说明&#xff1a; 因为之前服务器上安装了 PVE (Proxmox VE)&#xff0c;之前是用 Proxmox VE 进行服务器资源管理的。出于某些原因&#xff0c;现在不再通过 PVE构建的虚拟机来使用计算资源&#xff0c;而是通过 PVE 自带的 Debian 系统直接使用虚拟机资源&#xff08;因为积…

NVR接入录像回放平台EasyCVR视频融合平台语音对讲配置

国标GB28181视频平台EasyCVR视频融合平台可拓展性强、视频能力灵活&#xff0c;平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析接入等功能。其中&#xff0c;在语音对讲方面&#xff0c;NVR接入录像回放平台目前…

JavaEE初阶---多线程(三)---内存可见性/单例模式/wait,notify的使用解决线程饿死问题

文章目录 1.volatile关键字1.1保证内存的可见性--引入1.2保证内存的可见性--分析1.3保证内存的可见性--解决1.4内存可见性-JMM内存模型 2.notify和wait介绍2.1作用一&#xff1a;控制调度顺序2.2作用二&#xff1a;避免线程饿死2.3notify和notifyAll区分 3.单例模式--经典设计模…

数据库编程 SQLITE3 Linux环境

永久存储程序数据有两种方式&#xff1a; 用文件存储用数据库存储 对于多条记录的存储而言&#xff0c;采用文件时&#xff0c;插入、删除、查找的效率都会很差&#xff0c;为了提高这些操作的效率&#xff0c;有计算机科学家设计出了数据库存储方式 一、数据库 用来管理数据…

【Android】多渠道打包配置

目录 简介打包配置签名配置渠道配置配置打包出来的App名称正式包与测试包配置 打包方式开发工具打包命令行打包 优缺点 简介 多渠道打包 是指在打包一个 Android 应用时&#xff0c;一次编译生成多个 APK 文件&#xff0c;每个 APK 文件针对一个特定的渠道。不同的渠道可能代表…

Prompt提示词设计:如何让你的AI对话更智能?

Prompt设计&#xff1a;如何让你的AI对话更智能&#xff1f; 在人工智能的世界里&#xff0c;Prompt&#xff08;提示词&#xff09;就像是一把钥匙&#xff0c;能够解锁AI的潜力&#xff0c;让它更好地理解和响应你的需求。今天&#xff0c;我们就来聊聊如何通过精心设计的Pr…

厂房区域人员进出人数统计-实施方案

1.1 现状分析 传统的人流量统计方法往往依赖于人工计数或简单的视频监控系统&#xff0c;这些方法不仅效率低下&#xff0c;而且容易出错&#xff0c;无法满足现代仓库管理的需求。因此&#xff0c;我厂区决定引入先进的智能监控系统&#xff0c;通过集成高清摄像头、GPU服务器…

【Unity】仓库逻辑:拾取物体进仓库和扔掉物品

需求说明 目标&#xff1a;实现玩家移动过程中&#xff0c;拾取物体&#xff0c;物体被放入仓库&#xff1b;点击仓库中物体&#xff0c;重新扔回3D场景中逻辑。 逻辑分析&#xff1a; 需要玩家可以移动&#xff1b;需要检测玩家和物体的碰撞&#xff0c;并摧毁物体&#xf…

css知识点梳理2

1. 选择器拓展 在 CSS 中&#xff0c;可以根据选择器的类型把选择器分为基础选择器和复合选择器&#xff0c;复合选择器是建立在基础选择器之上&#xff0c;对基本选择器进行组合形成的。 ​ 复合选择器是由两个或多个基础选择器&#xff0c;通过不同的方式组合而成的&#xf…

【Flask】一、安装与第一个测试程序

目录 Flask简介 安装Flask 安装pip&#xff08;Python包管理器&#xff09; 使用pip安装Flask 验证安装 创建Flask程序 创建应用 运行 访问测试 Flask简介 Flask是一个用Python编写的轻量级Web应用框架。它被设计为易于使用和扩展&#xff0c;使其成为构建简单网站或复…