Kustomisasi ResultSet

API JDBC modern memungkinkan Anda untuk menyesuaikan objek secara besar-besaran.PenyataanDankumpulan hasil. Misalnya menggunakankumpulan hasilAnda dapat mengubah baris dalam database.

Saat membuat objek pernyataan, kita bisa menyampaikan banyak keinginan kita ke dalamnya. Keinginan ini dapat dibagi menjadi tiga kelompok:

  • Jenis sambungan dasar
  • Kontrol akses bersamaan
  • Kegigihan dan transaksi

Parameter ini dapat diteruskan saat membuat objekPenyataanatauPernyataan yang Disiapkan. Contoh:

Statement statement = connection.createStatement(
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT );

PreparedStatement statement = connection.prepareStatement(sql,
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_READ_ONLY,
    ResultSet.CLOSE_CURSORS_OVER_COMMIT);

Kami tidak akan mempelajari hal-hal ini secara mendalam, tetapi saya ingin Anda tahu bahwa ini mungkin jika Anda menemukan sesuatu yang serupa di kode orang lain.

Jenis ResultSet

ResultSet dapat berupa tipe tertentu. Tipe mendefinisikan beberapa karakteristik dan kemampuan dari ResultSet.

Tidak semua tipe didukung oleh semua database dan driver JDBC. Anda harus memeriksa basis data dan driver JDBC Anda untuk melihat apakah itu mendukung jenis yang ingin Anda gunakan. Metode DatabaseMetaData.supportsResultSetType(int type) mengembalikan true atau false tergantung pada apakah tipe yang diberikan didukung atau tidak.

Pada saat penulisan, ada tiga jenis ResultSet:

  • ResultSet.TYPE_FORWARD_ONLY
  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • Set Hasil.TYPE_SCROLL_SENSITIF

Jenis defaultnya adalah TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY berarti ResultSet hanya dapat dipindahkan ke depan. Artinya, Anda hanya dapat berpindah dari baris 1, baris 2, baris 3, dst. Di ResultSet, Anda tidak dapat bergerak mundur: Anda tidak dapat membaca data dari baris ke-9 setelah membaca baris kesepuluh.

TYPE_SCROLL_INSENSITIVE berarti ResultSet dapat dipindahkan (digulir) maju atau mundur. Anda juga dapat pindah ke posisi relatif terhadap posisi saat ini, atau pindah ke posisi absolut.

ResultSet jenis ini tidak peka terhadap perubahan pada sumber data yang mendasarinya saat ResultSet terbuka. Artinya, jika entri di ResultSet diubah di database oleh utas atau proses lain, itu tidak akan tercermin di yang sudah dibukakumpulan hasildari jenis ini.

TYPE_SCROLL_SENSITIVE berarti ResultSet dapat dipindahkan (digulir) maju atau mundur. Anda juga dapat pindah ke posisi relatif terhadap posisi saat ini, atau pindah ke posisi absolut.

Sebuah ResultSet jenis ini sensitif terhadap perubahan sumber data yang mendasari sementara ResultSet terbuka. Artinya, jika sebuah entri di ResultSet diubah dalam database oleh utas atau proses lain, itu akan tercermin dalam yang sudah terbukakumpulan hasildari jenis ini.

Konkurensi

Konkurensi dari ResultSet menentukan apakah ResultSet dapat diperbarui atau hanya dibaca.

Beberapa database dan driver JDBC mendukung pembaruan ResultSet, tetapi tidak semua. Metode DatabaseMetaData.supportsResultSetConcurrency(int concurrency) mengembalikan true atau false tergantung pada apakah mode konkurensi yang diberikan didukung atau tidak.

ResultSet dapat memiliki salah satu dari dua tingkat konkurensi:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY berarti ResultSet hanya dapat dibaca.

CONCUR_UPDATABLE berarti ResultSet dapat dibaca dan dimodifikasi.

Contoh mengubah data dalam database

Dengan parameter ini, Anda dapat mengontrol Pernyataan yang dihasilkan dan ResultSet-nya.

Misalnya, Anda dapat membuat ResultSet yang dapat diperbarui dan menggunakannya untuk mengubah database. Saat membuat Pernyataan, penting untuk mengamati kondisi berikut:

  • hanya satu tabel yang ditentukan
  • tidak mengandung klausa join atau group by
  • kolom kueri harus berisi kunci utama

Saat kondisi di atas terpenuhi, ResultSet yang diperbarui dapat digunakan untuk memperbarui tabel di database. Saat membuat objek Pernyataan, Anda perlu menentukan parameter berikut:

Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)

Hasil dari mengeksekusi pernyataan seperti itu adalah kumpulan hasil yang dapat diperbarui. Metode pembaruan adalah memindahkan kursor ResultSet ke baris yang ingin Anda perbarui, lalu memanggil metode updateXXX() .

Metode updateXXX bekerja mirip dengan metode getXXX() . Metode updateXXX() memiliki dua parameter. Yang pertama adalah nomor kolom yang sedang diperbarui, yang bisa berupa nama kolom atau nomor seri. Yang kedua adalah data yang perlu diperbarui, dan tipe data ini harus sama dengan XXX.

Untuk benar-benar memperbarui baris dalam database, Anda perlu memanggil metode updateRow() sebelum kursor ResultSet meninggalkan baris yang diubah, jika tidak, perubahan tidak akan masuk ke database.

Anda juga dapat menambahkan baris baru ke tabel:

Pertama, Anda perlu memindahkan kursor ke baris kosong. Untuk melakukannya, panggil metode moveToInsertRow() .

Maka Anda perlu mengisi baris ini dengan data menggunakan metode updateXXX() .

Maka Anda perlu memanggil metode inserterRow() untuk menambahkan baris ke basis.

Dan terakhir, Anda perlu mengembalikan kursor dengan memanggil metode moveToCurrentRow() .

Penting! Tidak semua DBMS mendukung opsi ini untuk Pernyataan yang diperluas. Jika ada masalah, lihat dokumentasi resmi DBMS tertentu.