Mybatis一对多查询 ,以及会遇到的各种问题解答

news2024/11/24 12:11:43

Mybatis一对多查询 ,以及会遇到的各种问题解答

  • 业务场景
  • 实体类,数据库
  • 方法1:连表查询,用ResultMap映射
  • 方法2:子查询进行映射

业务场景

  有时候前端需要表格里面嵌套表格的情况,用以展示更加详细的信息,提高用户体验。
例如:
在这里插入图片描述

实体类,数据库

而此时就需要后端返回复杂的数据结构实体类中嵌套实体类的情况了。
例如:主表 PlnOrderPool.java(为节省空间 实体类中都未写get,set方法。)
在这里插入图片描述

附表:PlnOrderPoolDetail.java
在这里插入图片描述

订单主表:
订单主表
订单附表:
在这里插入图片描述

方法1:连表查询,用ResultMap映射

注意事项:见图片中
在这里插入图片描述
图片上最后的where是没有的(sorry)
代码:

<resultMap id="orderAndDetail" type="org.jeecg.modules.pln.infrastructure.dao.entity.PlnOrderPool">
        <id property="orderNo" column="order_no"/>
        <result property="name" column="name"/>
        <result property="customerName" column="customer_name"/>
        <collection property="detailList" ofType="org.jeecg.modules.pln.infrastructure.dao.entity.PlnOrderPoolDetail">
            <id property="id" column="d_id"/>
            <result property="deliverTime" column="deliver_time"/>
            <result property="deliverNum" column="deliver_num"/>
        </collection>
    </resultMap>
    <select id="getOrderAndDetail" resultMap="orderAndDetail">
        SELECT
            pop.order_no,
            pop.NAME,
            pop.customer_name,
            popd.id d_id,
            popd.deliver_time,
            popd.deliver_num
        FROM
	        pln_order_pool pop
	        LEFT JOIN pln_order_pool_detail popd ON pop.order_no = popd.order_id
    </select>

结果:

{
    "message": "success",
    "code": 0,
    "data": [
        {
            "orderNo": "ORDER2022092900005",
            "customerName": "上汽大通",
            "name": "冷却模块",
            "detailList": [
                {
                    "id": "1575280472165048321",
                    "deliverNum": 60.0,
                    "deliverTime": "2022-10-07",
                }
            ]
        },
        {
            "orderNo": "ORDER2022092900006",
            "customerName": "上汽大通",
            "name": "冷却模块",
            "detailList": [
                {
                    "id": "1575280472177631234",
                    "deliverNum": 80.0,
                    "deliverTime": "2022-10-08",
                },
                {
                    "id": "1575280472177631235",
                    "deliverNum": 78.0,
                    "deliverTime": "2022-10-19",
                }
            ]
        },
        {
            "orderNo": "ORDER2022092900007",
            "customerName": "无通",
            "name": "散成",
            "detailList": [
                {
                    "id": "1575280472177631236",
                    "deliverNum": 240.0,
                    "deliverTime": "2022-10-07",
                },
                {
                    "id": "1575280472186019841",
                    "deliverNum": 240.0,
                    "deliverTime": "2022-10-08",
                },
                {
                    "id": "1575280472186019842",
                    "deliverNum": 240.0,
                    "deliverTime": "2022-10-09",
                },
                {
                    "id": "1575280472186019843",
                    "deliverNum": 240.0,
                    "deliverTime": "2022-10-10",
                }
            ]
        }
    ]
}

原理:先查询出所有数据,然后根据你规定的resultMap映射关系,去组建数据结构。 property 对应你的实体类中的属性名,column 对应你sql查出来的字段名。
并且他是根据你的<id property="orderNo" column="order_no"/> 去确定谁能代表一条主表数据,类似于分组。
优点:效率较高只需要一次查库操作,操作方便过滤条件写在一个sql中
缺点:根据主表进行分页查询比较难以实现

方法2:子查询进行映射

注意事项:
1:子查询collection中column中的值写法;
  column值有两种写法:
(一),如果下图中1和4的值相同,可以直接写一个,类似于:column="xxx"
(二),下图中写法,如果有多个参数可用逗号分隔,例如:column="{d_orderNo=order_no,xxx=xxx,...}"
2:select 中的值应该为:子查询在mapper中的全路径。
在这里插入图片描述
代码:

<resultMap id="orderAll" type="org.jeecg.modules.pln.infrastructure.dao.entity.PlnOrderPool">
        <id property="orderNo" column="order_no" />
        <result property="name" column="name" />
        <result property="customerName" column="customer_name" />
        <collection property="detailList"
                    ofType="org.jeecg.modules.pln.infrastructure.dao.entity.PlnOrderPoolDetail"
                    select="org.jeecg.modules.pln.infrastructure.dao.mapper.PlnOrderPoolMapper.getDetailAll"
                    column="{d_orderNo=order_no}"></collection>
    </resultMap>
