【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-…...
Uniapp+Vue3+Ts项目升级实战:解决App.vue中globalData无法导出的两种实用方案
UniappVue3Ts项目升级实战:重构全局状态管理的进阶策略 当开发者将Uniapp项目从Vue2迁移到Vue3TypeScript技术栈时,globalData的导出问题往往成为第一个需要攻克的堡垒。这个看似简单的技术障碍背后,实际上隐藏着从Options API到Composition …...
题解:AcWing 6031 计算
本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。 欢迎大…...
制造业PMI连续扩张,但就业市场冰火两重天:这次你站哪边?
两份数据,两个完全不同的就业市场今天,国家统计局发布了4月PMI数据。制造业PMI:50.3%,连续第二个月扩张。非制造业PMI:49.4%,跌破荣枯线。这两个数字放在一起,翻译成人话就是:造东西…...
小红书三面挂了!被问“热搜榜怎么防 5 万水军”,我答了限流
深夜 2 点,某明星的热搜词瞬间空降榜单前三,后台警报长鸣。本文拆解小红书热搜背后的“排毒”系统:从信息熵(Entropy)识别异常团伙,到斜率检测拦截突发流量,再到让黑产最绝望的“影子榜单”策略…...
如何快速掌握DamaiHelper:大麦网抢票脚本完整使用指南
如何快速掌握DamaiHelper:大麦网抢票脚本完整使用指南 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper DamaiHelper是一款基于PythonSelenium开发的大麦网自动化抢票脚本,专…...
虫草贵族变平价?深圳福田这家店做到了
家人们,养生界搞大事了!金尊草带着IP金小尊空降深圳福田——第2家门店(皇庭广场店)正式开业。这一次,金尊草让冬虫夏草从“保健品刺客”变成了“人人都吃得起滋补品”。金尊草品牌slogan“吃得到的冬虫夏草”尊嘟假嘟&…...
Docker 27 AI调度内核逆向拆解(LLM驱动的容器编排新范式)
更多请点击: https://intelliparadigm.com 第一章:Docker 27 AI调度内核的架构演进与范式跃迁 Docker 27 引入了全新的 AI-aware 调度内核(AI-Scheduler Core),标志着容器运行时从资源隔离向智能语义感知的范式跃迁。…...
SlickGPT:专为开发者设计的轻量级AI助手工具链
1. 项目概述:一个为开发者打造的“智能副驾”最近在GitHub上看到一个挺有意思的项目,叫slickgpt。初看这个名字,你可能会觉得这又是一个基于GPT API的简单封装,或者是一个聊天界面。但如果你点进去,仔细看看它的README…...
使用 Taotoken 官方风格 SDK 在 Python 项目中实现多模型切换调用
使用 Taotoken 官方风格 SDK 在 Python 项目中实现多模型切换调用 1. 准备工作 在开始迁移代码之前,需要确保已完成 Taotoken 平台的账号注册并获取有效的 API Key。登录 Taotoken 控制台后,可以在「API 密钥管理」页面创建新的密钥。同时建议在「模型…...
从游戏数据到数字记忆:YaeAchievement如何重构你的原神成就体验
从游戏数据到数字记忆:YaeAchievement如何重构你的原神成就体验 【免费下载链接】YaeAchievement 更快、更准的原神数据导出工具 项目地址: https://gitcode.com/gh_mirrors/ya/YaeAchievement 想象一下,你在提瓦特大陆冒险了数百小时,…...
