当前位置: 首页 > news >正文

【SpringBoot苍穹外卖】debugDay04

一、getById 与 new

我在修改数据时,产生疑问,注释掉是我一开始写得,new对象是答案提供的,我就好奇两者之间区别。

1. 使用 setmealMapper.getById 获取现有对象

Setmeal setmeal = setmealMapper.getById(setmealDTO.getId());
BeanUtils.copyProperties(setmealDTO, setmeal); // 仅覆盖 setmealDTO 中存在的字段
setmealMapper.update(setmeal);
优点
  • 保留原有数据:从数据库中加载的 Setmeal 对象包含所有字段的当前值,未被 setmealDTO 覆盖的字段会保持不变。

  • 适合部分更新:如果只需要更新部分字段(如名称、价格等),而不想影响其他字段(如创建时间、状态等),这种方式更合适。

  • 数据一致性:确保数据库中的其他字段不会被意外覆盖或丢失。

缺点
  • 额外数据库查询:需要先查询数据库,增加一次 IO 操作,可能影响性能。

  • 代码复杂度:如果字段较多,可能需要手动处理某些字段的更新逻辑。

适用场景
  • 需要保留部分字段(如创建时间、状态等)不被修改。

  • 业务逻辑要求基于现有数据进行更新。


2. 使用 new Setmeal() 创建新对象

Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO, setmeal); // 完全使用 setmealDTO 的数据
setmealMapper.update(setmeal);
优点
  • 简单直接:不需要额外的数据库查询,代码更简洁。

  • 性能更高:减少一次数据库查询,适合对性能要求较高的场景。

  • 适合完全覆盖:如果业务逻辑要求完全覆盖数据库中的记录,这种方式更合适。

缺点
  • 丢失原有数据:如果 setmealDTO 中没有包含某些字段(如创建时间、状态等),这些字段会被覆盖为默认值(如 null 或 0),可能导致数据丢失。

  • 不适合部分更新:无法保留未被 setmealDTO 覆盖的字段。

适用场景
  • 需要完全覆盖数据库中的记录。

  • setmealDTO 包含了所有需要更新的字段。

  • 对性能要求较高,且不需要保留原有数据。


总结与建议

  • 如果需要保留部分字段(如创建时间、状态等),建议使用 setmealMapper.getById,确保数据一致性。

  • 如果完全覆盖数据且 setmealDTO 包含所有字段,建议使用 new Setmeal(),代码更简洁且性能更高。


最佳实践

如果不确定哪种方式更合适,可以采用以下策略:

  1. 默认使用 setmealMapper.getById,确保数据安全性和一致性。

  2. 在性能敏感的场景下,如果确认 setmealDTO 包含所有字段且不需要保留原有数据,可以使用 new Setmeal()

if (needPartialUpdate) {Setmeal setmeal = setmealMapper.getById(setmealDTO.getId());BeanUtils.copyProperties(setmealDTO, setmeal); // 部分更新setmealMapper.update(setmeal);
} else {Setmeal setmeal = new Setmeal();BeanUtils.copyProperties(setmealDTO, setmeal); // 完全覆盖setmealMapper.update(setmeal);
}

根据业务需求灵活选择,既能保证数据安全,又能优化性能。

看来我一开始写得也不错,嘻嘻~。

二、这段代码,为什么copy之后,还要update呢?

Setmeal setmeal = setmealMapper.getById(setmealDTO.getId()); // 从数据库获取对象
BeanUtils.copyProperties(setmealDTO, setmeal); // 将 DTO 的数据复制到实体对象
setmealMapper.update(setmeal); // 更新数据库
1. setmealMapper.getById
  • 从数据库中加载一个 Setmeal 对象。

  • 这个对象是持久化对象,即它与数据库中的一条记录关联。

2. BeanUtils.copyProperties
  • 将 setmealDTO 中的数据复制到 setmeal 对象中。

  • 这一步只是修改了内存中的 setmeal 对象,并没有自动同步到数据库

3. setmealMapper.update
  • 将修改后的 setmeal 对象同步到数据库。

  • 这一步才是真正将内存中的修改持久化到数据库中。


为什么需要 update

  1. 内存与数据库是分离的

    • Java 中的对象是内存中的数据结构,修改对象并不会自动同步到数据库。

    • 数据库是一个独立的存储系统,需要通过 SQL 语句(如 UPDATE)来修改数据。

  2. BeanUtils.copyProperties 只是内存操作

    • 它只是将 setmealDTO 的属性值复制到 setmeal 对象中,修改的是内存中的对象状态。

    • 数据库并不知道这些修改,因此需要显式调用 update 方法将修改同步到数据库。

  3. ORM 框架的工作方式

    • 如果你使用的是 MyBatis 或 JPA 等 ORM 框架,它们并不会自动跟踪对象的变化。

    • 你需要显式调用 update 方法,告诉框架将对象的状态同步到数据库。


