项目场景:
批量新增一批数据,返回这批数据的主键ID用于关联其他数据,数据库:MySql
问题描述
写好的语句只能返回最后一条插入数据的ID,其他ID为空,SQL没问题,参数没问题
<insert id="batchInsert" parameterType="java.util.List" keyProperty="id" useGeneratedKeys="true">
<foreach collection="list" item="item" index="index" separator=";">
INSERT INTO table (column1, column2, column3, ...)
VALUES
(
#{item.column1,jdbcType=VARCHAR},
#{item.column2,jdbcType=VARCHAR},
#{item.column3,jdbcType=VARCHAR},
...
)
</foreach>
</insert>
原因分析:
看了很多文章,有说Mybatis版本问题,有说数据库支持问题的,实际上我的Mybatis版本已经支持了批量新增返回ID,数据库是Mysql也没有问题。
问题出在哪里呢?其实单纯就是SQL写法问题。
批量新增还有一种写法
<insert id="batchInsert" parameterType="java.util.List" keyProperty="id" useGeneratedKeys="true">
INSERT INTO table (column1, column2, column3, ...)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.column1,jdbcType=VARCHAR},
#{item.column2,jdbcType=VARCHAR},
#{item.column3,jdbcType=VARCHAR},
...
)
</foreach>
</insert>
两种写法的区别可以参考文章:Java书签 #解锁MyBatis的4种批量插入方式及ID返回姿势
使用下面的方法可以正确返回ID,上面的写法不行,就这么简单。
大致可以理解为上面的写法并非真正的批量新增,而是拆解成多个单条新增语句,这种情况只能返回最后一次新增的ID