[解決済み】JDBCで挿入IDを取得する方法は?
2022-04-28 16:24:37
質問
をしたいのですが。
INSERT
JavaでJDBCを使用してデータベース(私の場合、Microsoft SQL Serverです)のレコードを作成します。同時に、私は挿入IDを取得したいと思います。どのように私はJDBC APIを使用してこれを達成することができますか?
どのように解決するのですか?
自動生成されたキーであれば
Statement#getGeneratedKeys()
を使用します。これを呼び出すには 同じ
Statement
に使用されているものと同様に
INSERT
. 最初に
必要
を使用してステートメントを作成します。
Statement.RETURN_GENERATED_KEYS
を使用して、JDBC ドライバにキーを返すように通知します。
以下は基本的な例です。
public void create(User user) throws SQLException {
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement(SQL_INSERT,
Statement.RETURN_GENERATED_KEYS);
) {
statement.setString(1, user.getName());
statement.setString(2, user.getPassword());
statement.setString(3, user.getEmail());
// ...
int affectedRows = statement.executeUpdate();
if (affectedRows == 0) {
throw new SQLException("Creating user failed, no rows affected.");
}
try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
if (generatedKeys.next()) {
user.setId(generatedKeys.getLong(1));
}
else {
throw new SQLException("Creating user failed, no ID obtained.");
}
}
}
}
なお、動作するかどうかは、JDBCドライバに依存します。現在、最後のバージョンのほとんどは動作しますが、私の考えが正しければ、Oracle JDBC ドライバはこれに関してまだ多少面倒なところがあります。MySQLとDB2はすでに古くからサポートしています。PostgreSQLは少し前にサポートし始めました。MSSQLは使ったことがないので、コメントできません。
Oracleの場合は
CallableStatement
を使用しています。
RETURNING
節または
SELECT CURRVAL(sequencename)
(またはそうするためのDB固有の構文)の直後で
INSERT
を同じトランザクションで実行し、最後に生成されたキーを取得します。以下も参照してください。
本解
.
関連
-
[解決済み] Javaでdoubleをfloatに変換する
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] Javaでネストされたループから抜け出すには?
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み] SQL Serverでテーブルからカラム名を取得するにはどうすればよいですか?
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] tempとは何ですか、またjavaにおけるtempの用途は何ですか?
-
[解決済み] Java Genericメソッドをstaticにするには?
-
[解決済み] java.util.concurrent.ExecutionException 例外をどのように処理しますか?
-
[解決済み] javax.mail.MessagingException: SMTPホストに接続できませんでしたか?
-
[解決済み] raw 型のメンバへのアンチェックの呼び出し
-
[解決済み] Java の文字列インデックスが範囲外です。0 [閉店]
-
[解決済み] どのように配列の10未満の値(x * 2)を倍増するコードを取得するには?(Java)
-
[解決済み] アクティビティに割り当てられない
-
[解決済み] Eclipseでクラスとそれに対応するファイルの名前を変更する方法は?
-
[解決済み] Javaでdoubleをfloatに変換する