springboot项目中依赖 mybatis如下:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
使用下面方法实现批量新增
<insert id="multiSave1" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="iid">
insert into storage
(iid,sid,position_amount,barrel_amount,remark,create_time)
values
<foreach collection ="list" item="ele" index= "index" separator =",">
(#{ele.iid},#{ele.sid},#{ele.positionAmount},#{ele.barrelAmount},#{ele.remark},#{ele.createTime})
</foreach>
ON DUPLICATE KEY UPDATE
iid=values(iid),sid=values(sid),position_amount=values(position_amount),barrel_amount=values(barrel_amount),
remark=values(remark),create_time=values(create_time)
</insert>
新增后的对象数组如下:
[Storage{iid='12',sid='G',positionAmount='null',barrelAmount='null',remark='null',createTime='null'}, Storage{iid='null',sid='H',positionAmount='null',barrelAmount='null',remark='null',createTime='null'}]
可以看到两个对象构成的数组中,只有第一个元素成功获取到了自增数字,第二个元素没有获取到。
又使用了下面方法实现第二种批量新增:
<insert id="multiSave" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="iid">
<foreach collection ="list" item="ele" index= "index" separator =";">
insert into storage
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="ele.iid != null"> `iid`,</if>
<if test="ele.sid != null"> `sid`,</if>
<if test="ele.positionAmount != null"> `position_amount`,</if>
<if test="ele.barrelAmount != null"> `barrel_amount`,</if>
<if test="ele.remark != null"> `remark`,</if>
<if test="ele.createTime != null"> `create_time`</if>
</trim>
values
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="ele.iid != null"> #{ele.iid},</if>
<if test="ele.sid != null"> #{ele.sid},</if>
<if test="ele.positionAmount != null"> #{ele.positionAmount},</if>
<if test="ele.barrelAmount != null"> #{ele.barrelAmount},</if>
<if test="ele.remark != null"> #{ele.remark},</if>
<if test="ele.createTime != null"> #{ele.createTime}</if>
</trim>
ON DUPLICATE KEY UPDATE
<trim suffixOverrides=",">
<if test="ele.iid != null"> `iid` = #{ele.iid},</if>
<if test="ele.sid != null"> `sid` = #{ele.sid},</if>
<if test="ele.positionAmount != null"> `position_amount` = #{ele.positionAmount},</if>
<if test="ele.barrelAmount != null"> `barrel_amount` = #{ele.barrelAmount},</if>
<if test="ele.remark != null"> `remark` = #{ele.remark},</if>
<if test="ele.createTime != null"> `create_time` = #{ele.createTime}</if>
</trim>
</foreach>
</insert>
得到的对象数组是:
[Storage{iid='14',sid='G',positionAmount='null',barrelAmount='null',remark='null',createTime='null'}, Storage{iid='null',sid='H',positionAmount='null',barrelAmount='null',remark='null',createTime='null'}]
同样没有正确获取到第二个元素的自增数字。网上搜索后说是这样解决:
1.mybatis版本升级至3.3.1及以上;
2.对应java类的方法中,对应参数不得使用@Param;
3.对应xml中使用【useGeneratedKeys="true" keyProperty="id"】。
但是我到 https://mvnrepository.com/art... 中搜索 org.mybatis.spring.boot 最新版本就是 2.2.2 了。
我要如何解决这个问题?
要求实现:对于主键有则修改,无则新增,并且是批量进行的,最好是 selective - 选择性新增(修改)null 字段则不修改。
单独批量新增时可以使用useGeneratedKey,但是批量使用on duplicate key update时,则不能混用useGeneratedKey。
解决方法:将sql修改为单条记录的插入或更新,在业务层循环遍历执行sql