Jinis-jinis pratelan

Kita wis ndeleng antarmuka Pernyataan sing paling gampang . Lan sanajan iku cukup cocok kanggo karya, iku ora supaya uga cocog kanggo pitakonan Komplek. Ing sawetara sumber, panemu kasebut nyatakake yen ora perlu nggunakake Pernyataan - antarmuka sing luwih rumit lan luwih fungsional luwih cocog.

  • PreparedStatement
  • CallableStatement

Pitakonan sing cukup cukup muncul - kenapa antarmuka kasebut dibutuhake? Ayo dadi tokoh metu.

Pisanan, kita bakal ndeleng antarmuka PreparedStatement lan fitur JDBC liyane. Kita bakal pindhah menyang antarmuka CallableStatement mengko - panggunaane, pisanan, ora umum, lan kaloro, sawise kabeh dianggep, obrolan bisa digawe cendhak.

Uga, PreparedStatement minangka bantuan gedhe saka pendekatan populer kanggo peretasan database sing diarani SQL Injection.

Nanging liyane babagan sing sethitik mengko.

PreparedStatement

Yen sampeyan nyoba nerjemahake jeneng PreparedStatement , sampeyan bisa njaluk kaya "statement disiapake". Tembung sing paling penting ing kene yaiku "disiapake". Apa "kesiapan"?

Sadurunge nimbang masalah iki, aku ngusulake kanggo ndeleng titik sing rada penting saka sudut pandang penak, sing kerep banget. Dadi, ing sawetara aplikasi, kita kudu nglebokake data kontak menyang tabel KONTAK. Kanggo nindakake iki, kita kudu nyiapake pitakon kaya iki:

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

Ing kawitan marketing, misale jek sing kabeh ora dadi angel lan medeni. Kita kudu nulis kode sing bakal ngumpulake senar sing dibutuhake saka paramèter: jeneng ngarep, jeneng mburi, alamat lan nomer telpon. Sampeyan mung kudu ngelingi yen kabeh data string kudu diubengi dening karakter kutipan siji.

Yen kita nindakake iki ing fungsi sing kapisah, mula kita entuk kaya iki:

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;
}

We pass jeneng ngarep, jeneng mburi, nomer telpon, lan alamat menyang fungsi parameter ing wangun, lan saka wong-wong mau kita nyipta string query SQL. Quotes spoil gambar sethitik, nanging supaya adoh iku ora medeni.

Oke, kepiye babagan angka? Dheweke ora perlu diubengi kutipan. Opanki, ing siji kasus sampeyan butuh kuotasi, ing liyane sampeyan ora. Kahanane tambah ruwet.

Saiki ayo nambah siji masalah - apa yen ana kutipan biasa (lan ora malah siji) nang string? Sampeyan kudu nggoleki kuotasi kasebut lan ngolah. Mdaaa. Piye wae kita mulai ngrasa ora kepenak.

Yen saiki nambah pangolahan tanggal, mula tugas kasebut dadi mboseni - sampeyan kudu nindakake karya sing akeh banget. Tanggal umume ora nyenengake - server SQL sing beda nampa format sing beda kanggo tanggal.

Dadi apa sing kita deleng? Yen kita kudu nggunakake paramèter ing jero query, banjur mbangun query kanthi manual dadi ora nyenengake. Lan ora mung ora nyenengake - aku bakal ngomong mboseni. Ana akeh kasus sing kudu ditimbang, lan iki minangka proyek sing mboseni. Sejatine, kanggo kasus kaya mengkono, antarmuka PreparedStatement diusulake .

Panjaluk iki ngidini sampeyan nindakake rong perkara:

  • Siapke panjalukan ing advance nuduhake panggonan ngendi paramèter bakal diganti
  • Setel paramèter saka jinis tartamtu banjur nglakokaké pitakon kanthi paramèter sing wis disetel

Tuladha PreparedStatement

Struktur kanggo PreparedStatement kanggo pilihan setelan paramèter bakal katon kaya iki:

// 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();

Nalika sampeyan bisa ndeleng, kabeh iku cukup prasaja.

Kaping pisanan, nalika nulis pitakon SQL, papan sing kudu diganti paramèter ditulis nganggo tandha pitakon - "?".

Kapindho, request digawe dening con.prepareStatement () nelpon .

Katelu, setelan paramèter ngliwati indikasi nomer lan nilai. Wigati dimangerteni manawa jumlah paramèter diwiwiti saka 1, ora saka 0, kaya sing biasa kita lakoni nalika nggarap array lan koleksi.

Antarmuka PreparedStatement ngandhut cara kanggo nyetel strings — setString () , kanggo nyetel nomer — setInt () , setLong () , setDouble () , kanggo nyetel tanggal — setDate () . Lan jinis sing luwih rumit - iki bisa dideleng ing dokumentasi.

Papat, telpon kanggo stmt.executeUpdate () wis kaleksanan tanpa nemtokake string query.

Aku banget nyaranake nggawe kanca karo PreparedStatement - iki minangka alat sing efektif banget.