JDBC Connection
类的prepareStatement(String sql, int autoGeneratedKeys)
和prepareStatement(String sql, String[] columnNames
)方法之间有什么区别?
两者的Javadoc表示如果SQL语句是PreparedStatement
语句,则返回的INSERT
对象能够返回自动生成的键。对于第一个API,需要为Statement.RETURN_GENERATED_KEYS
参数传递autoGeneratedKeys
。对于第二个API,生成的列的名称将作为字符串数组传递。
使用其中一个的原因是什么?
我注意到Spring的SimpleJdbcInsert
类更喜欢指定列名的变体:AbstractJdbcInsert.prepareStatementForGeneratedKeys
为什么?
答案 0 :(得分:6)
原因是方便性,灵活性,性能和兼容性。例如,某些数据库无法知道哪些列是自动生成的,因此默认情况下,在使用Statement.RETURN_GENERATED_KEYS
时,其驱动程序会返回所有列。
这会对性能产生影响,因为:
例如,PostgreSQL的驱动程序将附加RETURNING *
(所以它只需要担心点1),而Firebird驱动程序(我维护)也必须查询元数据。
默认情况下,某些数据库驱动程序会返回一个不直接有用的列(例如Oracle - 用于? - 返回ROWID
,这意味着您必须自己查询实际字段),而某些数据库仅返回主键,虽然可能还有其他生成的字段,我相信一些数据库驱动程序返回最后生成的键,即使该表没有使用标识字段(!)。
方法prepareStatement(String sql, String[] columnNames)
和prepareStatement(String sql, int[] columnIndexes)
提供更多控制(如果支持),关于返回的内容。如果您确切地知道您需要或想要哪些字段,您可以指定它们并准确获取这些字段,而不必担心RETURN_GENERATED_KEYS
带来的行为差异。
取决于实现,采用String[] columnNames
的人可能是最有效的,因为名称可以简单地逐字放置,而int[] columnIndexes
可能仍然需要元数据查询来获取实际名称。 / p>