deepseek回答MyBatis-Plus UpdateWrapper setEntity() 示例代码

news/2025/3/31 12:06:52/文章来源:https://www.cnblogs.com/yuyu666/p/18797922

以下是 MyBatis-Plus 中 UpdateWrapper 结合 setEntity() 的示例代码及详细说明,适用于不同场景的更新操作:


‌1. 基础用法:更新实体中的非空字段‌

将实体对象中的非空字段作为更新内容,结合条件更新指定记录。

javaCopy Code
 
User user = new User(); user.setName("John"); // 设置要更新的字段 user.setAge(25); // 设置要更新的字段 user.setEmail(null); // 不更新 email(值为 null) UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("id", 1) // WHERE id = 1 .setEntity(user); // 绑定实体对象 userMapper.update(null, wrapper);

‌生成的 SQL‌:

sqlCopy Code
 
UPDATE user SET name='John', age=25 WHERE id=1;

‌说明‌:

  • setEntity() 会自动提取实体对象中 ‌非空字段‌ 作为更新内容。
  • email 字段因值为 null 被忽略。

‌2. 动态更新:仅更新提交的非空字段‌

结合业务逻辑动态更新部分字段(如用户修改个人信息)。

javaCopy Code
 
// 假设前端提交的修改数据(部分字段可能为空) User userParam = new User(); userParam.setName("Alice"); userParam.setEmail(""); // 空字符串(可能表示清空邮箱) UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("id", 1001) .setEntity(userParam); userMapper.update(null, wrapper);

‌生成的 SQL‌:

sqlCopy Code
 
UPDATE user SET name='Alice', email='' WHERE id=1001;

‌说明‌:

  • email 字段被更新为空字符串(非 null 值)。
  • 若字段值为 null(如 userParam.setEmail(null)),则不会更新。

‌3. 强制更新 null 字段‌

通过配置全局策略或使用 set() 方法强制更新 null 值。

‌方案1:全局配置(忽略 null 改为更新 null)‌

yamlCopy Code
 
# application.yml mybatis-plus: global-config: db-config: update-strategy: not_empty # 默认忽略 null,此处改为非空更新(根据需求调整)

‌方案2:使用 set() 显式覆盖‌

javaCopy Code
 
User user = new User(); user.setName(null); // 希望将 name 设为 null UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("id", 1) .setEntity(user) .set("name", null); // 显式强制更新为 null userMapper.update(null, wrapper);

‌生成的 SQL‌:

sqlCopy Code
 
UPDATE user SET name=null WHERE id=1;

‌4. 与 set() 方法联用(优先级控制)‌

当同时使用 setEntity() 和 set() 时,set() 优先级更高。

javaCopy Code
 
User user = new User(); user.setName("Bob"); user.setAge(30); UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.eq("id", 1) .set("age", 40) // 手动设置字段(优先级高于实体对象) .setEntity(user); // 绑定实体对象 userMapper.update(null, wrapper);

‌生成的 SQL‌:

sqlCopy Code
 
UPDATE user SET name='Bob', age=40 WHERE id=1; # age=40 覆盖了实体的 age=30

‌5. 复杂条件组合‌

结合 and()or() 等条件构造复杂更新逻辑。

javaCopy Code
 
User user = new User(); user.setStatus(1); UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.setEntity(user) .eq("role", "admin") // WHERE role = 'admin' .and(wq -> wq.lt("age", 18) // AND (age < 18 .or().gt("score", 90)); // OR score > 90) .set("remark", "特殊用户"); // 额外更新 remark 字段 userMapper.update(null, wrapper);

‌生成的 SQL‌:

sqlCopy Code
 
UPDATE user SET status=1, remark='特殊用户' WHERE role='admin' AND (age < 18 OR score > 90);

‌6. 批量更新‌

结合 in() 条件实现批量更新。

javaCopy Code
 
List<Long> ids = Arrays.asList(1001L, 1002L, 1003L); User user = new User(); user.setIsDeleted(1); // 逻辑删除字段 UpdateWrapper<User> wrapper = new UpdateWrapper<>(); wrapper.setEntity(user) .in("id", ids); // WHERE id IN (1001, 1002, 1003) userMapper.update(null, wrapper);

‌生成的 SQL‌:

sqlCopy Code
 
UPDATE user SET is_deleted=1 WHERE id IN (1001, 1002, 1003);

‌注意事项‌

  1. ‌字段覆盖规则‌:set() 方法优先级高于 setEntity()
  2. ‌空值处理‌:默认忽略 null 字段,需通过全局配置或显式 set() 更新 null
  3. ‌性能优化‌:避免全表更新,始终附加有效条件(如 eq("id", value))。
  4. ‌Lambda 安全‌:推荐使用 LambdaUpdateWrapper 避免字段名硬编码:
    javaCopy Code
     
    LambdaUpdateWrapper<User> wrapper = Wrappers.lambdaUpdate(); wrapper.eq(User::getId, 1) .set(User::getName, "Tom");

