Jenis-jenis pernyataan

Kami telah melihat antara muka Pernyataan yang paling mudah . Dan walaupun ia agak sesuai untuk kerja, ia tidak begitu sesuai untuk pertanyaan yang rumit. Dalam sesetengah sumber, pendapat dinyatakan bahawa ia tidak perlu menggunakan Pernyataan sama sekali - antara muka yang lebih kompleks dan lebih kaya berfungsi sesuai sebaliknya.

  • PreparedStatement
  • CallableStatement

Timbul persoalan yang agak munasabah - mengapa antara muka ini diperlukan? Mari kita fikirkan.

Mula-mula, kita akan melihat antara muka PreparedStatement dan ciri JDBC yang lain. Kami akan beralih kepada antara muka CallableStatement kemudian - penggunaannya, pertama, tidak begitu biasa, dan kedua, selepas semua dipertimbangkan mengenainya, perbualan sudah boleh dibuat agak pendek.

Selain itu, PreparedStatement adalah bantuan besar daripada pendekatan popular untuk penggodaman pangkalan data yang dipanggil SQL Injection.

Tetapi lebih lanjut mengenai itu sedikit kemudian.

PreparedStatement

Jika anda cuba menterjemah nama PreparedStatement , anda boleh mendapatkan sesuatu seperti "penyata yang disediakan". Perkataan yang paling penting di sini ialah "disediakan". Apakah "kesediaan"?

Sebelum kita mempertimbangkan isu ini, saya mencadangkan untuk melihat perkara yang agak penting dari sudut pandangan kemudahan, yang berlaku sangat kerap. Jadi, dalam sesetengah aplikasi, kita perlu memasukkan data kenalan ke dalam jadual CONTACT. Untuk melakukan ini, kita perlu menyediakan pertanyaan seperti ini:

INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);

Pada pandangan pertama, nampaknya semuanya tidak begitu sukar dan menakutkan. Kami perlu menulis kod yang akan mengumpulkan rentetan yang kami perlukan daripada parameter: nama pertama, nama keluarga, alamat dan nombor telefon. Anda hanya perlu ingat bahawa semua data rentetan mesti dikelilingi oleh satu aksara petikan.

Jika kita melakukan ini dalam fungsi yang berasingan, maka kita mendapat sesuatu seperti ini:

public String buildInsert(String firstName,, String lastName, String phone, String email) {
    String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL)+
             	”VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
    return sql;
}

Kami menghantar nama pertama, nama keluarga, nombor telefon dan alamat ke dalam fungsi parameter dalam borang, dan daripadanya kami menyusun rentetan pertanyaan SQL. Petikan merosakkan gambar sedikit, tetapi setakat ini ia tidak menakutkan.

Ok, bagaimana dengan nombor? Mereka tidak perlu dikelilingi oleh petikan. Opanki, dalam satu kes anda memerlukan sebut harga, dalam kes lain anda tidak. Keadaan semakin rumit.

Sekarang mari kita tambah satu lagi masalah - bagaimana jika terdapat petikan biasa (dan bukan satu pun) di dalam rentetan? Anda mesti terlebih dahulu mencari petikan tersebut dan memprosesnya. Mdaaa. Entah kenapa kita mula rasa tidak selesa.

Jika kita kini menambah pemprosesan tarikh, maka tugas itu menjadi benar-benar membosankan - anda perlu melakukan banyak kerja. Tarikh biasanya tidak menyenangkan - pelayan SQL yang berbeza menerima format yang berbeza untuk tarikh.

Jadi apa yang kita nampak? Jika kita perlu menggunakan parameter di dalam pertanyaan, maka membina pertanyaan secara manual menjadi sangat tidak menyenangkan. Dan bukan sahaja tidak menyenangkan - saya juga akan mengatakan membosankan. Terdapat sejumlah besar kes untuk dipertimbangkan, dan ini adalah kerja yang sangat membosankan. Pada asasnya, antara muka PreparedStatement dicadangkan untuk kes sedemikian .

Permintaan ini membolehkan anda melakukan dua perkara:

  • Sediakan permintaan terlebih dahulu yang menunjukkan tempat di mana parameter akan diganti
  • Tetapkan parameter jenis tertentu dan kemudian laksanakan pertanyaan dengan parameter yang telah ditetapkan

Contoh Penyata Disediakan

Struktur untuk PreparedStatement untuk pilihan menetapkan parameter kami akan kelihatan seperti ini:

// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";

// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";

// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);

// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);

// Execute the request
stmt.executeUpdate();

Seperti yang anda lihat, semuanya agak mudah.

Pertama, semasa menulis pertanyaan SQL, tempat di mana parameter perlu digantikan ditulis dengan tanda soal - “?”.

Kedua, permintaan dibuat dengan memanggil con.prepareStatement() .

Ketiga, penetapan parameter melalui petunjuk nombor dan nilai. Sila ambil perhatian bahawa bilangan parameter bermula dari 1, bukan dari 0, seperti yang biasa kita lakukan apabila bekerja dengan tatasusunan dan koleksi.

Antara muka PreparedStatement mengandungi kaedah untuk menetapkan rentetan — setString() , untuk menetapkan nombor — setInt() , setLong() , setDouble() , untuk menetapkan tarikh — setDate() . Dan jenis yang lebih kompleks - ini boleh dilihat dalam dokumentasi.

Keempat, panggilan ke stmt.executeUpdate() sudah dilaksanakan tanpa menyatakan rentetan pertanyaan.

Saya amat mengesyorkan berkawan dengan PreparedStatement - ini adalah alat yang sangat berkesan.