Penyesuaian ResultSet

API JDBC moden membolehkan anda menyesuaikan objek dengan sangat baik.KenyataanDanset keputusan. Sebagai contoh, menggunakanset keputusananda boleh menukar baris dalam pangkalan data.

Apabila mencipta objek pernyataan, kita boleh menyampaikan sekumpulan keinginan kita ke dalamnya. Hasrat ini boleh dibahagikan kepada tiga kumpulan:

  • Jenis sambungan asas
  • Kawalan akses serentak
  • Kegigihan dan transaksi

Parameter ini boleh diluluskan semasa membuat objekKenyataanatauPreparedStatement. 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 mengkaji perkara ini secara mendalam, tetapi saya ingin anda tahu bahawa ini mungkin jika anda menemui sesuatu yang serupa dalam kod orang lain.

Jenis ResultSet

ResultSet boleh daripada jenis tertentu. Jenis mentakrifkan beberapa ciri dan keupayaan ResultSet.

Tidak semua jenis disokong oleh semua pangkalan data dan pemacu JDBC. Anda perlu menyemak pangkalan data anda dan pemacu JDBC untuk melihat sama ada ia menyokong jenis yang anda mahu gunakan. Kaedah DatabaseMetaData.supportsResultSetType(int type) mengembalikan benar atau palsu bergantung pada sama ada jenis yang diberikan disokong atau tidak.

Pada masa penulisan, terdapat tiga jenis ResultSet:

  • ResultSet.TYPE_FORWARD_ONLY
  • ResultSet.TYPE_SCROLL_INSENSITIVE
  • ResultSet.TYPE_SCROLL_SENSITIVE

Jenis lalai ialah TYPE_FORWARD_ONLY.

TYPE_FORWARD_ONLY bermakna ResultSet hanya boleh dialihkan ke hadapan. Iaitu, anda hanya boleh bergerak dari baris 1, baris 2, baris 3, dll. Dalam ResultSet, anda tidak boleh bergerak ke belakang: anda tidak boleh membaca data dari baris ke-9 selepas membaca kesepuluh.

TYPE_SCROLL_INSENSITIVE bermakna ResultSet boleh dialihkan (menatal) ke hadapan atau ke belakang. Anda juga boleh beralih ke kedudukan relatif kepada kedudukan semasa, atau beralih ke kedudukan mutlak.

ResultSet jenis ini tidak sensitif terhadap perubahan pada sumber data asas semasa ResultSet dibuka. Iaitu, jika entri dalam ResultSet ditukar dalam pangkalan data oleh urutan atau proses lain, ia tidak akan ditunjukkan dalam yang telah dibukaset keputusanjenis ini.

TYPE_SCROLL_SENSITIVE bermakna ResultSet boleh dialihkan (menatal) ke hadapan atau ke belakang. Anda juga boleh beralih ke kedudukan relatif kepada kedudukan semasa, atau beralih ke kedudukan mutlak.

ResultSet jenis ini sensitif kepada perubahan dalam sumber data asas semasa ResultSet dibuka. Iaitu, jika entri dalam ResultSet diubah dalam pangkalan data oleh utas atau proses lain, ia akan ditunjukkan dalam fail yang telah dibuka.set keputusanjenis ini.

Concurrency

Keselarasan ResultSet menentukan sama ada ResultSet boleh dikemas kini atau hanya dibaca.

Sesetengah pangkalan data dan pemacu JDBC menyokong pengemaskinian ResultSet, tetapi bukan semua. Kaedah DatabaseMetaData.supportsResultSetConcurrency(int concurrency) mengembalikan benar atau palsu bergantung pada sama ada mod serentak yang diberikan disokong atau tidak.

ResultSet boleh mempunyai satu daripada dua tahap konkurensi:

  • ResultSet.CONCUR_READ_ONLY
  • ResultSet.CONCUR_UPDATABLE

CONCUR_READ_ONLY bermakna ResultSet hanya boleh dibaca.

CONCUR_UPDATABLE bermakna ResultSet boleh dibaca dan diubah suai.

Contoh menukar data dalam pangkalan data

Dengan parameter ini, anda boleh mengawal Penyata yang dijana dan ResultSetnya.

Sebagai contoh, anda boleh mencipta ResultSet yang boleh dikemas kini dan menggunakannya untuk menukar pangkalan data. Apabila membuat Penyata, adalah penting untuk mematuhi syarat berikut:

  • hanya satu jadual ditetapkan
  • tidak mengandungi gabungan atau kumpulan mengikut klausa
  • lajur pertanyaan mesti mengandungi kunci utama

Apabila syarat di atas dipenuhi, ResultSet yang dikemas kini boleh digunakan untuk mengemas kini jadual dalam pangkalan data. Apabila membuat objek Pernyataan, anda perlu menentukan parameter berikut:

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

Hasil daripada melaksanakan kenyataan sedemikian ialah set hasil yang boleh dikemas kini. Kaedah kemas kini adalah untuk mengalihkan kursor ResultSet ke baris yang ingin anda kemas kini dan kemudian memanggil kaedah updateXXX() .

Kaedah updateXXX berfungsi sama dengan kaedah getXXX() . Kaedah kemas kiniXXX() mempunyai dua parameter. Yang pertama ialah nombor lajur yang sedang dikemas kini, yang boleh menjadi nama lajur atau nombor siri. Yang kedua ialah data yang perlu dikemas kini dan jenis data ini mestilah sama dengan XXX.

Untuk benar-benar mengemas kini baris dalam pangkalan data, anda perlu memanggil kaedah updateRow() sebelum kursor ResultSet meninggalkan baris yang diubah, jika tidak, perubahan tidak akan masuk ke dalam pangkalan data.

Anda juga boleh menambah baris baharu pada jadual:

Mula-mula anda perlu mengalihkan kursor ke baris kosong. Untuk melakukan ini, panggil kaedah moveToInsertRow() .

Kemudian anda perlu mengisi baris ini dengan data menggunakan kaedah updateXXX() .

Kemudian anda perlu memanggil kaedah inserterRow() untuk menambah baris ke pangkalan.

Dan akhirnya, anda perlu mengembalikan kursor dengan memanggil kaedah moveToCurrentRow() .

Penting! Tidak semua DBMS menyokong pilihan ini untuk Penyata lanjutan. Sekiranya terdapat masalah, lihat dokumentasi rasmi DBMS tertentu.