我目前正在观看视频教程,我对这段代码感到非常困惑:
public static boolean insert(Member mbr) throws Exception {
String SQL = "INSERT INTO test (first_name, last_name) " +
"VALUES (?, ?)";
ResultSet keys = null;
try (
Connection con = DBUtil.getConnection(DBType.MYSQL);
PreparedStatement stmt = con.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);
) {
stmt.setString(1, mbr.getFname());
stmt.setString(2, mbr.getLname());
int affected = stmt.executeUpdate();
if (affected == 1) {
keys = stmt.getGeneratedKeys();
keys.next();
int newKey = keys.getInt(1);
mbr.setMemberid(newKey);
} else {
System.err.println("No rows affected");
return false;
}
} finally {
if (keys != null) keys.close();
}
return true;
}
关于stmt.getGenerateKeys()
方法,既然它返回的是执行Statement对象时自动生成的key,为什么还需要调用getInt()
方法?
此外,默认情况下,光标指向插入行之前,那么为什么要在 get.GenerateKeys()
之前调用 next()
方法呢?是否应该先调用 next()
方法,以便在获取 GenerateKey
之前光标会转到第一个结果行?
最佳答案
有两件事。某些数据库可以每行返回多个生成的键,并且它们不必是整数,它们可以是 GUID 字符串或其他内容。因此,您需要在上面的代码中调用getInt(1)
。其次,你错了,JDBC返回的ResultSet位于第一行之前,因此需要调用next()。如果 ResultSet 没有行,则调用 next() 返回 false
表示没有结果。
关于java - Statement.getGenerateKeys() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19873190/