Jenis pernyataan

Kami telah melihat antarmuka Pernyataan yang paling sederhana . Dan meskipun sangat cocok untuk bekerja, itu tidak begitu cocok untuk kueri yang rumit. Dalam beberapa sumber, pendapat diungkapkan bahwa tidak perlu menggunakan Pernyataan sama sekali - sebagai gantinya, antarmuka yang lebih kompleks dan lebih kaya fungsi cocok.

  • Pernyataan yang Disiapkan
  • Pernyataan yang Dapat Dipanggil

Muncul pertanyaan yang cukup masuk akal - mengapa antarmuka ini diperlukan? Mari kita cari tahu.

Pertama, kita akan melihat interface PreparedStatement dan fitur JDBC lainnya. Kami akan beralih ke antarmuka CallableStatement nanti - penggunaannya, pertama, tidak begitu umum, dan kedua, setelah mempertimbangkan semuanya, percakapan sudah dapat dibuat cukup singkat.

Juga, PreparedStatement sangat membantu dari pendekatan populer untuk peretasan basis data yang disebut SQL Injection.

Tetapi lebih dari itu nanti.

Pernyataan yang Disiapkan

Jika Anda mencoba menerjemahkan nama PreparedStatement , Anda bisa mendapatkan sesuatu seperti "prepared statement". Kata yang paling penting di sini adalah "siap". Apa itu "kesiapsiagaan"?

Sebelum kita mempertimbangkan masalah ini, saya mengusulkan untuk melihat poin yang agak penting dari sudut pandang kenyamanan, yang sangat sering terjadi. Jadi, di beberapa aplikasi, kita perlu memasukkan data kontak ke dalam tabel KONTAK. Untuk melakukan ini, kita perlu menyiapkan kueri seperti ini:

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

Sekilas, sepertinya semuanya tidak begitu sulit dan menakutkan. Kita perlu menulis kode yang akan mengumpulkan string yang kita butuhkan dari parameter: nama depan, nama belakang, alamat, dan nomor telepon. Anda hanya perlu mengingat bahwa semua data string harus diapit oleh satu karakter kutip.

Jika kita melakukan ini dalam fungsi terpisah, maka kita mendapatkan 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 meneruskan nama depan, nama belakang, nomor telepon, dan alamat ke fungsi parameter dalam formulir, dan dari mereka kami membuat string kueri SQL. Kutipan sedikit merusak gambar, tapi sejauh ini tidak menakutkan.

Oke, bagaimana dengan angkanya? Mereka tidak perlu dikelilingi oleh tanda kutip. Kemungkinan besar, dalam satu kasus Anda membutuhkan kutipan, dalam kasus lain Anda tidak membutuhkannya. Situasi semakin rumit.

Sekarang mari tambahkan satu masalah lagi - bagaimana jika ada kutipan biasa (dan bahkan tidak satu) di dalam string? Anda harus terlebih dahulu mencari kutipan tersebut dan memprosesnya. Mdaaa. Entah bagaimana kita mulai merasa tidak nyaman.

Jika sekarang kami menambahkan pemrosesan tanggal, maka tugas menjadi sangat membosankan - Anda harus melakukan banyak pekerjaan. Tanggal umumnya tidak menyenangkan - server SQL yang berbeda menerima format yang berbeda untuk tanggal.

Jadi apa yang kita lihat? Jika kita perlu menggunakan parameter di dalam kueri, membuat kueri secara manual menjadi sangat tidak menyenangkan. Dan bukan hanya tidak menyenangkan - saya bahkan akan mengatakan membosankan. Ada banyak sekali kasus yang perlu dipertimbangkan, dan ini adalah pekerjaan yang sangat membosankan. Pada dasarnya, untuk kasus seperti itulah antarmuka PreparedStatement diusulkan .

Permintaan ini memungkinkan Anda melakukan dua hal:

  • Persiapkan permintaan terlebih dahulu yang menunjukkan tempat di mana parameter akan diganti
  • Tetapkan parameter jenis tertentu lalu jalankan kueri dengan parameter yang sudah ditetapkan

Contoh Pernyataan Disiapkan

Struktur untuk PreparedStatement untuk opsi pengaturan parameter kita akan terlihat 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 cukup sederhana.

Pertama, saat menulis kueri SQL, tempat di mana parameter perlu diganti ditulis dengan tanda tanya - "?".

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

Ketiga, pengaturan parameter melalui penunjukan angka dan nilai. Harap perhatikan bahwa jumlah parameter dimulai dari 1, bukan dari 0, seperti yang biasa kita lakukan saat bekerja dengan array dan koleksi.

Antarmuka PreparedStatement berisi metode untuk menyetel string — setString() , untuk menyetel nomor — setInt() , setLong() , setDouble() , untuk menyetel tanggal — setDate() . Dan tipe yang lebih kompleks - ini bisa dilihat di dokumentasi.

Keempat, panggilan ke stmt.executeUpdate() sudah dijalankan tanpa menentukan string kueri.

Saya sangat menyarankan untuk berteman dengan PreparedStatement - ini adalah alat yang sangat efektif.