当前使用版本(必填,否则不予处理)
3.0.1 3.3.2
该问题是如何引起的?(确定最新版也有问题再提!!!)
使用foreach批量插入ms sql server(2008R2,2019),自增主键只能取回最后一条的id,其他为空。使用mysql可以正常取到自增主键。
重现步骤(如果有就写完整)
驱动 com.microsoft.sqlserver:mssql-jdbc:8.4.0.jre8 com.microsoft.sqlserver:mssql-jdbc:7.4.1.jre8
Table:
CREATE TABLE [dbo].[student](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](50) NOT NULL,
CONSTRAINT [PK_student] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
Entity:
@TableName(value = "student")
public class Student implements Serializable {
private static final long serialVersionUID = -9113130818289196330L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField(value = "name")
private String name;
}
Dao:
public interface StudentMapper extends BaseMapper<Student> {
int batchInsert(List<Student> list);
}
Mapper.xml
<insert id="batchInsert" keyProperty="id" parameterType="java.util.List" useGeneratedKeys="true">
insert into student (name) values
<foreach collection="list" item="item" separator="," index="index">
(#{item.name,jdbcType=VARCHAR})
</foreach>
</insert>
Test:
@Test
void batchInsert() {
Student student1=new Student();
student1.setName("Jack");
Student student2=new Student();
student2.setName("Tom");
List<Student>students=new ArrayList<>();
students.add(student1);
students.add(student2);
studentMapper.batchInsert(students);
students.forEach(
e->{
log.info("{}",e.getId());
}
);
}
报错信息
2020-08-03 22:42:35.691 INFO 1940 --- [ Test worker] c.e.testbatch.dao.StudentMapperTest : 10 2020-08-03 22:42:35.692 INFO 1940 --- [ Test worker] c.e.testbatch.dao.StudentMapperTest : null
数据库实际插入 id:9 id:10 成功
Comment From: miemieYaho
https://github.com/baomidou/mybatis-plus/issues/2179 这和mp没关系