web-dev-qa-db-ja.com

Java PreparedStatementは最後に挿入されたIDを取得します

この方法で行われたこの質問に対するこの答えは、インターネット上で見つけるのが非常に難しいようです。基本的に、PreparedStatementを使用してMySQLデータベースに値を挿入しています。 PreparedStatementを使用してデータをエスケープし、SQLインジェクション攻撃を防ぎます。問題は、これらのキーを取得する方法があることです。

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を使用するにはどうすればよいですか?

33
Devin Dixon

クエリとともにprepareStatement()に_Statement.RETURN_GENERATED_KEYS_を渡します。次に、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);
                }
_
60
Asad

Java.sql.ResultSet Java.sql.Statement.getGeneratedKeys() を使用して、生成されたキーを取得します。

4
Dave G

RETURN_GENERATED_KEYSを使用できない場合は、別のステートメント(今回はクエリ)を使用して実行してください

SELECT last_insert_id()

そのテーブルに自動インクリメントの主キー列があることを確認してください。

1
Jonathan