我从http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/preparedstatement.html获得了以下代码示例
我有三个问题:
String sql = "INSERT INTO AUTHORS (LAST, FIRST, HOME) VALUES " +
"(?, ?, ?, keyColumn)";
PreparedStatement addAuthor = con.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
addAuthor.setString(1, "Wordsworth");
addAuthor.setString(2, "William");
addAuthor.setString(3, "England");
int rows = addAuthor.executeUpdate();
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
ResultSetMetaData rsmd = rs.getMetaData();
int colCount = rsmd.getColumnCount();
do {
for (int i = 1; i <= colCount; i++) {
String key = rs.getString(i);
System.out.println("key " + i + "is " + key);
}
}
while (rs.next();)
}
else {
System.out.println("There are no generated keys.");
}发布于 2012-11-03 10:00:49
问题1.我认为链接上的查询中的keyColumn只是示例中的一个错误。该段中的第二个和第三个例子也包含严重的语法错误。我不想再多说了。这个文档已经从最近的Java版本中完全删除了。
问题2.考虑像INSERT INTO ... SELECT ... FROM ...或INSERT INTO ... VALUES (...), (...)这样的语句,它们可以生成多个插入的行。此外,一些数据库支持从其他DML (例如UPDATE或DELETE)返回值,这也会影响多行,这就是为什么需要考虑循环。在这个特定的例子中,这是不必要的,因为您可以确保只插入一行。
问题3.这个问题有点复杂:
有些数据库(或驱动程序)无法轻松决定实际生成的列是什么。例如,因为数据库没有IDENTITY列,而是使用触发器生成键。识别生成的键将涉及解析表上的所有触发器,以检查它是否将生成的值分配给(主键或其他)列,这并不容易完成,而且容易出错。有时会有多个生成的列(即计算字段等)。作为开发人员,您应该知道您可以或希望返回哪些字段。
由于很难(或效率低下)决定返回哪些字段,一些驱动程序(默认情况下)返回插入(或删除/更新)行的所有列。例如,PostgreSQL和火鸟驱动程序就是这样做的。另一方面,一些驱动程序只是返回最后生成的键,即使表不包含标识列(我相信MySQL会返回,但不能100%确定)。我似乎还记得,Oracle驱动程序只是返回ROWID,让用户使用该ROWID从数据库中检索实际值。
如果您具体知道要返回哪些列,则可以使用接受列序数指数或列名数组的替代方法指定该列。虽然并不是所有的司机都支持这一点。
https://stackoverflow.com/questions/13205031
复制相似问题