我正在观看视频教程,我对此代码感到困惑:
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.getGeneratedKeys()
方法,因为它在执行Statement对象时返回自动生成的键,为什么需要调用getInt()
方法?
此外,默认情况下,光标指向插入的行之前,为什么在next()
之前调用get.GeneratedKeys()
方法?不应该首先调用next()
方法,以便在获得GeneratedKey
之前光标将转到第一个结果行?
答案 0 :(得分:2)
两件事。某些数据库可以每行返回多个生成的密钥,它们不必是整数,它们可以是GUID字符串或其他内容。因此,您需要在上面的代码中调用getInt(1)
。其次,你是不正确的,JDBC返回的ResultSet在第一行之前定位,因此需要调用next()。如果ResultSet没有行,则调用next()会返回false
,表示没有结果。