<!--    主表的在resultMap中标识了id的必须唯一-->
    <select id="getAll" resultMap="orderAll">
        select order_no,name,customer_name from pln_order_pool where order_no = #{orderNo}
    </select>
    <select id="getDetailAll" resultType="org.jeecg.modules.pln.infrastructure.dao.entity.PlnOrderPoolDetail">
        select order_id,deliver_time,deliver_num from pln_order_pool_detail where order_id = #{d_orderNo}
    </select>

原理:这种写法是先去查询主表然后再去根据主表中的条件去查询附表,是要进行n+1次数据库交互的。
缺点:要进行n+1次数据库交互,效率低。子查询传参过滤比较复杂
优点:无论是分页还是普通查询都能满足

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

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

相关文章

前端历史 --- 从HTML静态文件到前后端分离

前端历史 --- 从HTML静态文件到前后端分离1. 静态HTML2. 动态HTML --- 服务器端渲染CGI --- Common Gateway InterfaceservletASP, JSP, PHP服务器端渲染(SSR)3. 前后端分离 --- 客户端渲染JavaScriptAjax --- Asynchronous Javascript And Xml.客户端渲染1. 静态HTML 在上个世…

回溯问题(子集型回溯、组合型回溯、排列型回溯)【零神基础精讲】

来源0x3f&#xff1a;https://space.bilibili.com/206214 回溯分为【子集型回溯】【组合型回溯】【排列型回溯】 文章目录回溯基本概念[17. 电话号码的字母组合](https://leetcode.cn/problems/letter-combinations-of-a-phone-number/)子集型回溯&#xff08;分割问题也可以看…

按键中断,红外、光电、火焰传感器中断控制LED等并打印信息

需求&#xff1a;按键中断&#xff0c;红外、光电、火焰传感器中断控制LED等并打印信息重写函数部分&#xff1a;void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin) {switch(GPIO_Pin){case GPIO_PIN_9:HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_10);if(HAL_GPIO_ReadPin(GPIO…

浅析高速服务区交互一体机设备管理系统的建设与方向

很多高速公路服务区均缺乏现代化的服务思维、理念和手段&#xff0c;信息系统功能薄弱&#xff0c;服务区的自助服务终端存在功能单一、人机交互体验差、设备维护管理成本高、联动效率低、运营难等问题&#xff0c;这不仅无法支撑服务区的精细化服务和智能化管理需求&#xff0…

【视频】海康摄像头、NVR网络协议简介

1、软硬件整体架构 2、涉及的网络协议 3、协议简介 3.1 海康私有协议 设备发现SADP:进行设备的发现、激活、修改网络参数、忘记密码等; SDK:4200、系统平台的接入前端设备,协议不对外开放,但对外提供接口库; ISAPI:Intelligent Security API(智能安全API),基于HTTP传输…

C/C++每日一练(20230223)

目录 1. 数据合并 2. 回文链表 3. 完美矩形 1. 数据合并 题目描述 将两个从小到大排列的一维数组 (维长分别为 m,n , 其中 m,n≤100) 仍按从小到大的排列顺序合并到一个新的一维数组中&#xff0c;输出新的数组. 输入描述 第 1 行一个正整数 m , 表示第一个要合并的一维…

【数据结构】AVL树

AVL树一、AVL树的概念二、AVL的接口2.1 插入2.2 旋转2.2.1 左单旋2.2.2 右单旋2.2.3 左右双旋2.2.4 右左双旋三、验证四、源码一、AVL树的概念 当我们用普通的搜索树插入数据的时候&#xff0c;如果插入的数据是有序的&#xff0c;那么就退化成了一个链表&#xff0c;搜索效率…

纵然是在产业互联网的时代业已来临的大背景下,人们对于它的认识依然是短浅的

纵然是在产业互联网的时代业已来临的大背景下&#xff0c;人们对于它的认识依然是短浅的。这样一种认识的最为直接的结果&#xff0c;便是我们看到了各式各样的产业互联网平台的出现。如果一定要找到这些互联网平台的特点的话&#xff0c;以产业端为出发点&#xff0c;无疑是它…

嵌入式:UCOS移植+简单创建任务

目录 一、UCOS操作系统 二、UCOS移植 1、文件介绍 2、UCOS || 源码分析 3、打开Software文件 三、UCOS任务创建 一、UCOS操作系统 C/OS 是 Micrium 公司出品的实时操作系统&#xff0c; C/OS 目前有两个版本&#xff1a; C/OS-II 和 C/OS-III。 C/OS 是一种基于优先级…

