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,再执行根据主键查询,然后做插入操作!

浙公网安备 33010602011771号