问题背景
项目中多处使用原生JDBC进行数据插入,进行数据insert时会预先生成一个id主键再进行插入,并通过Statement.RETURN_GENERATED_KEYS的方式返回主键id,都能获取正确结果。偶然一次使用该方式对返回值进行处理时,获取到的返回值是受影响的rows,故进行排查。
相关代码
PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

问题原因
经过排查,发现能够成功获取主键id的代码中,对应的表结构主键是自增的,设有AUTO_INCREMENT属性,而不能返回主键id的代码,相应表结构并没有自增属性。
源码中说明

总结
在使用Statement.RETURN_GENERATED_KEYS时,需要特别注意,被操作的数据表主键id必须设置AUTO_INCREMENT属性。数据库自增的id和手动插入的id均可正常返回。
本文记录了在使用Statement.RETURN_GENERATED_KEYS获取MySQL主键id时遇到的问题。当表的主键没有自增属性时,无法正确获取主键。通过源码分析,确认只有设置为自增的主键才能在插入后返回正确的id。

9497

被折叠的 条评论
为什么被折叠?



