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

mybatis plus 更新的时候返回更新记录的条数

在 MyBatis-Plus 中,能否获取更新条数取决于你调用的是Mapper层还是Service。官方设计有明确区分:


✅ 正确做法:调用BaseMapper(返回int

BaseMapper的更新方法直接返回受影响的行数,与原生 MyBatis 一致。

// 1. 注入 Mapper @Autowired private DocumentMetadataMapper mapper; // 继承 BaseMapper<DocumentMetadata> // 2. 调用更新 int affectedRows = mapper.updateById(entity); // 或条件更新 int affectedRows = mapper.update(null, new LambdaUpdateWrapper<DocumentMetadata>() .set(DocumentMetadata::getKmStatus, 1) .eq(DocumentMetadata::getId, 100L)); if (affectedRows > 0) { log.info("成功更新 {} 条记录", affectedRows); }

⚠️ 易混淆点:IService返回boolean

如果你调用的是Service层(继承IService),默认返回boolean,不返回具体行数:

@Autowired private DocumentMetadataService service; // ❌ 返回 true/false,无法获取具体条数 boolean success = service.updateById(entity); // 底层实现:return baseMapper.updateById(entity) > 0;

📌结论:需要精确行数时,必须绕过 Service,直接调用Mapper


🔑 核心配置:MySQL 必须加useAffectedRows=true

无论原生 MyBatis 还是 MP,MySQL 驱动默认返回的是匹配行数(Matched Rows),而非实际修改行数。若新旧值相同,会返回1导致误判。

JDBC URL 必须添加

jdbc:mysql://127.0.0.1:3306/your_db?useAffectedRows=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
配置状态更新status=1status=1更新status=1status=2业务影响
useAffectedRows返回1返回1无法区分“数据未变”和“更新成功”
useAffectedRows=true返回0返回1✅ 精准反映实际变更

🛠 常见场景 & 避坑指南

场景现象解决方案
乐观锁更新返回0说明@Version版本冲突,需重试或抛异常
逻辑删除干扰updateById不生效检查是否被@TableLogic拦截,改用mapper.update(null, wrapper)绕过
批量更新要行数updateBatchById()返回boolean循环调用mapper.updateById()累加int,或写自定义<update>XML
PostgreSQL/Oracle返回值行为不同PG 默认返回affected rows;Oracle 需注意SQL%ROWCOUNT,通常无需额外参数

💡 最佳实践模板

public int updateKmStatusWithAudit(Long id, Integer newStatus) { int rows = mapper.update(null, new LambdaUpdateWrapper<DocumentMetadata>() .set(DocumentMetadata::getKmStatus, newStatus) .eq(DocumentMetadata::getId, id)); if (rows == 0) { throw new BusinessException("记录不存在或数据未发生变更"); } return rows; }

📌 总结

  1. 要行数 → 用BaseMapper.update*()(返回int
  2. 要布尔值 → 用IService.update*()(返回boolean
  3. MySQL 必加useAffectedRows=true,否则返回值无业务参考价值
  4. 乐观锁返回0是正常冲突信号,非 SQL 错误

如需结合你的具体表结构(如含@Version、逻辑删除、分库分表)优化更新策略,可提供 Mapper 代码,我为你输出适配方案。

http://www.jsqmd.com/news/584617/

相关文章:

  • hello-uniapp启动图与欢迎页设计:第一印象很重要
  • ThinkJS路由系统终极指南:构建RESTful API的10个最佳实践
  • 终极指南:Skateshop中的响应式设计与Tailwind CSS最佳实践
  • 【回眸】系统读书笔记(十)盘点调动资源
  • 如何通过依赖注入设计模式提升yaml-cpp代码可测试性:完整指南
  • Tacotron 2自定义数据集终极指南:多语言语音合成的完整解决方案
  • 7步实现Prowler合规报告自动化:企业级每周安全状态邮件配置指南
  • PromptSource与医疗NLP:构建符合HIPAA的医疗提示模板
  • 不止3DGS!2026三维重建十大风口,重新锚定空间智能
  • OpenClaw备份方案:千问3.5-9B自动加密重要文件并上传NAS
  • VerySimpleButton:嵌入式极简按钮状态检测库
  • 终极指南:seamless-immutable如何巧妙避免JavaScript堆栈溢出
  • 如何快速构建现代化协同应用API服务:Automerge与GraphQL集成完整指南
  • Redis中有事务吗?有何不同?
  • 如何用GPT-4数据蒸馏训练LLMLingua模型:提升20倍推理速度的终极指南
  • LlamaHub工具模块详解:让AI模型读写第三方服务的终极解决方案
  • Orchestrator配置文档自动生成终极指南:从源码注释到用户手册的完整教程
  • OpenClaw家庭相册管理:Phi-3-vision-128k自动分类照片生成回忆录
  • OpenClaw隐私保护方案:Qwen3-4B本地处理敏感数据实践
  • OpenClaw+百川2-13B-4bits量化模型:24小时不间断资料收集机器人
  • 终极指南:PDFMiner XML输出如何高效提取结构化数据
  • Express.js国际化(i18n)实现终极指南:快速构建多语言网站
  • 如何在UniApp中使用SQLite进行本地数据库操作:完整指南
  • Adafruit LSM9DS1 Arduino驱动库详解与工程实践
  • Tacotron 2终极错误排查指南:10个常见问题及快速修复方案
  • gin-jwt核心配置详解:从Authenticator到Authorizer的完整教程
  • 万字长文带你深入Redis底层数据结构
  • yaml-cpp线程安全终极指南:多线程环境下的安全性保证与最佳实践
  • OmX插件开发指南:从零开始创建你的第一个Hook
  • OpenClaw故障排查大全:Qwen3-14B镜像常见报错解决方案