背景
有下面的表:
crated_at是自动由mysql填充的,但是使用mybatisplus的BatchSave的时候,发现
Column 'created_at' cannot be null
CREATE TABLE `table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`status` VARCHAR(100) NOT NULL AUTO_INCREMENT COMMENT '状态',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
mybatisplus生成的sql大概是把created_at 也作为sql字段然后拼入
insert into table (status , created_at,updated_at) values (1 , null ,null)
也就是没有过滤掉空值
排查原因
一开始找这个文档相关文档
发现加了下面注解
@TableField(insertStrategy = FieldStrategy.IGNORED)
@Data
@TableName("table")
public class TableDO {
/**
* 自增id
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
* 状态 , WRITE_TO_DB RESUME_FROM_DB
*/
private String status;
/**
* 延迟发送时间
*/
private Date delayAt;
/**
* 创建时间
*/
@TableField(insertStrategy = FieldStrategy.IGNORED) // 没有生效
private Date createdAt;
/**
* 更新时间
*/
private Date updatedAt;
}
发现没有生效 , 然后一直改@TableName
, 连这个注解也没有生效,所以发现是整个mybatisplus的注解都没有生效
排查
根据上面现象,再继续排查,发现是idea自动生成的xml优先级更高,有resultMap ,把整个xml清空之后,整个insert正常了,最后sql变成了
insert into table (status ) values (1 )