类比理解

可以将这个过程类比为编辑文档:

  1. 从文件柜中取出文档getById):你从数据库加载了一个对象。

  2. 在文档上修改内容copyProperties):你在内存中修改了对象。

  3. 将修改后的文档放回文件柜update):你需要将修改后的对象保存回数据库。

如果你不执行第三步,文件柜中的文档(数据库中的数据)就不会被更新。


如果你不想手动调用 update

如果你希望修改对象后自动同步到数据库,可以考虑以下方式:

  1. 使用 JPA(Hibernate)

    • JPA 提供了自动脏检查机制,修改对象后,在事务提交时会自动同步到数据库。

    • 示例:

      Setmeal setmeal = setmealRepository.findById(setmealDTO.getId()).orElseThrow();
      BeanUtils.copyProperties(setmealDTO, setmeal);
      // 不需要显式调用 update,事务提交时会自动同步
  2. 使用 MyBatis 的动态更新

    • 可以配置 MyBatis 只更新变化的字段,而不是全部字段。


总结

  • BeanUtils.copyProperties 只是修改了内存中的对象,数据库并不知道这些变化。

  • 必须显式调用 setmealMapper.update 将修改同步到数据库。

  • 如果你希望自动同步,可以考虑使用 JPA 或其他支持自动脏检查的框架。

三、补充

在写day04时发现少写了个通过套餐id查询菜品的接口,在此记录一下。

相关文章:

【SpringBoot苍穹外卖】debugDay04

一、getById 与 new 我在修改数据时,产生疑问,注释掉是我一开始写得,new对象是答案提供的,我就好奇两者之间区别。 1. 使用 setmealMapper.getById 获取现有对象 Setmeal setmeal setmealMapper.getById(setmealDTO.getId()); …...

C++中的顺序容器(一)

文章目录 顺序容器概述所有容器类型都支持的操作迭代器容器定义与初始化将一个容器初始化为另一个容器的拷贝标准库array具有固定大小 赋值和swap关系运算符 顺序容器的特有操作向顺序容器添加元素访问元素删除元素特殊的forward_list操作改变容器的大小容器操作可能是迭代器失…...

【复现DeepSeek-R1之Open R1实战】系列4:跑通GRPO!

目录 1 配置环境2 训练2.1 命令和配置参数2.2 num_generations2.2.1 参数定义2.2.2 参数含义2.2.3 示例2.2.4 使用场景2.2.5 示例代码 2.3 显存占用和耗时 3 结果 1 配置环境 关于环境配置,可以参考这篇博文:【复现DeepSeek-R1之Open R1实战】系列1&…...

Redis原理简述及发布订阅消息队列

目录 1 什么是Redis 2 Redis 非阻塞IO内部原理 2.1 IO多路复用策略 2.2 Reactor设计模式 3 基于PubSub的消息队列(发布-订阅) 由于集群之后存在多台服务器,并且不同客户端连接的可能是不同的服务器,因此在聊天过程中涉及到服…...

ThreadLocal为什么会内存溢出

每个线程(Thread 对象)内部维护一个 ThreadLocalMap,用于存储该线程的所有 ThreadLocal 变量的键值对: ThreadLocalMap虽然是ThreadLocal的静态内部类,但是Thread 对象的属性,当线程存活时ThreadLocalMap不会被回收。 Key:ThreadLocal 实例的 弱引用(WeakReference)。…...

假面与演员:到底是接口在使用类,还是类在使用接口?编程接口与物理接口的区别又是什么?

前言:本篇文章解释了接口学习过程中的2个常见问题,一个是“为什么是类在使用接口”,另一个一个是“编程接口与物理接口的差异源于所处的抽象层次和交互模式的不同”,旨在揭示编程接口的本质。 Part1.是类在使用接口 当学习接口时…...

数据结构——Makefile、算法、排序(2025.2.13)

目录 一、Makefile 1.功能 2.基本语法和相关操作 (1)创建Makefile文件 (2)编译规则 (3)编译 (4)变量 ①系统变量 ②自定义变量 二、 算法 1.定义 2.算法的设计 &#xff…...

算法之 跳跃游戏

文章目录 55.跳跃游戏思路参考:56.合并区间 55.跳跃游戏 55.跳跃游戏 灵神思路 思路分析: 两种思路,思路1是我们可以直接维护当前到达i的时候所能到达的最右的边界mr,如果i>mr就说明无法到达i,否则就是可以到达;…...

