myatisplus的saveOrUpdate的提交总是update问题
背景
很多朋友,想把新增和编辑做在一起。
没想到自己遇到坑了,
自己的saveOrUpdate的提交总是update。
控制台sql输出
UPDATE t_course_type SET course_type_name=?, create_time=?, create_user=?, update_time=?, update_user=?
报错
com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Prohibition of table update operation
官方文档
// TableId 注解存在更新记录,否插入一条记录 boolean saveOrUpdate(T entity); // 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法 boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);
分析
发现上面的sql没有where条件。
以为是新增操作,没有id,主键是自增的,就加了个判断
ObjectUtils.isNotEmpty(courseTypeId)。
发现是updateWrapper的eq方法 不能加condition参数。
错误方式
updateWrapper.eq(ObjectUtils.isNotEmpty(courseTypeId), CourseTypeEntity::getCourseTypeId, courseTypeId);
正确方式
去除第一个condition参数。保留2个参数即可。
updateWrapper.eq(CourseTypeEntity::getCourseTypeId, courseTypeId);
成功案例实现源码分享
LambdaUpdateWrapper<CourseTypeEntity> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(CourseTypeEntity::getCourseTypeId, courseTypeId);
CourseTypeEntity courseTypeEntity = new CourseTypeEntity();
if (courseTypeIdNotEmpty) {
courseTypeEntity.setCourseTypeId(courseTypeId)
.setUpdateTime(LocalDateTime.now())
.setUpdateUser(username)
.setCourseTypeName(courseTypeName)
.setCourseCount(courseCount);
} else {
courseTypeEntity.setCourseTypeName(courseTypeName)
.setCreateTime(LocalDateTime.now())
.setCreateUser(username)
.setUpdateTime(LocalDateTime.now())
.setUpdateUser(username);
}
boolean saveOrUpdate = this.saveOrUpdate(courseTypeEntity, updateWrapper);
注意
要去了解这个saveOrUpdate的源码的处理机制。
源码
default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {
return this.update(entity, updateWrapper) || this.saveOrUpdate(entity);
}
因为该方法默认是使用实体对象的id去匹配,
如果有就更新,
如果没有就插入。
对于主键自增的场景,
一般不会手动设置id,每一次的id都不相同,
所以如果不使用条件选择器,一定是插入。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot集成Activiti7工作流引擎的示例代码
本文主要介绍了SpringBoot集成Activiti7工作流引擎的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2024-11-11
java线程池对象ThreadPoolExecutor的深入讲解
在我们的开发中“池”的概念并不罕见,有数据库连接池、线程池、对象池、常量池等等。下面这篇文章主要给大家介绍了关于java线程池对象ThreadPoolExecutor的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧2018-09-09
SpringBoot数据库初始化datasource配置方式
这篇文章主要为大家介绍了SpringBoot数据库初始化datasource配置方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12
Java如何解决发送Post请求报Stream closed问题
这篇文章主要介绍了Java如何解决发送Post请求报Stream closed问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-06-06


最新评论