20210602-MyBatisPlus篇(使用 saveOrUpdate() 的坑)

场景:插入数据库时如果某个字段的值是重复的,就不插入,反之插入数据库。

看了下mybatis-Plus中saveOrUpdate方法,原本在该场景中正常使用save方法是没有问题的,然而改成saveOrUpdate方法就开始报错了。

错误信息:com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: error: can not execute. because can not find column for id from entity!

这个错误原因是因为saveOrUpdate是根据主键执行操作的,但是mybatisPlus不能找到哪个是主键字段

解决思路:在实体类中主键字段上加一个@TableId,示例如下 

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Subject {

  @TableId(value = "subject_Code", type = IdType.AUTO)

  private long subjectCode;

  private String subjectNameCn;

  private String subjectNameEn;

  private String subjectHref;

  private long subjectParentCode;

  private long levelCode;

  private int isDelete;

  private long operateTimestamp;
}

不过这样还存在个问题就是saveOrUpdate是根据主键做操作的,主键自增的话是肯定不会有问题的,但是非自增主键怎么处理,能否让方法指定字段做操作?

// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);

解决思路:当saveOrUpdate不使用条件构造器时,会先做根据主键查询,如果查出来的结果为0,那么就执行插入操作,如果查出来的结果不为0,则执行更新操作。但是一般情况下,主键都不会重复!所有我就用条件构造器Wrapper!,示例如下

UpdateWrapper<Subject> subject_name_cn = new UpdateWrapper<Subject>()
   .eq("subject_Name_Cn", subjectNameCn);
subjectService.saveOrUpdate(subject,subject_name_cn );

这样改变后的结果就是会先执行修改,如果执行一条,则执行成功,如果执行结果为0,再执行根据主键查询,然后做插入操作!

 

posted @   firefox7557  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示