![](/img/trans.png)
[英]Does JDBC getGeneratedKeys() method always same order of inserted element
[英]getGeneratedKeys() method - How does it work?
我有一個方法,可以將用戶保存到我的數據庫中:
public void saveToDB(Connection conn) throws SQLException {
if(this.id == 0) {
String sql = "INSERT INTO Users(username, email, password) VALUES (?, ?, ?)";
String generatedColumns[] = { "ID" };
PreparedStatement prepStat = conn.prepareStatement(sql, generatedColumns);
prepStat.setString(1, this.username);
prepStat.setString(2, this.email);
prepStat.setString(3, this.password);
prepStat.executeUpdate();
ResultSet rs = prepStat.getGeneratedKeys(); //those 3 lines
if (rs.next()) {
this.id = rs.getInt(1);
}
}
}
所以,這就是我的理解。
conn.prepareStatement() 返回了 ID 列(它是空的,對嗎?直到 prepStat.executeUpdate())。
ResultSet rs = prepStat.getGeneratedKeys() - 老實說,我沒有完全理解。 它返回一個 ResultSet object,其中包含通過執行此語句 object 生成的自動生成的鍵。那么在這種情況下它返回什么? ID欄? 在 if() 中,我們檢查是否有任何非空的下一個 ID,並將數據庫中的 ID 值分配給我們的 id 變量?
當您調用prepareStatement()
時,它還沒有從數據庫返回實際的行。 含糊地說,它設置了一個“查詢模板”以將其發送到數據庫,因此下次您執行相同的查詢(使用其他值)時,數據庫將不必再次解析查詢。 此外,更重要的是,它是一種防止 sql 注入的方法。
無論如何,在最后三行中,您通過最初位於第一行之前的 cursor 訪問ResultSet
數據。 rs.next()
將 cursor 移動到第一行,如果它存在, if()
語句應返回true
,讓您檢索插入行的id
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.