mybatis批量插入问题记录

5 篇文章 0 订阅

mybatis批量插入问题记录

需求:自增主键批量插入,存在则插入,不存在则更新。插入或更新后返回对应的主键id

-- 创建表
CREATE TABLE `eth_test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `name` varchar(127) NOT NULL DEFAULT '' COMMENT 'name',
  `age` int(11) NOT NULL,
  `version` int(11) NOT NULL DEFAULT '0' COMMENT 'version',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '新增的时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='test table';

-- 批量插入sql
<insert id="batchInsert" keyColumn="id" keyProperty="id" useGeneratedKeys="true">
  insert into eth_test(name, age, `version`) VALUES
  <foreach collection="list" item="item" separator=",">
      (#{item.name}, #{item.age}, #{item.version})
  </foreach>
  ON DUPLICATE KEY UPDATE `version`=values(`version`), age = values(age)
</insert>

// mapper方法
int batchInsert(@Param("list") List<EthTest> list);

结论:此方法sql如果加ON DUPLICATE KEY UPDATE,批量插入时只会返回第一个插入或更新的id,其余插入不返回id值,如果不加ON DUPLICATE KEY UPDATE则插入重复name会报错,但如果不重复,批量插入是可以返回所有的id的

暂时解决方案,单条插入,此方法无论更新或插入都会返回id

<insert id="insert" keyColumn="id" keyProperty="id" useGeneratedKeys="true" parameterType="EthTest">
  insert into eth_test(name, age, version)
  values (#{name}, #{age}, #{version})
  on duplicate key update age = #{age}, version = #{version}
</insert>

-- mapper方法
int insert(EthTest ethTest);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值