Linux GPIO 开发指南

文章目录Linux GPIO 开发指南1 概述1.1 编写目的1.2 适用范围1.3 相关人员2 模块介绍2.1 模块功能介绍2.2 相关术语介绍2.3 总体框架2.4 state/pinmux/pinconfig2.5 源码结构介绍3 模块配置3.1 kernel menuconfig 配置3.2 device tree 源码结构和路径3.2.1 device tree 对 gpio…

Python计算 -- 内附蓝桥题:相乘

计算 ~~不定时更新&#x1f383;&#xff0c;上次更新&#xff1a;2023/02/23 &#x1f5e1;常用函数&#xff08;方法&#xff09; 1. 求一个整数的最末位 举个栗子&#x1f330; n int(input()) end n % 10蓝桥例题1 - 相乘✖️ 题目描述 本题为填空题&#xff0c;…

MySQL 11:MySQL锁

锁是一种机制&#xff0c;计算机通过这种机制协调多个进程或线程对资源的并发访问&#xff08;以避免争用&#xff09;。在数据库中&#xff0c;除了传统的计算资源&#xff08;如CPU、RAM、I/O等&#xff09;的争夺外&#xff0c;数据也是一种被众多用户共享的资源。如何保证并…

叠氮炔点击化学634926-63-9,Propargyl-PEG1-NHBoc,氨基叔丁酯PEG1丙炔基相关性质分享

●外观以及性质&#xff1a;Propargyl-PEG1-NHBoc产物呈固体或粘性液体&#xff0c;取决于PEG分子量&#xff0c;包含1个丙炔基和一个氨基叔丁酯&#xff0c;炔丙基可通过铜催化的叠氮炔点击化学与含叠氮化合物或生物分子反应&#xff0c;以产生稳定的三唑键&#xff0c;带有 P…

Windows下载安装Redis的详细步骤

目录 一、概述 1.redis的版本维护介绍 2.msi安装包和压缩包的优点和缺点 二、操作步骤 三、测试是否安装成功&#xff08;查看版本&#xff09; 四、获取资源 一、概述 1.redis的版本维护介绍 Redis的官网只提供Linux系统的下载。但是微软的技术团队长期开发和维护着这…

Tina_Linux_启动优化_开发指南

文章目录Tina_Linux_启动优化_开发指南1 概述2 启动速度优化简介2.1 启动流程2.2 测量方法2.2.1 printk time2.2.2 initcall_debug2.2.3 bootgraph.2.2.4 bootchart2.2.5 gpio 示波器.2.2.6 grabserial.2.3 优化方法2.3.1 boot0启动优化2.3.1.1 非安全启动.2.3.1.2 安全启动2.3…

jmeter接口自动化测试框架

接口测试可以分为两部分&#xff1a; 一是线上接口&#xff08;生产环境&#xff09;自动化测试&#xff0c;需要自动定时执行&#xff0c;每5分钟自动执行一次&#xff0c;相当于每5分钟就检查一遍线上的接口是否正常&#xff0c;有异常能够及时发现&#xff0c;不至于影响用…

易点易动助力企业固定资产信息化管理

对于生产制造或者互联网企业而言&#xff0c;固定资产比重较高&#xff0c;是企业资产的大头&#xff0c;一些办公设备、生产设备数量和金额都比较大。提升企业固定资产管理水平&#xff0c;是企业实现信息化建设的必要条件。 目前&#xff0c;国内的很多企业在固定资产管理中…

零售航母沃尔玛公布业绩:喜忧参半

2月21日美股盘前&#xff0c;零售巨无霸沃尔玛公布了截至1月的2023财年第四季度业绩报告。财报中不乏可圈可点之处&#xff0c;但是利润迎来六年首降&#xff0c;新财年的利润指引要也比预期低很多&#xff0c;可以说喜忧参半。 一、Q4业绩可圈可点 营收方面&#xff1a;在本…

漏斗分析法

一什么是漏斗分析&#xff1f; 漏斗分析是数据领域最常见的一种“程式化”数据分析方法&#xff0c;它能够科学地评估一种业务过程&#xff0c;从起点到终点&#xff0c;各个阶段的转化情况。通过可以量化的数据分析&#xff0c;帮助业务找到有问题的业务环节&#xff0c;并进…

插画网课平台排名

插画网课平台哪个好&#xff0c;插画网课排名靠前的有哪些&#xff0c;今天给大家梳理了国内5家专业的插画网课平台&#xff0c;各有优势和特色&#xff0c;给学插画的小伙伴提供选择&#xff0c;报插画网课一定要选择靠谱的&#xff0c;否则人钱两空泪两行&#xff01; 一&am…