2011-04-01 94 views
28

這樣做的這個問題的答案似乎很難在互聯網上找到。基本上我使用PreparedStatement將值插入MySQL數據庫。我使用PreparedStatement來轉義數據以防止SQL注入攻擊。問題是,現在有辦法減少這些鍵。Java PreparedStatement檢索最後插入的ID

String query="Insert INTO Table_A(name, age) (?, ?)"; 
//String query="Insert INTO Table_A(name, age) ('abc','123')";//Doesn't escape 
PreparedStatement prest; 
prest = con.prepareStatement(query); 
prest.setString(1,"abc"); 
prest.setInt(2,123); 
prest.executeUpdate(); 
//prest.executeUpdate(query, PreparedStatement.RETURN_GENERATED_KEYS); Throws an error 
//prest.executeQuery(); Throws an error 

那麼我怎樣才能轉義輸入和在Java中使用PreparedStatements?

+1

將'RETURN_GENERATED_KEYS'傳遞給'prepareStatement()'調用並使用'executeUpdate()'來執行插入操作。如果這不起作用,請提供例外。 – ZeissS 2011-04-01 12:14:39

+0

@BalusC引用了一個正確的方法。 – 2011-04-01 12:17:29

+0

@BalusC,這正是我所期待的。壞它不是一個答案! – 2011-04-01 12:53:16

回答

1

如果您不能使用RETURN_GENERATED_KEYS,使用其他的語句(查詢這段時間)做

SELECT last_insert_id() 

確保您一定有在該表的自動增量主鍵列。

+0

這是否也適用於有多個插入到同一個表中的情況,即您試圖獲取其中一個插入的ID? – user917099 2016-05-10 22:37:40

52

通過Statement.RETURN_GENERATED_KEYSprepareStatement()以及您的查詢。然後使用PreparedStatement的getGeneratedKeys()獲取包含插入的auto_incremented_id的ResultSet。

String query="Insert INTO Table_A(name, age) (?, ?)"; 
       //String query="Insert INTO Table_A(name, age) ('abc','123')";//Doesn't escape 
       PreparedStatement prest; 
       prest = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
       prest.setString(1,"abc"); 
       prest.setInt(2,123); 
       prest.executeUpdate(); 
       //prest.executeUpdate(query, PreparedStatement.RETURN_GENERATED_KEYS); Throws an error 
       //prest.executeQuery(); Throws an error 
       ResultSet rs = prest.getGeneratedKeys(); 
       if(rs.next()) 
       { 
        int last_inserted_id = rs.getInt(1); 
       }