用GeneratedKeyHolder获取ON DUPLICATE KEY UPDATE语句返回的主键

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,无法通过这种方式获取到数据的主键

参考资料:

https://www.cnblogs.com/zjfjava/p/10296867.html

https://blog.csdn.net/qq_31156277/article/details/86510335


版权声明:本文为qq_32587863原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。