【MyBatis】使用MyBatis框架在两张表是一对多的情况下,进行分步查询,发现对查询出来的结果进行封装时没有将实体类的id进行赋值

news2024/12/23 15:15:22

Catalog

  • MyBatis在两张表是一对多的情况下,进行分步查询,发现对查询出来的结果进行封装时没有将实体类的id进行赋值
    • 1. 表结构
    • 2. 场景
    • 3. 实现方式
      • 具体步骤
    • 4 .测试
    • 5. 解决方法

MyBatis在两张表是一对多的情况下,进行分步查询,发现对查询出来的结果进行封装时没有将实体类的id进行赋值

1. 表结构

大致了解一下即可,bug在后面…

  • 订单表

    CREATE TABLE `orders` (
      `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
      `number` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '订单号',
      `status` int NOT NULL DEFAULT '1' COMMENT '订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款',
      `user_id` bigint NOT NULL COMMENT '下单用户',
      `address_book_id` bigint NOT NULL COMMENT '地址id',
      `order_time` datetime NOT NULL COMMENT '下单时间',
      `checkout_time` datetime DEFAULT NULL COMMENT '结账时间',
      `pay_method` int NOT NULL DEFAULT '1' COMMENT '支付方式 1微信,2支付宝',
      `pay_status` tinyint NOT NULL DEFAULT '0' COMMENT '支付状态 0未支付 1已支付 2退款',
      `amount` decimal(10,2) NOT NULL COMMENT '实收金额',
      `remark` varchar(100) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '备注',
      `phone` varchar(11) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '手机号',
      `address` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '地址',
      `user_name` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '用户名称',
      `consignee` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '收货人',
      `cancel_reason` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '订单取消原因',
      `rejection_reason` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '订单拒绝原因',
      `cancel_time` datetime DEFAULT NULL COMMENT '订单取消时间',
      `estimated_delivery_time` datetime DEFAULT NULL COMMENT '预计送达时间',
      `delivery_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '配送状态  1立即送出  0选择具体时间',
      `delivery_time` datetime DEFAULT NULL COMMENT '送达时间',
      `pack_amount` int DEFAULT NULL COMMENT '打包费',
      `tableware_number` int DEFAULT NULL COMMENT '餐具数量',
      `tableware_status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '餐具数量状态  1按餐量提供  0选择具体数量',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='订单表';
    
    
  • 订单明细表
    主要记录每个订单上,每一类商品的具体信息,一类商品占一条记录

    CREATE TABLE `order_detail` (
      `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
      `name` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '名字',
      `image` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '图片',
      `order_id` bigint NOT NULL COMMENT '订单id',
      `dish_id` bigint DEFAULT NULL COMMENT '菜品id',
      `setmeal_id` bigint DEFAULT NULL COMMENT '套餐id',
      `dish_flavor` varchar(50) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin DEFAULT NULL COMMENT '口味',
      `number` int NOT NULL DEFAULT '1' COMMENT '数量',
      `amount` decimal(10,2) NOT NULL COMMENT '金额',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin COMMENT='订单明细表';
    
  • 查询结果封装类

    public class OrderVO implements Serializable {
    
    	 /**
         * 订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消
         */
        public static final Integer PENDING_PAYMENT = 1;
        public static final Integer TO_BE_CONFIRMED = 2;
        public static final Integer CONFIRMED = 3;
        public static final Integer DELIVERY_IN_PROGRESS = 4;
        public static final Integer COMPLETED = 5;
        public static final Integer CANCELLED = 6;
    
        /**
         * 支付状态 0未支付 1已支付 2退款
         */
        public static final Integer UN_PAID = 0;
        public static final Integer PAID = 1;
        public static final Integer REFUND = 2;
    
        private static final long serialVersionUID = 1L;
    
        private Long id;
    
        //订单号
        private String number;
    
        //订单状态 1待付款 2待接单 3已接单 4派送中 5已完成 6已取消 7退款
        private Integer status;
    
        //下单用户id
        private Long userId;
    
        //地址id
        private Long addressBookId;
    
        //下单时间
        private LocalDateTime orderTime;
    
        //结账时间
        private LocalDateTime checkoutTime;
    
        //支付方式 1微信,2支付宝
        private Integer payMethod;
    
        //支付状态 0未支付 1已支付 2退款
        private Integer payStatus;
    
        //实收金额
        private BigDecimal amount;
    
        //备注
        private String remark;
    
        //用户名
        private String userName;
    
        //手机号
        private String phone;
    
        //地址
        private String address;
    
        //收货人
        private String consignee;
    
        //订单取消原因
        private String cancelReason;
    
        //订单拒绝原因
        private String rejectionReason;
    
        //订单取消时间
        private LocalDateTime cancelTime;
    
        //预计送达时间
        private LocalDateTime estimatedDeliveryTime;
    
        //配送状态  1立即送出  0选择具体时间
        private Integer deliveryStatus;
    
        //送达时间
        private LocalDateTime deliveryTime;
    
        //打包费
        private int packAmount;
    
        //餐具数量
        private int tablewareNumber;
    
        //餐具数量状态  1按餐量提供  0选择具体数量
        private Integer tablewareStatus;
        //订单菜品信息
        private String orderDishes;
    
        //订单详情
        private List<OrderDetail> orderDetailList;
    
    }
    

2. 场景

在实现苍穹外卖的查询历史订单这个接口时,发现前端需要返回的数据需要两张表联查,这两张表分别时订单表和订单明细表,订单表和订单明细表是一对多的关系,即一条订单记录可能对应多条订单明细记录,然后将结果进行封装。

这里考到考虑这两张表的冗余字段(即不同表之间相同的字段)比较多,对于查询出来的结果集封装赋值到Java实体类的时候,需要改很多别名,所以这里决定直接使用分步查询

  1. 根据用户id查询出所有的订单信息
  2. 根据订单id查询出所有的订单明细信息

3. 实现方式

这里考虑到业务层代码不具备复用性,即每个项目的业务逻辑基本都是不一样的,所以直接看mapper层的代码

具体步骤

  1. 先设计好结果集映射,即我们需要将查询出来的订单明细信息赋值到List这个集合里面,在springboot工程的配置文件中已经开启了驼峰命名映射,所以其它字段不需要再添加到中。
  2. 查询订单表
  3. 查询订单明细表(注意标签中column是“select="com.sky.mapper.OrderMapper.selectWithDetailTwo”执行这段查询语句的条件,即订单表的id)
    <resultMap id="selectWithDetailResultMap" type="com.sky.vo.OrderVO" >
        <collection property="orderDetailList"
                    ofType="com.sky.entity.OrderDetail"
                    select="com.sky.mapper.OrderMapper.selectWithDetailTwo"
                    column="id">

        </collection>
    </resultMap>
    <select id="selectWithDetail"
            resultType="com.sky.vo.OrderVO"
            resultMap="selectWithDetailResultMap"
            parameterType="com.sky.dto.OrdersPageQueryDTO"
    >
        select * from orders
        <where>
            <if test="userId != null ">
                user_id = #{userId}
            </if>

            <if test="status != null ">
                and status = #{status}
            </if>
        </where>
    </select>

    <select id="selectWithDetailTwo" resultType="orderDetail">
        select * from order_detail where order_id = #{id}
    </select>

4 .测试

使用swagger2测试的时候发现,每一条订单的id都是空的,但是实体类其它属性的值都赋上了,尽管已经开启了驼峰命名映射(字段名和实体类属性名的映射)。
Alt

5. 解决方法

目前由于本人还没有学习过Mybatis框架的源码,无法追溯到具体问题的源头,只有一个笨方法:直接标签中增加id的映射,如下

Alt

  • 结果:订单的id成功赋值。
    Alt

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

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

相关文章

【顺序表小题】

顺序表小题 移除元素思路一思路二 合并两个有序数组思路一思路二 移除元素 链接: 题目链接 思路一 创建新的数组&#xff0c;遍历原数组&#xff0c;将不为val的值放到新数组中 思路二 双指针法。 创建两个变量src,dst。 1)若src指向的值为val&#xff0c;则src 2)若sr…

堆的介绍,实现(c语言实现)

目录 堆的概念 堆的性质&#xff1a; 堆的分类 父子结点的下标关系 堆的向下调整算法 ​编辑小堆 大堆 建堆 堆的向上调整算法 小堆 大堆 堆的基本操作 定义堆 初始化堆 销毁堆 打印堆 堆的插入 堆的删除 大堆&#xff08;Max Heap&#xff09;的向下调整算法…

51单片机入门(一)

1. 51单片机的基础介绍 2. RAM和ROM的区别 总体而言&#xff0c;RAM和ROM在计算机系统中起着不同的角色&#xff0c;RAM用于临时存储运行时数据&#xff0c;而ROM用于存储永久性的固件和系统程序。 3. 为什么叫51单片机 因为51系列单片机都是使用Intel 8031指令系统的单片机…

[linux网络编程]UDP协议和TCP协议的使用

目录 看以下内容前&#xff0c;你要先了解main函数带参数有什么用、 了解socket的相关函数接口 如果不了解socket的相关函数接口请先看我这篇文章 main函数带参数有什么用 UDP udp_server 1.生成socket文件描述符 2.填充sockaddr_in信息 3.bind 4.发&#xff08;收&…

Golang基础7-并发编程

并发编程 https://www.cnblogs.com/Survivalist/p/11527949.html 进程和线程、协程的区别_线程协程进程的区别-CSDN博客 Golang中的并发编程是一个重点&#xff0c;我们要了解Golang中的并发Goroutine因此需要先理解进程、线程、之后再理解协程。 进程&#xff1a;操作系统进…

论文发表英语类期刊《校园英语》如何投稿?

论文发表英语类期刊《校园英语》如何投稿&#xff1f; 《校园英语》本刊设有栏目&#xff1a;本期关注、教研探索、实践前沿、经验交流、翻译探究、语言文化等。 《校园英语》杂志是经国家新闻出版总署批准&#xff0c;创刊于2000年&#xff0c;由河北出版传媒集团主管&#…

AI文章写作网站

最强AI文章写作网站——心语流光&#xff08; Super Ai Writer &#xff09; 特点 多轮问答写作&#xff0c;自动携带历史记录进行问答可以自定义携带历史记录的轮数&#xff0c;为0则携带全部历史记录&#xff0c;有效避免token浪费&#xff08;类似coze平台&#xff09;AI生…

制作自己的YOLOv8数据集

制作自己的YOLO8数据集 前言 该数据集的格式参照于coco数据集结构✨ 步骤一&#xff1a;收集图像数据 从互联网上下载公开的数据集&#xff0c;也可以使用摄像头或其他设备自行采集图像&#xff0c;确保你的图像数据覆盖了你感兴趣的目标和场景 步骤二&#xff1a;安装Labe…

OCNet

object context pooling (OCP) 作者未提供代码

【黑马点评Redis——002商户查询缓存】

1. 商户查询缓存 2. 知识储备和课程内容 2.1 什么是缓存 缓存是数据交换的缓冲区&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 浏览器缓存应用层缓存数据库缓存CPU缓存磁盘缓存 缓存的作用&#xff1a; 降低后端负载提高读写效率&#xff0c;降低响应…

计网笔记:第1章 计算机网络概论

计网笔记&#xff1a;第1章 计算机网络概论 第1章 计算机网络概论1.1 计算机网络发展与分类1.2 OSI和TCP/IP参考模型OSI与TCP/IP参考模型图 1.3 数据封装与解封过程借助OSI模型理解数据传输过程(封装)借助OSI模型理解数据传输过程(解封) 1.4 本章例题 第1章 计算机网络概论 1.…

喜讯!和鲸科技入选 “算力中关村”—— 2024 算力技术创新与应用服务案例集

2024 年 4 月 27 日上午&#xff0c;以"技术重塑生态 算力驱动未来"为主题的"算力中关村"技术成果对接交流专场活动在北京成功举办。作为 2024 中关村论坛的重要组成部分&#xff0c;该专场活动旨在为各界人士打造一个专业化、高效化的技术成果展示与对接平…

SpringMVC 源码剖析

SpringMVC 源码剖析 0 从源码角度分析SpringMVC执行流程 // 前端控制器&#xff0c;SpringMVC最核心的类 public class DispatcherServlet extends FrameworkServlet {// 前端控制器最核心的方法&#xff0c;这个方法是负责处理请求的&#xff0c;一次请求&#xff0c;调用一次…

Redis入门到通关之数据结构解析-IntSet

文章目录 概述IntSet升级简易源码总结 欢迎来到 请回答1024 的博客 &#x1f34e;&#x1f34e;&#x1f34e;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后端开发者。 …

详细谈电脑ip、域名、内网、外网、localhost、127.0.0.1、网关等通讯基础知识(易懂)

1. ip地址与域名的定义以及其关系 ip地址的定义&#xff1a; IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一…

【ARM 裸机】BSP 工程管理

回顾一下上一节&#xff1a;【ARM 裸机】NXP 官方 SDK 使用&#xff0c;我们发现工程文件夹里面各种文件非常凌乱&#xff1b; 那么为了模块化整理代码&#xff0c;使得同一个属性的文件存放在同一个目录里面&#xff0c;所以学习 BSP 工程管理非常有必要。 1、准备工作 新建…

短视频账号矩阵系统===4年技术源头打磨

短视频矩阵系统技术源头打磨需要从多个方面入手&#xff0c;以下是一些建议&#xff1a; 1. 基础技术研发&#xff1a;不断投入资金和人力进行基础技术研发&#xff0c;包括但不限于视频处理、人工智能、大数据等技术&#xff0c;以提高短视频矩阵系统的性能和稳定性。 2. 优化…

多进程编程:原理、技术与应用

title: 多进程编程&#xff1a;原理、技术与应用 date: 2024/4/26 12:14:47 updated: 2024/4/26 12:14:47 categories: 后端开发 tags: 多进程并发编程网络服务分布式系统任务处理进程池线程对比 第一章&#xff1a;进程与线程 进程与线程的概念及区别&#xff1a; 进程&am…

四信智能化感知与控制方案,助推灌区续建配套与现代化改造建设

“十四五”明确提到推进大中型灌区节水改造和精细化管理&#xff0c;建设节水灌溉骨干工程&#xff0c;同步推进水价综合改革。 灌区是保障国家粮食安全的重要基础性设施&#xff0c;是实施乡村振兴战略的水利支撑。灌区续建配套与现代化改造是实施乡村振兴战略一项重要任务。为…

el-tab面板添加折叠按钮方法

折叠后 <template><div class"page-type-left-wrap"><div class"page-type-left-wrap-info nav-link" :class"{ leftCollapse }"><el-tabs v-model"activeName" class"page-tabs" tab-change"han…