MyBatis中的N+1问题,使用ResultSet来解决,需要存储过程【非常详细】

参考
https://mybatis.org/mybatis-3/zh/sqlmap-xml.html
https://mybatis.net.cn/sqlmap-xml.html#Result_Maps

基础表sql

订单表

CREATE TABLE `test_order` (`order_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '订单id',`order_name` varchar(255) NOT NULL DEFAULT '' COMMENT '订单名字',PRIMARY KEY (`order_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='订单表';INSERT INTO test_order (`order_id`, `order_name`) VALUES (1, '订单1');
INSERT INTO test_order (`order_id`, `order_name`) VALUES (2, '订单2');

支付表

CREATE TABLE `test_pay` (`pay_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '支付id',`pay_name` varchar(255) NOT NULL DEFAULT '' COMMENT '支付名字',`order_id` bigint(20) NOT NULL COMMENT '订单id',PRIMARY KEY (`pay_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='付款记录表';INSERT INTO test_pay (`pay_id`, `pay_name`, `order_id`) VALUES (1, '支付名字1', 1);
INSERT INTO test_pay (`pay_id`, `pay_name`, `order_id`) VALUES (2, '支付名字2', 2);

物流表(一个订单有多个阶段的物流信息)

CREATE TABLE `test_flow` (`flow_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '物流id',`flow_begin_name` varchar(255) NOT NULL DEFAULT '' COMMENT '物流开始名字',`flow_end_name` varchar(255) NOT NULL DEFAULT '' COMMENT '物流结束名字',`order_id` bigint(20) NOT NULL COMMENT '订单id',PRIMARY KEY (`flow_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='物流表';INSERT INTO test_flow (`flow_id`, `flow_begin_name`, `flow_end_name`, `order_id`) VALUES (1, '北京', '上海', 1);
INSERT INTO test_flow (`flow_id`, `flow_begin_name`, `flow_end_name`, `order_id`) VALUES (2, '上海', '浦东新区', 1);
INSERT INTO test_flow (`flow_id`, `flow_begin_name`, `flow_end_name`, `order_id`) VALUES (3, '浦东新区', '川沙新政', 1);
INSERT INTO test_flow (`flow_id`, `flow_begin_name`, `flow_end_name`, `order_id`) VALUES (4, '西藏', '黑龙江', 2);
INSERT INTO test_flow (`flow_id`, `flow_begin_name`, `flow_end_name`, `order_id`) VALUES (5, '黑龙江', '漠河', 2);
INSERT INTO test_flow (`flow_id`, `flow_begin_name`, `flow_end_name`, `order_id`) VALUES (6, '漠河', '百合路35号', 2);

1个订单对应1个支付信息
1个订单对应n个阶段的物流信息
在这里插入图片描述

存储过程

DELIMITER $$CREATE PROCEDURE `selectOrderAndFlow`(IN `orderId` bigint)
BEGINselect order_id, order_name from test_order ;
select order_id, pay_id, pay_name from test_pay ;
select order_id, flow_id, flow_begin_name, flow_end_name from test_flow ;END $$

java 文件

vo文件

package cn.fox.mydemo.domain;import lombok.Data;@Data
public class TestOrder {private Long orderId;private String orderName;}
package cn.fox.mydemo.domain;import lombok.Data;@Data
public class TestPay {/*** 支付id*/private Long payId;/*** 支付名字*/private String payName;/*** 订单id*/private Long orderId;}
package cn.fox.mydemo.domain;import lombok.Data;@Data
public class TestFlow {private static final long serialVersionUID = 1L;/*** 物流id*/private Long flowId;/*** 物流开始名字*/private String flowBeginName;/*** 物流结束名字*/private String flowEndName;/*** 订单id*/private Long orderId;}
package cn.fox.mydemo.domain.vo;import cn.fox.mydemo.domain.TestFlow;
import cn.fox.mydemo.domain.TestOrder;
import cn.fox.mydemo.domain.TestPay;
import lombok.Data;import java.util.List;@Data
public class TestOrderVo2 {/** 订单对象 */private TestOrder testOrder;/** 支付对象 */private TestPay testPay;/** 物流list */private List<TestFlow> testFlowList;}

mapper.java文件

package cn.fox.mydemo.mapper;import cn.fox.mydemo.domain.vo.TestOrderVo2;
import org.apache.ibatis.annotations.Mapper;import java.util.List;@Mapper
public interface TestOrderMapper {List<TestOrderVo2> getOrderAndFlow(Long id);}

mapper.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.fox.mydemo.mapper.TestOrderMapper"><resultMap type="cn.fox.mydemo.domain.vo.TestOrderVo2" id="testOrderVo2"><result property="testOrder.orderId"    column="order_id"    /><result property="testOrder.orderName"    column="order_name"    /><association property="testPay"javaType="cn.fox.mydemo.domain.TestPay"resultSet="testPay"column="order_id"foreignColumn="order_id"><id property="payId" column="pay_id"/><result property="payName" column="pay_name"/><result property="orderId" column="order_id"/></association><collection property="testFlowList"ofType="cn.fox.mydemo.domain.TestFlow"resultSet="testFlowList"column="order_id"foreignColumn="order_id"><id property="flowId" column="flow_id"/><result property="flowBeginName" column="flow_begin_name"/></collection></resultMap><select id="getOrderAndFlow"resultSets="testOrder,testPay,testFlowList"statementType="CALLABLE"resultMap="testOrderVo2">{call selectOrderAndFlow(#{id,jdbcType=INTEGER,mode=IN})}</select></mapper>

测试文件

package cn.fox.mydemo.mybatis;import cn.fox.mydemo.domain.vo.TestOrderVo2;
import cn.fox.mydemo.mapper.TestOrderMapper;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import javax.annotation.Resource;
import java.util.List;@SpringBootTest
@RunWith(SpringRunner.class)
public class MybatisDemo2 {@Resourceprivate TestOrderMapper testOrderMapper;@Testpublic void testMybatis() {List<TestOrderVo2> orderAndFlow = testOrderMapper.getOrderAndFlow(3L);System.out.println(JSONObject.toJSONString(orderAndFlow));}}

测试结果

一次性执行3条sql,并且根据关联字段进行复杂关系映射


Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@48a46b0f] was not registered for synchronization because synchronization is not active
JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@60c96eb4] will not be managed by Spring
==>  Preparing: {call selectOrderAndFlow(?)}
==> Parameters: 3(Long)
<==    Columns: order_id, order_name
<==        Row: 1, 订单1
<==        Row: 2, 订单2
<==      Total: 2
<==    Columns: order_id, pay_id, pay_name
<==        Row: 1, 1, 支付名字1
<==        Row: 2, 2, 支付名字2
<==      Total: 2
<==    Columns: order_id, flow_id, flow_begin_name, flow_end_name
<==        Row: 1, 1, 北京, 上海
<==        Row: 1, 2, 上海, 浦东新区
<==        Row: 1, 3, 浦东新区, 川沙新政
<==        Row: 2, 4, 西藏, 黑龙江
<==        Row: 2, 5, 黑龙江, 漠河
<==        Row: 2, 6, 漠河, 百合路35号
<==      Total: 6
<==    Updates: 0
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@48a46b0f]

