mybatis-plus SaveBatch插入报错Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate

mybatis-plus saveBatch插入报错

问题描述

在使用saveBatch进行插入数据时,报错:

Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '12' for key 'article.PRIMARY'

原因分析

  1. 首先检查报错原因:
    article的主键重复。于是检查 mybatis-plus 打印的日志:
    ==>  Preparing: INSERT INTO article ( id, title, content, cover_img, state, category_id, create_user, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ? )
    
    发现插入数据时插入了id,但由于id是主键,设置了自增策略。在数据写入数据库时会造成id的重复。
  2. 检查插入代码的业务逻辑:
    在代码中是先从数据库中取得了之前的数据再进行插入,因此数据已经自带了id属性,因此需要解决的问题就是在执行saveBatch插入前先将id值设置为空。
    List<Article> articleList = articlepage.getRecords();
    articleService.saveBatch(articleList);
    

解决方法

在执行saveBatch插入前先将id值设置为空

 	List<Article> articleList = articlepage.getRecords();
 	articleList.stream().forEach(article -> article.setId(null));
	articleService.saveBatch(articleList);

需要注意的点(持续更新)

  1. 进行插入前需要再检查实体类中是否添加了 @TableId注解:
    @TableId(value = "id", type = IdType.AUTO)
    标记主键自增,否则插入数据时会生成随机数
  2. 查看saveBath源码,在进行插入逻辑时是一条一条插入,效率比较低,批量插入可以考虑在xml写sql的方法
        public boolean saveBatch(Collection<T> entityList, int batchSize) {
            String sqlStatement = this.getSqlStatement(SqlMethod.INSERT_ONE);
            return this.executeBatch(entityList, batchSize, (sqlSession, entity) -> {
                sqlSession.insert(sqlStatement, entity);
            });
        }
    
  3. 在本项目中,需要执行的业务逻辑是从数据库中取出数据再进行插入。而在实际开发过程中,也需要考虑一下这样的逻辑是否可以改进,是否是必须的步骤。比如:如果数据库中存在的数据已存在就修改,没有就添加,则可以采用SaveOrUpdate()方法
  4. 有些同学可能遇到 即使已经添加了@TableId注解,但仍无法实现主键自增。很可能是在 Mybatis-plus 的配置类中没有进行配置
    public class MybatisPlusConfig {
    	 @Bean
        public GlobalConfig globalConfig() {
            GlobalConfig config = new GlobalConfig();
            config.setDbConfig(new GlobalConfig.DbConfig()
                    .setIdType(IdType.AUTO) // 设置全局主键生成策略为自增
            );
            return config;
        }
    //  其他内容省略
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着猪看大海

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值