通过 setEntity() 可以简化基于实体对象的动态更新操作,结合条件构造器实现灵活的业务需求。

 

------------------------------------------------------------

 

以下为 MyBatis-Plus 中 LambdaUpdateWrapper 结合 setEntity 的详细示例及使用场景说明:


一、基础用法:通过 setEntity 绑定实体实现字段更新

javaCopy Code
 
// 创建实体对象,仅设置需更新的非空字段 User user = new User(); user.setName("李雷"); user.setAge(25); // 构建 LambdaUpdateWrapper 并绑定实体 LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>(); wrapper.setEntity(user) // 实体非空字段作为 SET 内容‌:ml-citation{ref="1,2" data="citationList"} .eq(User::getId, 1001); // WHERE id = 1001‌:ml-citation{ref="1" data="citationList"} userMapper.update(null, wrapper); // 第一个参数传 null

‌生成 SQL‌:

sqlCopy Code
 
UPDATE user SET name='李雷', age=25 WHERE id = 1001;

‌说明‌:setEntity 将实体中的非空字段自动填充为 SET 子句内容,避免手动逐个调用 set() 方法‌12。


二、结合动态条件实现复杂更新

javaCopy Code
 
User user = new User(); user.setStatus(2); // 更新状态为2 LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>(); wrapper.setEntity(user) .eq(User::getRole, "VIP") // WHERE role = 'VIP' .and(w -> w.lt(User::getScore, 60) // AND (score < 60 .or().isNull(User::getScore))); // OR score IS NULL)‌:ml-citation{ref="8" data="citationList"} userMapper.update(null, wrapper);

‌生成 SQL‌:

sqlCopy Code
 
UPDATE user SET status=2 WHERE role = 'VIP' AND (score < 60 OR score IS NULL);

‌说明‌:通过链式条件构造,支持动态组合 AND/OR 逻辑,适用于复杂业务场景‌8。


三、与 update(entity, wrapper) 结合使用

javaCopy Code
 
User user = new User(); user.setEmail("new@example.com"); LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>(); wrapper.gt(User::getAge, 18) // WHERE age > 18 .ne(User::getStatus, 0); // AND status != 0 userMapper.update(user, wrapper); // 实体参数传递非空字段

‌生成 SQL‌:

sqlCopy Code
 
UPDATE user SET email='new@example.com' WHERE age > 18 AND status != 0;

‌说明‌:此时 SET 子句由 user 实体的非空字段决定,wrapper 仅负责 WHERE 条件,代码更简洁‌27。


四、链式调用结合 set() 覆盖实体字段

javaCopy Code
 
User user = new User(); user.setName("韩梅梅"); LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>(); wrapper.setEntity(user) .set(User::getLoginCount, 0) // 手动覆盖 SET login_count=0‌:ml-citation{ref="6" data="citationList"} .eq(User::getId, 1002); userMapper.update(null, wrapper);

‌生成 SQL‌:

sqlCopy Code
 
UPDATE user SET name='韩梅梅', login_count=0 WHERE id = 1002;

‌说明‌:set() 方法可覆盖 setEntity 中的同名字段,实现灵活字段控制‌68。


五、Service 层封装示例

javaCopy Code
 
@Service public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService { @Override public boolean updateProfile(User user) { return update( new LambdaUpdateWrapper<User>() .setEntity(user) .eq(User::getId, user.getId()) ); } }

‌调用方式‌:

javaCopy Code
 
User user = new User(); user.setId(1003); user.setAvatar("avatar.jpg"); userService.updateProfile(user);

‌说明‌:通过 Service 层封装,结合链式调用简化业务代码‌37。


关键注意事项:

  1. ‌空值处理‌:setEntity 仅包含实体中非空字段,需确保业务逻辑中空值不会误覆盖数据‌12。
  2. ‌性能优化‌:若需强制更新某字段为 null,需通过 set(字段, null) 显式指定‌6。
  3. ‌版本兼容‌:MyBatis-Plus 3.5+ 版本中 setEntity 的行为与早期版本一致,但建议测试验证‌18。

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

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

相关文章

DeepSeek 3FS 架构分析和思考(上篇)

资料来源:火山引擎-开发者社区 2025 年 2 月28 日,DeepSeek 在其开源周最后一天压轴发布了自研的并行文件系统 Fire-Flyer File System,简称 3FS。该系统支撑了 DeepSeek V3&R1 模型训练、推理的全流程,在数据预处理、数据集加载、CheckPoint、KVCache 等场景发挥了重要…

