Typer av uttalanden

Vi har redan sett det enklaste Statement- gränssnittet . Och även om det är ganska lämpligt för arbete, är det inte så väl lämpat för komplexa frågor. I vissa källor uttrycks uppfattningen att det inte är nödvändigt att använda Statement alls – mer komplexa och mer funktionellt rika gränssnitt är lämpliga istället.

  • Förberett uttalande
  • CallableStatement

En ganska rimlig fråga uppstår - varför behövs dessa gränssnitt? Låt oss ta reda på det.

Först ska vi ta en titt på PreparedStatement- gränssnittet och andra JDBC-funktioner. Vi kommer att vända oss till CallableStatement- gränssnittet senare - dess användning är för det första inte så vanlig, och för det andra, efter allt övervägt om det, kan samtalet redan göras ganska kort.

PreparedStatement är också till stor hjälp från den populära metoden för databashackning som kallas SQL Injection.

Men mer om det lite senare.

Förberett uttalande

Om du försöker översätta namnet PreparedStatement kan du få något i stil med "prepared statement". Det viktigaste ordet här är "förberedd". Vad är "beredskap"?

Innan vi överväger denna fråga, föreslår jag att se en ganska viktig punkt ur bekvämlighetssynpunkt, vilket förekommer mycket ofta. Så i vissa applikationer måste vi infoga kontaktdata i KONTAKT-tabellen. För att göra detta måste vi förbereda en fråga så här:

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

Vid första anblicken verkar det som att allt inte är så svårt och skrämmande. Vi måste skriva en kod som kommer att samla in strängen vi behöver från parametrarna: förnamn, efternamn, adress och telefonnummer. Du behöver bara komma ihåg att all strängdata måste omges av ett enda citattecken.

Om vi ​​gör detta i en separat funktion får vi något sånt här:

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 skickar förnamn, efternamn, telefonnummer och adress till parameterfunktionen i formuläret, och från dem komponerar vi en SQL-frågesträng. Citat förstör bilden lite, men än så länge är det inte skrämmande.

Ok, hur är det med siffrorna? De behöver inte omges av citat. Opanki, i det ena fallet behöver du offerter, i det andra inte. Situationen blir allt mer komplicerad.

Låt oss nu lägga till ett problem till - vad händer om det finns ett vanligt citat (och inte ens ett) inuti strängen? Du måste först leta efter sådana offerter och bearbeta dem. Mdaaa. På något sätt börjar vi känna oss obekväma.

Om vi ​​nu lägger till datumbearbetning, då blir uppgiften helt tråkig - du måste göra ett enormt arbete. Datum är i allmänhet obehagliga - olika SQL-servrar accepterar olika format för datum.

Så vad ser vi? Om vi ​​behöver använda parametrar inuti frågan blir det mycket obehagligt att bygga frågan manuellt. Och inte bara obehagligt – jag skulle till och med säga tråkigt. Det finns ett stort antal fall att överväga, och det här är ett fruktansvärt tråkigt jobb. I grund och botten är det för sådana fall som gränssnittet PreparedStatement föreslogs .

Denna begäran låter dig göra två saker:

  • Förbered en förfrågan i förväg och anger platserna där parametrarna kommer att ersättas
  • Ställ in parametrar av en viss typ och kör sedan en fråga med parametrar redan inställda

PreparedStatement exempel

Strukturen för PreparedStatement för vårt alternativ att ställa in parametrar kommer att se ut så här:

// 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 är allt ganska enkelt.

För det första, när du skriver en SQL-fråga, skrivs de platser där parametrarna måste ersättas med frågetecken - "?".

För det andra skapas begäran genom att anropa con.prepareStatement() .

För det tredje går inställningen av parametrar genom indikeringen av antal och värde. Observera att antalet parametrar börjar från 1, inte från 0, som vi är vana vid när vi arbetar med arrayer och samlingar.

Gränssnittet PreparedStatement innehåller metoder för att ställa in strängar — setString() , för att ställa in siffror — setInt() , setLong() , setDouble() , för att ställa in datum — setDate() . Och mer komplexa typer - detta kan ses i dokumentationen.

För det fjärde är anropet till stmt.executeUpdate() redan kört utan att ange frågesträngen.

Jag rekommenderar starkt att bli vän med PreparedStatement - det här är ett mycket effektivt verktyg.