C#中的图形渲染模式

在C#中,图形模式通常用于定义如何渲染或处理图形。可以枚举定义如下四种图形模式:AUTO、GDI、DIB 和 FBO。这些模式可能用于指定不同的图形渲染技术或后端。下面是对这些模式的详细解释: 1. AUTO (自动模式) 含义:自动选择最适合…...

二.数据治理流程架构

1、数据治理流程架构核心思想: 该图描绘了一个以数据标准规范体系为核心,大数据生命周期管理为主线,数据资源中心为依托,并辅以数据质量管理和大数据安全与隐私管理的数据治理流程架构。它旨在通过规范化的流程和技术手段&#x…...

瑞萨RA-T系列芯片ADCGPT功能模块的配合使用

在马达或电源工程中,往往需要采集多路AD信号,且这些信号的优先级和采样时机不相同。本篇介绍在使用RA-T系列芯片建立马达或电源工程时,如何根据需求来设置主要功能模块ADC&GPT,包括采样通道打包和分组,GPT触发启动…...

扩散模型中的马尔可夫链设计演进:从DDPM到Stable Diffusion全解析

一、技术原理与数学推导(附核心公式) 1.1 扩散过程数学建模 马尔可夫链前向过程定义: q(x_{1:T}|x_0) \prod_{t1}^T q(x_t|x_{t-1})噪声调度函数(以余弦调度为例): \beta_t \frac{1 - \cos(\pi t/T)}…...

通俗诠释 DeepSeek-V3 模型的 “671B” ,“37B”与 “128K”,用生活比喻帮你理解模型的秘密!

欢迎来到涛涛聊AI。 在DeepSeek-V3模型的参数描述中,你可能会看到类似“671B 37B 128K”这样的标记。这些字母和数字的组合看起来像密码,但其实它们揭示了模型的“大脑容量”和“工作方式”。我们用日常生活的比喻来解释: 一、数字含义&…...

大模型常识:什么是大模型/大语言模型/LLM

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 一、什么是语言模型? 那么什么是语言模…...

iOS 中使用 FFmpeg 进行音视频处理

在 iOS 中使用 FFmpeg 进行音视频处理,通常需要将 FFmpeg 的功能集成到项目中。由于 FFmpeg 是一个 C 库,直接在 iOS 中使用需要进行一些配置和封装。 1. 在 iOS 项目中集成 FFmpeg 方法 1:使用 FFmpeg 预编译库 下载 FFmpeg iOS 预编译库: 可以从以下项目中获取预编译的 …...

SAP-ABAP:SAP的Screen Layout Designer屏幕布局设计器详解及示例

在SAP中,Screen Layout Designer(屏幕布局设计器)是用于设计和维护屏幕(Dynpro)布局的工具。通过Screen Layout Designer,您可以创建和修改屏幕元素(如输入字段、按钮、文本、表格控件等&#x…...

一.数据治理理论架构

1、数据治理核心思想: 数据治理理论架构图描绘了一个由顶层设计、管控机制、核心领域和管理系统四个主要部分组成的数据治理框架。它旨在通过系统化的方法,解决数据治理机制缺失引发的业务和技术问题,并最终提升企业的数据管理水平。 数据治…...

亲测有效!使用Ollama本地部署DeepSeekR1模型,指定目录安装并实现可视化聊天与接口调用

文章目录 一、引言二、准备工作(Ollama 工具介绍与下载)2.1 Ollama介绍2.2 Ollama安装 三、指定目录安装 DeepSeek R1四、Chatbox 可视化聊天搭建4.1 Chatbox下载安装4.2 关联 DeepSeek R1 与 Chatbox 的步骤 五、使用 Ollama 调用 DeepSeek 接口5.1 请求…...

MySQL安装MySQL服务时提示Install-Remove of the Service Denied

文章目录 问题描述排查1.字面意思2.搜索引擎3.官方文档4.源码 处理方法相关扩展 问题描述 MySQL安装MySQL服务时提示Install-Remove of the Service Denied! 详细报错如下: C:\Users\荷塘月色>net start mysql 服务名无效。请键入 NET HELPMSG 2185 以获得更多…...

(Windows | Linux)ssh访问服务器报错:no matching key exchange method found

问题现象 ssh user1192.168.1X.XX Unable to negotiate with 192.168.1X.XX port 22: no matching key exchange method found. Their offer: gss-group1-sha1-toWM5Slw5Ew8Mqkayal2g,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...