63

準備されたステートメントで Java クエリを使用するときに、DB クエリから自動生成されたキーを取得する方法はありますか。

たとえば、AutoGeneratedKeys が次のように機能することはわかっています。

stmt = conn.createStatement();

stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
    ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
    auto_id = rs.getInt(1);
} 

でも。準備済みステートメントで挿入を実行したい場合はどうすればよいですか。

String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql);

//this is an error
stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS);
if(returnLastInsertId) {
    //this is an error since the above is an error
    ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
    auto_id = rs.getInt(1);
} 

私が知らないこれを行う方法はありますか。PreparedStatements が自動生成 ID を返すことができないことは、javadoc からのようです。

4

5 に答える 5

99

はい。ここを参照してください。セクション7.1.9。コードを次のように変更します。

String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);


stmt.executeUpdate();
if(returnLastInsertId) {
   ResultSet rs = stmt.getGeneratedKeys();
    rs.next();
   auto_id = rs.getInt(1);
}
于 2009-09-03T22:12:34.877 に答える
4

いくつかの方法があり、異なる jdbc ドライバーは物事を少し異なる方法で処理するか、場合によってはまったく処理しないようです (自動生成された主キーのみを提供し、他の列は提供しないものもあります) が、基本的な形式は次のとおりです。

stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 

または、次のフォームを使用します。

String autogenColumns[] = {"column1","column2"};
stmt = conn.prepareStatement(sql, autogenColumns)
于 2009-09-03T22:23:34.790 に答える
2

はい、方法はあります。これがJavaドキュメントに隠れているのを見つけました。

彼らの方法は、次のように AutoGeneratedKeys id を渡すことです

String sql = "INSERT INTO table (column1, column2) values(?, ?)";
stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
于 2009-09-03T22:16:05.227 に答える