Soorten verklaringen

We hebben de eenvoudigste Statement- interface al gezien . En hoewel het best geschikt is voor werk, is het niet zo geschikt voor complexe vragen. In sommige bronnen wordt de mening geuit dat het helemaal niet nodig is om Statement te gebruiken - in plaats daarvan zijn complexere en meer functioneel rijke interfaces geschikt.

  • Voorbereide verklaring
  • Oproepbare verklaring

Een redelijk redelijke vraag rijst - waarom zijn deze interfaces nodig? Laten we het uitzoeken.

Eerst bekijken we de PreparedStatement- interface en andere JDBC-functies. We zullen later kijken naar de CallableStatement- interface - het gebruik ervan is ten eerste niet zo gebruikelijk, en ten tweede kan het gesprek, na alles erover te hebben nagedacht, al vrij kort worden gehouden.

Ook is PreparedStatement een grote hulp van de populaire benadering van het hacken van databases genaamd SQL Injection.

Maar daarover later meer.

Voorbereide verklaring

Als u de naam PreparedStatement probeert te vertalen , kunt u zoiets krijgen als "prepared statement". Het belangrijkste woord hier is "bereid". Wat is "paraatheid"?

Voordat we op deze kwestie ingaan, stel ik voor een nogal belangrijk punt te bekijken vanuit het oogpunt van gemak, dat heel vaak voorkomt. In sommige toepassingen moeten we dus contactgegevens invoegen in de CONTACT-tabel. Om dit te doen, moeten we een query als deze voorbereiden:

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

Op het eerste gezicht lijkt het erop dat alles niet zo moeilijk en eng is. We moeten een code schrijven die de string verzamelt die we nodig hebben uit de parameters: voornaam, achternaam, adres en telefoonnummer. U hoeft alleen te onthouden dat alle tekenreeksgegevens tussen een enkel aanhalingsteken moeten staan.

Als we dit in een aparte functie doen, krijgen we zoiets als dit:

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 geven de voornaam, achternaam, telefoonnummer en adres door aan de parameterfunctie in het formulier, en daaruit stellen we een SQL-queryreeks samen. Citaten bederven het beeld een beetje, maar tot nu toe is het niet eng.

Oké, hoe zit het met de cijfers? Ze hoeven niet tussen aanhalingstekens te staan. Echter, in het ene geval heb je offertes nodig, in het andere niet. De situatie wordt ingewikkelder.

Laten we nu nog een probleem toevoegen - wat als er een gewoon aanhalingsteken (en niet eens één) in de string staat? Dergelijke offertes moet je eerst opzoeken en verwerken. Mdaaa. Op de een of andere manier beginnen we ons ongemakkelijk te voelen.

Als we nu datumverwerking toevoegen, wordt de taak helemaal saai - je moet enorm veel werk verzetten. Datums zijn over het algemeen onaangenaam - verschillende SQL-servers accepteren verschillende formaten voor datums.

Dus wat zien we? Als we parameters in de query moeten gebruiken, wordt het handmatig bouwen van de query erg onaangenaam. En niet alleen onaangenaam - ik zou zelfs zeggen saai. Er zijn een groot aantal gevallen om te overwegen, en dit is een vreselijk saaie klus. In feite is het voor dergelijke gevallen dat de PreparedStatement- interface werd voorgesteld .

Met dit verzoek kunt u twee dingen doen:

  • Bereid van tevoren een verzoek voor met vermelding van de plaatsen waar de parameters zullen worden vervangen
  • Stel parameters van een bepaald type in en voer vervolgens een query uit met reeds ingestelde parameters

Voorbeeld van een voorbereide verklaring

De structuur voor PreparedStatement voor onze optie om parameters in te stellen ziet er als volgt uit:

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

Zoals je kunt zien, is alles vrij eenvoudig.

Ten eerste worden bij het schrijven van een SQL-query de plaatsen waar de parameters moeten worden vervangen, geschreven met vraagtekens - "?".

Ten tweede wordt het verzoek gemaakt door con.prepareStatement() aan te roepen .

Ten derde gaat het instellen van parameters via de indicatie van het aantal en de waarde. Houd er rekening mee dat het aantal parameters begint bij 1, niet bij 0, zoals we gewend zijn bij het werken met arrays en verzamelingen.

De interface PreparedStatement bevat methoden voor het instellen van tekenreeksen — setString() , voor het instellen van getallen — setInt() , setLong() , setDouble() , voor het instellen van datums — setDate() . En meer complexe typen - dit is te zien in de documentatie.

Ten vierde is de aanroep van stmt.executeUpdate() al uitgevoerd zonder de queryreeks op te geven.

Ik raad ten zeerste aan om vrienden te maken met PreparedStatement - dit is een zeer effectieve tool.