mybatis insertOrUpdate keyProperty 不起作用

2 阅读1分钟

场景

在使用mybatis的过程中,有可能需要 insert into values on duplicate update的语法来进行操作,如果数据存在则更新,不存在则插入。

例子

  • mybatis 代码如下
<insert id="insertOrUpdateBatch" keyProperty="id" useGeneratedKeys="true">
        insert into ap_user_info( activity_id, user_id, user_reward_info, create_time, update_time)
        values
        <foreach collection="entities" item="entity" separator=",">
            (#{entity.activityId}, #{entity.userId}, #{entity.userRewardInfo}, #{entity.createTime},
            #{entity.updateTime})
        </foreach>
        on duplicate key update
        activity_id = values(activity_id),
        user_id = values(user_id),
        user_reward_info = values(user_reward_info),
        create_time = values(create_time),
        update_time = values(update_time)
    </insert>
  • keyProperty 来指定一个唯一键(也可以是主键)用来给sql引擎判定是否插入还是更新,上述代码中指定为id,id为主键且自动生成

问题

  • 不管执行sql时传入的数据是否id已经存在,都会执行插入操作

知识点

  • keyProperty 指定的列必须唯一不可以是自增生成的,否则 on duplicate key update不起作用
  • useGeneratedKeys 属性用来插入后给传入的对象赋自动生成的主键id值