mybatis 无法在批量新增时返回自增主键?

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 字段则不修改。

阅读 2.4k
2 个回答

单独批量新增时可以使用useGeneratedKey,但是批量使用on duplicate key update时,则不能混用useGeneratedKey。

解决方法:将sql修改为单条记录的插入或更新,在业务层循环遍历执行sql

image.png
image.png
image.png
你要是写xml的话 第一种是可以拿到自增id的
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题