Spring利用GeneratedKeyHolder,提供了一个可以返回新增记录对应主键值的方法:
GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
int res = JdbcTemplate.update(sql, new BeanPropertySqlParameterSource(bean), keyHolder);
然后keyHolder.getKey().longValue()就可以得到主键了~
但由于ON DUPLICATE KEY UPDATE在不同的情况下,执行语句的影响行数不同,keyHolder里面的list大小可能不是1,上面的getKey方法报错。
INSERT ··· ON DUPLICATE KEY UPDATE语法的规则:如果你插入的记录导致一个UNIQUE索引或者primary key(主键)出现重复,那么就会认为该条记录存在,则执行update语句而不是insert语句,反之,则执行insert语句而不是更新语句。
唯一索引重复,插入的数据不同
此时,
keyHolder的大小为2里面存着,当前冲突的主键,和冲突的主键+1
两个值
此时,
(Long) keyHolder.getKeyList().get(0).get("GENERATED_KEY")可以获取到本次更新操作的行的主键
唯一索引不重复
keyHolder的大小为1,情况和普通的insert相同唯一索引重复,但是插入数据完全相同
keyHolder的大小为0,无法通过这种方式获取到数据的主键
参考资料:
版权声明:本文为qq_32587863原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。