阅读 8834

MybatisPlus 使用 saveOrUpdate 详解,及问题解决方法!

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!


就是这个mybatisPlus不能找到哪个是主键字段,因为这个saveOrUpdate默认是根据主键执行操作的!


所有需要在原本的实体类的主键头上,打个@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;



}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

不过还有个问题,就是这个是根据主键做操作的,但是我主键本来就是自动递增肯定不会有问题的,接下来就是想个办法,让他根据指定字段做操作,好像是有提供了一个口子。


// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法

boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper);

1

2

我再去看一下怎么操作的!


研究尝试了半天,终于搞出来了,可能是很少有人会像我这样做吧!所以我自己尝试了下。


当saveOrUpdate不使用条件构造器时,会先做根据主键查询,如果查出来的结果为0,那么就执行插入操作,如果查出来的结果不为0,则执行更新操作。


但是一般情况下,主键都不会重复啊!所有我就用条件构造器Wrapper!


UpdateWrapper<Subject> subject_name_cn = new UpdateWrapper<Subject>()

.eq("subject_Name_Cn", subjectNameCn);

subjectService.saveOrUpdate(subject,subject_name_cn );

1

2

3

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


其实有点多此一举的感觉,因为既然都已经更新不到结果了,那么肯定是没有这个字段咯!


不过转念一想,你是指定字段没有,又不是主键没有!


但是主键自增那肯定没有啊!


所有我又想到一个骚操作,我不传UpdateWrapper而传QueryWrapper会怎么样呢!


会不会加在查询条件种呢!我丢进去没有报错,有点小激动,不知道结果如何!


QueryWrapper<Subject> subject_name_cn1 = new QueryWrapper<Subject>()

                    .eq("subject_Name_Cn", subjectNameCn);

subjectService.saveOrUpdate(subject,subject_name_cn1);

1

2

3

好吧!上来全给我Update了!丝毫不留情面!我把数据删了再试试!


好吧!然并卵!幻想破灭!跟传UpdateWrapper没有区别!~告辞!


看了一下源码,默认参数是Wrapper类型,然后根据条件构造器更新,


成功则返回,


不成功则走无条件构造器的方法。


default boolean saveOrUpdate(T entity, Wrapper<T> updateWrapper) {

    return this.update(entity, updateWrapper) || this.saveOrUpdate(entity);

}

1

2

3

我感觉应该加个类型判断!


 if(updateWrapper instanceof QueryWrapper){

  去拼接查询语句!

 }

  if(updateWrapper instanceof UpdateWrapper){

  去拼接更新语句!

 }

1

2

3

4

5

6

这样就不会只根据ID来死查了!

————————————————

版权声明:本文为CSDN博主「Java充电桩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_45369440/article/details/116044771


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