mybatis plus批量插入数据时SQLIntegrityConstraintViolationException异常问题

mybatis plus的IService(com.baomidou.mybatisplus.extension.service.IService)接口中提供了saveBatch()方法,但是这个插入方法使用的是多条insert语句的方式来插入数据,效率不够高。

所以mybatis plus又提供了另外一个方法来实现批量插入insertBatchSomeColumn(),但是这个批量存储的方法在某些场景下可能报错。

如果我们在设计数据库表的时候设置了not null default,如下所示gender列为not null

create table user(
    id bigint(20) not null comment '主键',
    name varchar(50) default '' comment '姓名',
    gender char(1) not null default 'O' comment '性别';
)

再使用insertBatchSomeColumn()方法进行插入,就会报错。

报错示例如下:

### SQL: INSERT INTO user (id,name,gender) VALUES    (?,?,?)  ,  (?,?,?)
### Cause: java.sql.SQLIntegrityConstraintViolationException: (conn=20976313) Column 'QUIT_TIME' cannot be null
; (conn=20976313) Column 'gender' cannot be null; nested exception is java.sql.SQLIntegrityConstraintViolationException: (conn=20976313) Column 'gender' cannot be null
	at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:87)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)

这个时候有两种选择

1、将这个列设置成可以为空,去掉not null

create table user(
    id bigint(20) not null comment '主键',
    name varchar(50) default '' comment '姓名',
    gender char(1) default 'F' comment '性别';
)

2、在xml中写SQL语句来进行批量插入了,为空的gender列直接不写入进去就可以了

<insert id="saveList">
        insert into
        user (
        id,
        name
        )values
        <foreach collection="list" item="item" index="index" separator="," >
            (
            #{item.id},
            #{item.name}
            )
        </foreach>
</insert>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值