结果集自动映射

[{"testFlowList":[{"flowBeginName":"北京","flowEndName":"上海","flowId":1,"orderId":1},{"flowBeginName":"上海","flowEndName":"浦东新区","flowId":2,"orderId":1},{"flowBeginName":"浦东新区","flowEndName":"川沙新政","flowId":3,"orderId":1}],"testOrder":{"orderId":1,"orderName":"订单1"},"testPay":{"orderId":1,"payId":1,"payName":"支付名字1"}},{"testFlowList":[{"flowBeginName":"西藏","flowEndName":"黑龙江","flowId":4,"orderId":2},{"flowBeginName":"黑龙江","flowEndName":"漠河","flowId":5,"orderId":2},{"flowBeginName":"漠河","flowEndName":"百合路35号","flowId":6,"orderId":2}],"testOrder":{"orderId":2,"orderName":"订单2"},"testPay":{"orderId":2,"payId":2,"payName":"支付名字2"}}
]

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

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

相关文章

KITTI数据集处理为COCO数据集格式

KITTI作为自动驾驶常用数据集&#xff0c;被广泛的应用于自动驾驶目标检测等过程中。 首先是数据集类别合并&#xff0c;原始的KITTI数据集有九个类别&#xff0c;分别是&#xff1a; Car Van Truck Pedestrian Person_sitting Cyclist Tram Misc而我们在使用过程中&#xff0…

