使用 JDBC 3 驱动程序,可以将记录插入表中并立即获取列的自动生成值。 ActiveJDBC 中使用了该技术。
这是表定义:
CREATE TABLE users (id int(11) NOT NULL auto_increment PRIMARY KEY, first_name VARCHAR(56), last_name VARCHAR(56), email VARCHAR(56)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这在H2和PostgreSQL上运行良好,并且返回值的类型是Integer。 然而,在MySQL中,类型是Long,而我认为它应该是Integer。 当在 Mysql 中查询同一行时,“id”返回为 Integer。
有人知道为什么“getGenerateKeys()”在 Mysql 中返回 java.lang.Long 以及如何修复它吗?
最佳答案
原因:
MySQL 用于跟踪该值的生成器是 BIGINT
,因此驱动程序将其描述为 BIGINT,这相当于 Long。请参阅 LAST_INSERT_ID
在 MySQL 手册中。
像 PostgreSQL 这样的驱动程序返回表的实际列(实际上 PostgreSQL 在使用 getGeneratedKeys()
时返回所有列;我假设 MySQL 只是调用 LAST_INSERT_ID()
。
如何解决:
正如 Jim Garrison 在评论中指出的那样:始终使用 getInt()
,或getLong()
,而不是getObject()
.
关于Mysql从PreparedStatement.getGenerateKeys()返回Long;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12806020/