Smooth min-entropy

信息论的神奇妙妙工具——Smoothed entropy (平滑熵) 回顾min-entropy 首先有\(\infty\)-divergence \[D_{\infty}(P \| Q) = \max_{x} \log \frac{P(x)}{Q(x)} \]用\(D_{\infty}\)定义min-entropy \[\begin{aligned}H_{\min}(X) &= - D_{\infty}(P_X\| 1) = -\log \ma…

Vue3封装支持Base64导出的电子签名组件

效果图准备工作 组件内用到elementPlus,vue-esign组件,使用前提前安装好。组件代码 <template><!-- 签名容器 --><div class="sign-container" ><div class="sign-preview" :class="[sizeClass, { has-sign: base64Img }]&quo…

产品经理研读:Agent的九种设计模式(图解+代码)

资料来源:火山引擎-开发者社区 引言 上周五我在一个社群里做了一次分享,题目是《从 YC 项目看 AI 趋势以及 AI agent 开发工具类产品该如何设计》,收到了大家不错的反馈,这篇文章和大家详细讲讲分享中提到的 Agent设计模式 1.Agent 的九种设计模式。 先来一张图镇楼,欢迎大…

获取字节火山DeepSeek系列 API完整教程及超多实用玩法!

资料来源:火山引擎-开发者社区原文首发在“Equity AI”公众号,内容经由“WaytoAGI社区整理汇总”,本篇包含了火山DeepSeek API使用的几种方式:飞书多维表格调用,Coze智能体调用,浏览器插件调用。快薅羊毛用起来吧!发现火山方舟大模型服务平台的模型服务计费文档悄咪咪的…

MCR101-ASEMI电源控制电路专用MCR101

MCR101-ASEMI电源控制电路专用MCR101编辑:LL MCR101-ASEMI电源控制电路专用MCR101 型号:MCR101 品牌:ASEMI 封装:TO-92 阻断电压:600V~800V 通态电流:1.0A 类型:单向可控硅 工作温度:-40℃~150℃ MCR101在工业自动化、智能家居和能源管理领域,"精准控制"始终…

IDEA中如何创建scala的对象

1、创建项目 打开Intellij IDEA,点击“Create New Project”。 选择“Java”作为Language,选择“Maven”作为Build System,选择JDK版本; 输入GroupId的名称,一般是com.xxx; 设置完成后点击“Create”。 2、配置Maven File -> Settings -> Build,Execution,Deploym…

fastjson-1.2.68-bypass

fastjson-1.2.68 绕过 在 1.2.47 的利用 mappings 缓存恶意类绕过 autoType 修复后,fastjson 又陆续爆出来了一些黑名单的绕过方式。直到 1.2.68 又有了新的思路去绕过 autoType 安全机制 我们先来看看 fastjson1.2.68 又引入了哪些安全机制 1.2.68 引入了一个新的安全机制 sa…

【日记】感觉沉着冷静是很难得的品质(1200 字)

正文今天不太忙。居然看了一半时间的书,而且居然从零看了一半多了。昨天晚上,一个偶然的原因,看了六层楼跟别人聊天的视频。其实上班之后已经蛮久都没有看他了,时间真的很稀缺。视频中提到了他写的书。他本身表达能力就很好,我想着书应该也不差,就下了一本电子版。刚开始…

Supergateway:MCP服务器的远程调试与集成工具

Supergateway 是一款专为 MCP(Model Context Protocol)服务器设计的远程调试与集成工具,通过 SSE(Server-Sent Events)或 WebSocket(WS)协议实现基于 stdio 的服务器与客户端的高效通信。以下是其核心功能及使用场景的详细解析:核心功能多协议支持支持 SSE 和 WebSocke…

怎么办?听说Windows远程桌面要撤销?解决办法还真有!

3月11日微软正式宣布,将在2025年5月27日关闭并从Microsoft Store中移除Windows远程桌面应用程序,用户将无法通过旧版远程桌面访问这些功能。微软公司此次决定下架Microsoft远程桌面应用,主要是为了推广功能更为强大的Windows App,这种23年上线的解决方案提供了更加统一的界…

电脑文件同步软件,想要备份电脑文方法有哪些?

备份电脑文件的方法有多种,可根据需求选择适合的方案。以下是常见的备份方式及工具推荐,涵盖不同场景:一、使用系统内置工具 Windows 文件历史记录 方法: 连接外部硬盘或网络驱动器。 搜索「文件历史记录」→ 选择驱动器 → 开启自动备份。 可设置备份频率(如每小时)。 二…