簡體   English   中英

getGeneratedKeys() 方法 - 它是如何工作的?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM