Tipuri de afirmații

Am văzut deja cea mai simplă interfață Statement . Și, deși este destul de potrivit pentru muncă, nu este atât de potrivit pentru interogări complexe. În unele surse, se exprimă opinia că nu este deloc necesară utilizarea Statement - sunt potrivite în schimb interfețe mai complexe și mai bogate din punct de vedere funcțional.

  • Declarație pregătită
  • CallableStatement

Apare o întrebare destul de rezonabilă - de ce sunt necesare aceste interfețe? Să ne dăm seama.

În primul rând, vom arunca o privire la interfața PreparedStatement și la alte caracteristici JDBC. Vom apela mai târziu la interfața CallableStatement - utilizarea sa, în primul rând, nu este atât de comună, iar în al doilea rând, după tot ce s-a luat în considerare, conversația poate fi deja destul de scurtă.

De asemenea, PreparedStatement este de mare ajutor din abordarea populară a hackingului de baze de date numită SQL Injection.

Dar mai multe despre asta puțin mai târziu.

Declarație pregătită

Dacă încercați să traduceți numele PreparedStatement , puteți obține ceva de genul „prepared statement”. Cel mai important cuvânt aici este „pregătit”. Ce este „pregătirea”?

Înainte de a lua în considerare această problemă, îmi propun să vedem un punct destul de important din punct de vedere al confortului, care apare foarte des. Deci, în unele aplicații, trebuie să inserăm datele de contact în tabelul CONTACT. Pentru a face acest lucru, trebuie să pregătim o interogare ca aceasta:

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

La prima vedere, se pare că totul nu este atât de dificil și înfricoșător. Trebuie să scriem un cod care să colecteze șirul de care avem nevoie din parametrii: prenume, prenume, adresă și număr de telefon. Trebuie doar să rețineți că toate datele șirului trebuie să fie înconjurate de un singur caracter ghilimele.

Dacă facem acest lucru într-o funcție separată, atunci obținem ceva de genul acesta:

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

Trecem numele, prenumele, numărul de telefon și adresa în funcția de parametri din formular, iar din ele compunem un șir de interogare SQL. Citatele strică puțin imaginea, dar până acum nu este înfricoșător.

Ok, ce zici de numere? Nu trebuie să fie înconjurate de ghilimele. Opanki, într-un caz aveți nevoie de citate, în celălalt nu. Situația devine din ce în ce mai complicată.

Acum să mai adăugăm o problemă - ce se întâmplă dacă există un citat obișnuit (și nici măcar unul) în interiorul șirului? Mai întâi trebuie să cauți astfel de citate și să le procesezi. Mdaaa. Cumva începem să ne simțim inconfortabil.

Dacă acum adăugăm procesarea datei, atunci sarcina devine complet plictisitoare - trebuie să faci o cantitate imensă de muncă. Datele sunt în general neplăcute - diferite servere SQL acceptă formate diferite pentru date.

Deci ce vedem? Dacă trebuie să folosim parametrii în interiorul interogării, atunci construirea manuală a interogării devine foarte neplăcută. Și nu doar neplăcut - aș spune chiar și plictisitor. Există un număr mare de cazuri de luat în considerare, iar aceasta este o muncă teribil de plictisitoare. Practic, pentru astfel de cazuri a fost propusă interfața PreparedStatement .

Această solicitare vă permite să faceți două lucruri:

  • Pregătiți în prealabil o cerere indicând locurile în care vor fi înlocuiți parametrii
  • Setați parametri de un anumit tip și apoi executați o interogare cu parametrii deja setați

Exemplu PreparedStatement

Structura pentru PreparedStatement pentru opțiunea noastră de setare a parametrilor va arăta astfel:

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

După cum puteți vedea, totul este destul de simplu.

În primul rând, când scrieți o interogare SQL, locurile în care parametrii vor trebui înlocuiți sunt scrise cu semne de întrebare - „?”.

În al doilea rând, cererea este creată prin apelarea con.prepareStatement() .

În al treilea rând, setarea parametrilor trece prin indicarea numărului și a valorii. Vă rugăm să rețineți că numărul de parametri începe de la 1, nu de la 0, așa cum suntem obișnuiți când lucrăm cu tablouri și colecții.

Interfața PreparedStatement conține metode pentru setarea șirurilor de caractere — setString() , pentru setarea numerelor — setInt() , setLong() , setDouble() , pentru setarea datelor — setDate() . Și tipuri mai complexe - acest lucru poate fi văzut în documentație.

În al patrulea rând, apelul la stmt.executeUpdate() este deja executat fără a specifica șirul de interogare.

Recomand cu tărie să vă împrietenești cu PreparedStatement - acesta este un instrument foarte eficient.