温馨提示:这篇文章已超过460天没有更新,请注意相关的内容是否还可用!
摘要:,,本文介绍了MybatisPlus中的saveOrUpdate方法,该方法在插入或更新数据时非常实用。使用时需谨慎,以避免潜在问题。本文将详细解释saveOrUpdate的工作原理,并探讨其在遇到重复键更新时的处理方式。本文还将介绍在MySQL中使用ON DUPLICATE KEY UPDATE进行保存或更新操作的相关内容,以及解决使用MybatisPlus时可能遇到的问题的方法。
今天我想要实现在插入数据库时,如果某个主要字段的值重复,则不插入,否则则插入。
我查看了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; // 其他字段... }
不过,saveOrUpdate方法默认是根据主键进行操作的,但我这里的主键是自动递增的,所以接下来我需要想办法让它根据指定的字段进行操作,我尝试使用UpdateWrapper和QueryWrapper来实现这个功能,我发现无论使用哪种方式,最终都是根据主键进行查询和插入操作,这让我有些困惑,于是我开始深入研究源码,发现默认参数是Wrapper类型,然后根据条件构造器更新或插入,这让我意识到应该有一个类型判断来区分UpdateWrapper和QueryWrapper的使用,如果使用的是QueryWrapper,则应该用于查询操作;如果是UpdateWrapper,则用于更新操作,这样就不会只根据ID进行死查。
关于saveOrUpdate方法是否会映射id的问题,我们知道mybatis在插入时会映射id,对于saveOrUpdate方法,如果在插入后需要使用新的id,我们可以在插入后获取实体的id属性。
@Test void saveOrUpdate(){ UserText userText = new UserText(); // 设置其他属性... boolean b = userTextService.saveOrUpdate(userText); System.out.println(userText.getUserId()); // 打印插入后的id值 }
在这个例子中,saveOrUpdate方法会先通过id查询是否存在记录,如果不存在则进行插入操作并返回新的id,因此我们可以直接获取插入后的实体的id属性。
还没有评论,来说两句吧...