Typer utsagn

Vi har allerede sett det enkleste Statement- grensesnittet . Og selv om det er ganske egnet for arbeid, er det ikke så godt egnet for komplekse spørsmål. I noen kilder uttrykkes oppfatningen at det ikke er nødvendig å bruke Statement i det hele tatt – mer komplekse og mer funksjonsrike grensesnitt er egnet i stedet.

  • Forberedt uttalelse
  • CallableStatement

Et ganske rimelig spørsmål dukker opp - hvorfor trengs disse grensesnittene? La oss finne ut av det.

Først skal vi ta en titt på PreparedStatement- grensesnittet og andre JDBC-funksjoner. Vi vil vende oss til CallableStatement- grensesnittet senere - bruken av det er for det første ikke så vanlig, og for det andre, etter alt som er vurdert om det, kan samtalen allerede gjøres ganske kort.

PreparedStatement er også en stor hjelp fra den populære tilnærmingen til databasehacking kalt SQL Injection.

Men mer om det litt senere.

Forberedt uttalelse

Hvis du prøver å oversette navnet PreparedStatement , kan du få noe sånt som "prepared statement". Det viktigste ordet her er "forberedt". Hva er "beredskap"?

Før vi vurderer dette spørsmålet, foreslår jeg å se et ganske viktig poeng fra et bekvemmelighetssynspunkt, som forekommer veldig ofte. Så i noen applikasjoner må vi sette inn kontaktdata i KONTAKT-tabellen. For å gjøre dette, må vi forberede en spørring som dette:

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

Ved første øyekast ser det ut til at alt ikke er så vanskelig og skummelt. Vi må skrive en kode som samler strengen vi trenger fra parameterne: fornavn, etternavn, adresse og telefonnummer. Du trenger bare å huske at alle strengdata må være omgitt av et enkelt anførselstegn.

Hvis vi gjør dette i en egen funksjon, får vi noe slikt:

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

Vi sender fornavn, etternavn, telefonnummer og adresse inn i parameterfunksjonen i skjemaet, og fra dem lager vi en SQL-spørringsstreng. Sitater ødelegger bildet litt, men så langt er det ikke skummelt.

Ok, hva med tallene? De trenger ikke være omgitt av sitater. Opanki, i det ene tilfellet trenger du sitater, i det andre ikke. Situasjonen blir mer komplisert.

La oss nå legge til ett problem til - hva om det er et vanlig sitat (og ikke engang ett) inne i strengen? Du må først se etter slike sitater og behandle dem. Mdaaa. På en eller annen måte begynner vi å føle oss ukomfortable.

Hvis vi nå legger til datobehandling, så blir oppgaven helt kjedelig - du må gjøre enormt mye arbeid. Datoer er generelt ubehagelige - forskjellige SQL-servere godtar forskjellige formater for datoer.

Så hva ser vi? Hvis vi trenger å bruke parametere inne i spørringen, blir det svært ubehagelig å bygge spørringen manuelt. Og ikke bare ubehagelig - jeg vil til og med si kjedelig. Det er et stort antall saker å vurdere, og dette er en fryktelig kjedelig jobb. I utgangspunktet er det for slike tilfeller PreparedStatement- grensesnittet ble foreslått .

Denne forespørselen lar deg gjøre to ting:

  • Forbered en forespørsel på forhånd som angir stedene der parametrene vil bli erstattet
  • Sett parametere av en bestemt type og utfør deretter en spørring med parametere som allerede er satt

Eksempel på PreparedStatement

Strukturen for PreparedStatement for vårt alternativ for å sette parametere vil se slik ut:

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

Som du kan se, er alt ganske enkelt.

For det første, når du skriver en SQL-spørring, skrives stedene der parametrene må erstattes med spørsmålstegn - "?".

For det andre opprettes forespørselen ved å kalle con.prepareStatement() .

For det tredje går innstillingen av parametere gjennom indikasjonen av antall og verdi. Vær oppmerksom på at antall parametere starter fra 1, ikke fra 0, slik vi er vant til når vi jobber med matriser og samlinger.

PreparedStatement- grensesnittet inneholder metoder for å sette strenger — setString() , for å sette tall — setInt() , setLong() , setDouble() , for å sette datoer — setDate() . Og mer komplekse typer - dette kan sees i dokumentasjonen.

For det fjerde er kallet til stmt.executeUpdate() allerede utført uten å spesifisere spørringsstrengen.

Jeg anbefaler på det sterkeste å bli venner med PreparedStatement - dette er et veldig effektivt verktøy.