GO并发编程综合应用

一.GO并发编程综合应用 1.生产者消费者模式 1.1需求分析 ​ 生产者每秒生产一个商品&#xff0c;并通过物流公司取货 ​ 物流公司将商品运输到商铺 ​ 消费者阻塞等待商铺到货&#xff0c;需要消费10次商品 1.2实现原理 1.3代码实现&#xff1a; package mainimport (&q…

SpringCloud微服务 【实用篇】| Docker启示录

目录 一&#xff1a;Docker启示录 1. Docker启示录 2. Docker和虚拟机的区别 3. Docker架构 4. Centos7安装Docker 4.1. 卸载 4.2. 安装docker 4.3. 启动docker 4.4. 配置镜像加速 前些天突然发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽…

Python之random模块详解

python的random模块 random模块是python中一个生成随机数的模块。 random不是python解释器内置的模块。 导入random模块的方法是&#xff1a; import random 如果只使用random模块中的单个方法的话&#xff0c;也可以使用 from random import method_name 例如&#xff1a; …

蓝牙协议栈学习笔记

蓝牙协议栈学习笔记 蓝牙简介 蓝牙工作在全球通用的 2.4GHz ISM&#xff08;即工业、科学、医学&#xff09;频段&#xff0c;使用 IEEE802.11 协议 蓝牙 4.0 是迄今为止第一个蓝牙综合协议规范&#xff0c;将三种规格集成在一起。其中最重要的变化就是 BLE&#xff08;Blue…

【数学建模】《实战数学建模:例题与讲解》第十三讲-相关分析(含Matlab代码)

【数学建模】《实战数学建模&#xff1a;例题与讲解》第十三讲-相关分析&#xff08;含Matlab代码&#xff09; 基本概念典型相关分析综合评价模型对应分析因子分析聚类分析 习题10.41. 题目要求2.解题过程3.程序 习题10.51. 题目要求2.解题过程3.程序 习题10.6&#xff08;1&a…

用Excel绘制柱形图

在需要将数据用柱状图表示的时候&#xff0c;可以用Excel进行绘制。不单绘制柱形图&#xff0c;其他数据图也可以用Excel绘制。 接下来用绘制一个销售表的示例演示。 1.将数据输入Excel 数学书 语文书 英语书 一月 80 94 77 二月 95 86 84 三月 130 93 79 四月 …

实用干货:再见ElementPlus,我有更好的了

大家好&#xff0c;我是大澈&#xff01; 本文约1200字&#xff0c;整篇阅读大约需要3分钟。 感谢关注微信公众号&#xff1a;“程序员大澈”&#xff0c;免费领取"面试大礼包"一份&#xff0c;然后免费加入问答群&#xff0c;从此让解决问题的你不再孤单&#xff…

任务调度系统就该这么设计(万能通用),稳的一批!

今天来扒一扒轻量级的分布式任务调度平台Xxl-Job背后的架构原理 核心概念 这里还是老样子&#xff0c;为了保证文章的完整性和连贯性&#xff0c;方便那些没有使用过的小伙伴更加容易接受文章的内容&#xff0c;快速讲一讲Xxl-Job中的概念和使用 如果你已经使用过了&#xf…

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

