CodeGym/Java kursus/All lectures for DA purposes/Arbejder med PreparedStatement

Arbejder med PreparedStatement

Ledig

Typer af udsagn

Vi har allerede set den enkleste Statement- grænseflade . Og selvom det er ret velegnet til arbejde, er det ikke så velegnet til komplekse forespørgsler. I nogle kilder udtrykkes den opfattelse, at det slet ikke er nødvendigt at bruge Statement - mere komplekse og mere funktionelt rige grænseflader er velegnede i stedet.

  • Forberedt Erklæring
  • CallableStatement

Et ganske rimeligt spørgsmål opstår - hvorfor er disse grænseflader nødvendige? Lad os finde ud af det.

Først vil vi tage et kig på PreparedStatement- grænsefladen og andre JDBC-funktioner. Vi vil vende os til CallableStatement- grænsefladen senere - dens brug er for det første ikke så almindelig, og for det andet, efter alt overvejet, kan samtalen allerede gøres ganske kort.

PreparedStatement er også en stor hjælp fra den populære tilgang til database hacking kaldet SQL Injection.

Men mere om det lidt senere.

Forberedt Erklæring

Hvis du forsøger at oversætte navnet PreparedStatement , kan du få noget i retning af "prepared statement". Det vigtigste ord her er "forberedt". Hvad er "beredskab"?

Før vi overvejer dette spørgsmål, foreslår jeg at se et ret vigtigt punkt ud fra et bekvemmelighedssynspunkt, hvilket forekommer meget ofte. Så i nogle applikationer skal vi indsætte kontaktdata i KONTAKT-tabellen. For at gøre dette skal vi forberede en forespørgsel som denne:

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

Ved første øjekast ser det ud til, at alt ikke er så svært og skræmmende. Vi skal skrive en kode, der samler den streng, vi skal bruge, fra parametrene: fornavn, efternavn, adresse og telefonnummer. Du skal bare huske, at alle strengdata skal være omgivet af et enkelt anførselstegn.

Hvis vi gør dette i en separat funktion, får vi noget som dette:

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, efternavn, telefonnummer og adresse ind i parameterfunktionen i formularen, og ud fra dem sammensætter vi en SQL-forespørgselsstreng. Citater ødelægger billedet lidt, men indtil videre er det ikke skræmmende.

Ok, hvad med tallene? De behøver ikke at være omgivet af citater. Opanki, i det ene tilfælde har du brug for citater, i det andet har du ikke. Situationen bliver mere kompliceret.

Lad os nu tilføje et problem mere - hvad nu hvis der er et almindeligt citat (og ikke engang et) inde i strengen? Du skal først lede efter sådanne tilbud og behandle dem. Mdaaa. På en eller anden måde begynder vi at føle os utilpas.

Tilføjer vi nu datobearbejdning, så bliver opgaven helt kedelig – du skal lave et kæmpe arbejde. Datoer er generelt ubehagelige - forskellige SQL-servere accepterer forskellige formater for datoer.

Så hvad ser vi? Hvis vi skal bruge parametre inde i forespørgslen, bliver det meget ubehageligt at opbygge forespørgslen manuelt. Og ikke bare ubehageligt – jeg vil endda sige kedeligt. Der er et stort antal sager at overveje, og det er et frygteligt kedeligt job. Grundlæggende er det for sådanne tilfælde, at PreparedStatement- grænsefladen blev foreslået .

Denne anmodning giver dig mulighed for at gøre to ting:

  • Forbered en anmodning på forhånd med angivelse af de steder, hvor parametrene vil blive erstattet
  • Indstil parametre af en bestemt type, og udfør derefter en forespørgsel med allerede indstillede parametre

Eksempel på PreparedStatement

Strukturen for PreparedStatement for vores mulighed for at indstille parametre vil se sådan ud:

// 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 ret simpelt.

For det første, når du skriver en SQL-forespørgsel, skrives de steder, hvor parametrene skal erstattes, med spørgsmålstegn - "?".

For det andet oprettes anmodningen ved at kalde con.prepareStatement() .

For det tredje går indstillingen af ​​parametre gennem angivelse af antal og værdi. Bemærk venligst, at antallet af parametre starter fra 1, ikke fra 0, som vi er vant til, når vi arbejder med arrays og samlinger.

PreparedStatement- grænsefladen indeholder metoder til indstilling af strenge — setString() , til indstilling af tal — setInt() , setLong() , setDouble() , til indstilling af datoer — setDate() . Og mere komplekse typer - dette kan ses i dokumentationen.

For det fjerde er opkaldet til stmt.executeUpdate() allerede udført uden at angive forespørgselsstrengen.

Jeg anbefaler stærkt at blive venner med PreparedStatement - dette er et meget effektivt værktøj.

Kommentarer
  • Populær
  • Ny
  • Gammel
Du skal være logget ind for at skrive en kommentar
Denne side har ingen kommentarer endnu