【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()
,代码更简洁且性能更高。
最佳实践
如果不确定哪种方式更合适,可以采用以下策略:
-
默认使用
setmealMapper.getById
,确保数据安全性和一致性。 -
在性能敏感的场景下,如果确认
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
?
-
内存与数据库是分离的:
-
Java 中的对象是内存中的数据结构,修改对象并不会自动同步到数据库。
-
数据库是一个独立的存储系统,需要通过 SQL 语句(如
UPDATE
)来修改数据。
-
-
BeanUtils.copyProperties
只是内存操作:-
它只是将
setmealDTO
的属性值复制到setmeal
对象中,修改的是内存中的对象状态。 -
数据库并不知道这些修改,因此需要显式调用
update
方法将修改同步到数据库。
-
-
ORM 框架的工作方式:
-
如果你使用的是 MyBatis 或 JPA 等 ORM 框架,它们并不会自动跟踪对象的变化。
-
你需要显式调用
update
方法,告诉框架将对象的状态同步到数据库。
-
类比理解
可以将这个过程类比为编辑文档:
-
从文件柜中取出文档(
getById
):你从数据库加载了一个对象。 -
在文档上修改内容(
copyProperties
):你在内存中修改了对象。 -
将修改后的文档放回文件柜(
update
):你需要将修改后的对象保存回数据库。
如果你不执行第三步,文件柜中的文档(数据库中的数据)就不会被更新。
如果你不想手动调用 update
如果你希望修改对象后自动同步到数据库,可以考虑以下方式:
-
使用 JPA(Hibernate):
-
JPA 提供了自动脏检查机制,修改对象后,在事务提交时会自动同步到数据库。
-
示例:
Setmeal setmeal = setmealRepository.findById(setmealDTO.getId()).orElseThrow(); BeanUtils.copyProperties(setmealDTO, setmeal); // 不需要显式调用 update,事务提交时会自动同步
-
-
使用 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.算法的设计 ÿ…...

算法之 跳跃游戏
文章目录 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-…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
SQL Server 触发器调用存储过程实现发送 HTTP 请求
文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...