Saya ingin INSERT
merekam dalam database (yang merupakan Microsoft SQL Server dalam kasus saya) menggunakan JDBC di Jawa. Pada saat yang sama, saya ingin mendapatkan ID insert. Bagaimana saya bisa mencapai ini menggunakan JDBC API?
385
String sql = "INSERT INTO 'yash'.'mytable' ('name') VALUES (?)"; int primkey = 0 ; PreparedStatement pstmt = con.prepareStatement(sql, new String[] { "id" }/*Statement.RETURN_GENERATED_KEYS*/); pstmt.setString(1, name); if (pstmt.executeUpdate() > 0) { java.sql.ResultSet generatedKeys = pstmt.
getGeneratedKeys ();if (generatedKeys.next()) primkey = generatedKeys.getInt(1); }
Jawaban:
Jika ini adalah kunci yang dibuat secara otomatis, maka Anda dapat menggunakannya
Statement#getGeneratedKeys()
untuk ini. Anda harus menyebutnya samaStatement
dengan yang digunakan untukINSERT
. Anda harus terlebih dahulu membuat pernyataan menggunakanStatement.RETURN_GENERATED_KEYS
untuk memberi tahu driver JDBC untuk mengembalikan kunci.Inilah contoh dasar:
Perhatikan bahwa Anda bergantung pada driver JDBC, apakah itu berfungsi. Saat ini, sebagian besar versi terakhir akan berfungsi, tetapi jika saya benar, driver Oracle JDBC masih agak bermasalah dengan ini. MySQL dan DB2 sudah mendukungnya sejak lama. PostgreSQL mulai mendukungnya belum lama ini. Saya tidak dapat berkomentar tentang MSSQL karena saya belum pernah menggunakannya.
Untuk Oracle, Anda dapat memanggil
CallableStatement
denganRETURNING
klausa atauSELECT CURRVAL(sequencename)
(atau sintaks khusus DB apa pun untuk melakukannya) langsung setelahINSERT
dalam transaksi yang sama untuk mendapatkan kunci yang dihasilkan terakhir. Lihat juga jawaban ini .sumber
generatedKeys.next()
pengembaliantrue
jika DB kembali kunci yang dihasilkan. Lihat, ini aResultSet
. Theclose()
hanya untuk sumber informasi gratis. Kalau tidak, DB Anda akan habis dalam jangka panjang dan aplikasi Anda akan rusak. Anda hanya perlu menulis sendiri beberapa metode utilitas yang melakukan tugas penutup. Lihat juga ini dan jawaban ini .Buat Kolom Yang Dihasilkan
Berikan Kolom yang dibuat ini ke pernyataan Anda
Gunakan
ResultSet
objek untuk mengambil GeneratedKeys pada Pernyataansumber
Saya memukul Microsoft SQL Server 2008 R2 dari aplikasi berbasis JDBC single-threaded dan menarik kembali ID terakhir tanpa menggunakan properti RETURN_GENERATED_KEYS atau PreparedStatement. Terlihat seperti ini:
Posting blog ini dengan baik mengisolasi tiga opsi SQL Server "ID terakhir": http://msjawahar.wordpress.com/2008/01/25/how-to-find-the-Last-identity-value-inserted-in-the -sql-server / - belum membutuhkan dua lainnya.
sumber
Saat menemukan kesalahan 'Fitur yang tidak didukung' saat menggunakan
Statement.RETURN_GENERATED_KEYS
, coba ini:Di mana
BATCHID
id yang dibuat secara otomatis.sumber
BATCHID
Saya menggunakan SQLServer 2008, tetapi saya memiliki batasan pengembangan: Saya tidak dapat menggunakan driver baru untuk itu, saya harus menggunakan "com.microsoft.jdbc.sqlserver.SQLServerDriver" (saya tidak bisa menggunakan "com.microsoft.sqlserver.jdbc .SQLServerDriver ").
Karena itulah solusinya
conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
melemparkan java.lang.AbstractMethodError untuk saya. Dalam situasi ini, solusi yang mungkin saya temukan adalah yang lama yang disarankan oleh Microsoft: Cara Mengambil Nilai @@ IDENTITY Menggunakan JDBCSolusi ini berhasil untuk saya!
Saya harap ini membantu!
sumber
Alih-alih komentar , saya hanya ingin menjawab posting.
Antarmuka java.sql.PreparedStatement
columnIndexes «Anda dapat menggunakan fungsi prepStatement yang menerima pernyataan columnIndexes dan SQL. Di mana kolomIndeks diizinkan bendera konstan adalah Statement.RETURN_GENERATED_KEYS 1 atau Statement.NO_GENERATED_KEYS [2], pernyataan SQL yang mungkin mengandung satu atau lebih '?' IN placeholder parameter.
SINTETIS «
Contoh:
Nama Kolom « Sebutkan Nama Kolom seperti
'id', 'uniqueID', ...
. di tabel target yang berisi kunci yang dibuat secara otomatis yang harus dikembalikan. Pengemudi akan mengabaikannya jika pernyataan SQL bukanINSERT
pernyataan.SINTETIS «
Contoh:
Contoh Lengkap:
sumber
Anda dapat menggunakan kode java berikut untuk mendapatkan id yang dimasukkan baru.
sumber
Dengan NativeQuery Hibernate, Anda harus mengembalikan ResultList alih-alih SingleResult, karena Hibernate memodifikasi kueri asli
Suka
jika Anda mencoba untuk mendapatkan hasil tunggal, yang menyebabkan sebagian besar basis data (setidaknya PostgreSQL) melempar kesalahan sintaksis. Setelah itu, Anda dapat mengambil id yang dihasilkan dari daftar (yang biasanya berisi tepat satu item).
sumber
Dimungkinkan untuk menggunakannya dengan normal
Statement
juga (bukan hanyaPreparedStatement
)sumber
Dalam kasus saya ->
sumber
Jika Anda menggunakan Spring JDBC, Anda bisa menggunakan kelas GeneratedKeyHolder Spring untuk mendapatkan ID yang dimasukkan.
Lihat jawaban ini ... Bagaimana cara memasukkan id menggunakan Spring Jdbctemplate.update (String sql, obj ... args)
sumber
sumber
createStatement
Metode dariConnection
jangan mengharapkan params. 2.execute
Metode dariStatement
mengharapkan String dengan Kueri. 3.execute
Metode mengembalikan:true
jika hasil pertama adalahResultSet
objek;false
apakah itu jumlah pembaruan atau tidak ada hasil. docs.oracle.com/javase/7/docs/api/java/sql/…