背景 在项目过程中&#xff0c;有时候你需要调用非C#编写的DLL文件&#xff0c;尤其在使用一些第三方通讯组件的时候&#xff0c;通过C#来开发应用软件时&#xff0c;就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。 步骤 1. 创建一个CSharp…

Java 8特性:Lambda表达式、函数式接口与Stream API的深度探索

一、引言 随着编程范式的不断演变&#xff0c;Java语言也在不断地发展和创新。Java 8的发布&#xff0c;为开发者们带来了诸多全新的特性&#xff0c;其中包括Lambda表达式、函数式接口以及Stream API。这些特性使得Java语言的编程更加简洁、优雅&#xff0c;同时也提高了代码…

mybatis多表映射-对多关联

1、建库建表 create database mybatis-example; use mybatis-example; create table t_book (bid varchar(20) primary key,bname varchar(20),stuid varchar(20) ); insert into t_book values(b001,Java,s001); insert into t_book values(b002,Python,s002); insert into …

docker部署go gin框架 Windows环境

目录 文章目的是什么 环境介绍 Windows 环境下 docker 部署 go gin 详细步骤 运行容器时因为挂载文件可能会出现的问题 直接部署gin&#xff08;跳过运行容器时因为挂载文件可能会出现的问题&#xff09; 文章目的是什么 假设我们学习了 go 语言&#xff0c;在 Windows(本…

6.rk3588获取摄像头和激光雷达数据(用线程根据时间同步)

文件夹结构如下&#xff1a; 如果没有特殊说明&#xff0c;我们将py文件写在该路径里面。 保存数据的路径如下&#xff1a; ---img_lidar_save ---2023-12-13&#xff08;根据日期自动生成当天保存数据的文件夹) ---camera_data(相机数据文件夹&#xff09; ---image(保存相加…

[蓝桥杯刷题]合并区间、最长不连续子序列、最长不重复数组长度

前言 ⭐Hello!这里是欧_aita的博客。 ⭐今日语录: 成功的关键在于对目标的持久追求。 ⭐个人主页&#xff1a;欧_aita ψ(._. )>⭐个人专栏&#xff1a; 数据结构与算法 数据库 文章目录 前言合并区间问题&#x1f4d5;现实应用大致思路代码实现代码讲解 最长不连续子序列&a…

jvisualvm手动安装VisualGC插件

前言 笔者近期排查问题需要查看GC的情况&#xff0c;于是用到了jvisualvm这个工具&#xff0c;查阅网上资料发现它有一个名为VisualGC的插件非常好用&#xff0c;于是笔者以此文记录一下VisualGC插件的安装步骤。 安装步骤 下载插件 首先我们要到官网 https://visualvm.gi…

未势能源受邀参加中国氢能100人论坛并发表演讲

12月12日-14日&#xff0c;“2023氢能嘉年华暨中国氢能100人论坛年会”在苏州举办&#xff0c;行业内专家学者、氢能头部企业代表等齐聚现场&#xff0c;聚焦氢能在化工、钢铁、交通等领域发展&#xff0c;共同探讨我国氢能产业初期前进之路。 未势能源液氢总工程师黄欢明受邀…

DevOps搭建(六)-安装Maven详细步骤

1、官网下载 下载地址&#xff1a; Maven – Download Apache Maven 2、上传压缩包到服务器 把下载好的压缩包上传到服务器上。 3、解压压缩包 解压压缩包到安装目录/usr/local/ tar -zxvf apache-maven-3.9.3-bin.tar.gz -C /usr/local/ 切换到/usr/local目录下ls命令看…

基于FPGA的视频接口之高速IO(光纤)

简介 对于高速IO口配置光纤,现在目前大部分开发板都有配置,且也有说明,在此根据自己的工作经验以及对于各开发板的说明归纳 通过高速IO接口,以及硬件配置,可以实现对于光纤的收发功能,由于GTX的速率在500Mbs到10Gbps之间,但通道高速io可配置光纤10G硬件,物理通完成,则…

SpringIOC之Jsr330ScopeMetadataResolver

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…