CodeGym/Java tanfolyam/All lectures for HU purposes/A PreparedStatement használata

A PreparedStatement használata

Elérhető

Az állítások fajtái

A legegyszerűbb Statement felületet már láttuk . És bár nagyon alkalmas a munkára, nem annyira alkalmas összetett lekérdezésekre. Egyes forrásokban az a vélemény fogalmazódik meg, hogy egyáltalán nem szükséges a Statement használata , helyette összetettebb és funkciógazdagabb interfészek alkalmasak.

  • Készített nyilatkozat
  • CallableStatement

Felmerül egy teljesen jogos kérdés: miért van szükség ezekre az interfészekre? Találjuk ki.

Először is vessünk egy pillantást a PreparedStatement felületre és a JDBC egyéb szolgáltatásaira. Később kitérünk a CallableStatement felületre - annak használata egyrészt nem olyan elterjedt, másrészt mindent átgondolva a beszélgetés már elég rövidre szabható.

Ezenkívül a PreparedStatement nagy segítséget jelent az adatbázis-hackelés népszerű megközelítéséhez, az SQL Injection-hez.

De erről kicsit később.

Készített nyilatkozat

Ha megpróbálja lefordítani a PreparedStatement nevet , valami ilyesmit kaphat: „prepared Statement”. A legfontosabb szó itt az „előkészült”. Mi az a "felkészültség"?

Mielőtt megvizsgálnánk ezt a kérdést, azt javaslom, hogy nézzünk meg egy meglehetősen fontos pontot a kényelem szempontjából, ami nagyon gyakran előfordul. Így egyes alkalmazásokban be kell illesztenünk a névjegyadatokat a KAPCSOLAT táblába. Ehhez el kell készítenünk egy ilyen lekérdezést:

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

Első pillantásra úgy tűnik, hogy nem minden olyan nehéz és ijesztő. Írnunk kell egy kódot, amely összegyűjti a számunkra szükséges karakterláncot a paraméterekből: keresztnév, vezetéknév, cím és telefonszám. Csak emlékeznie kell arra, hogy minden karakterlánc-adatot egyetlen idézőjelnek kell körülvennie.

Ha ezt külön függvényben tesszük, akkor valami ilyesmit kapunk:

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

Az űrlap paraméterfüggvényébe a keresztnevet, vezetéknevet, telefonszámot és címet adjuk át, és ezekből állítunk össze egy SQL lekérdezési karakterláncot. Az idézetek kicsit rontják a képet, de egyelőre nem ijesztő.

Oké, mi a helyzet a számokkal? Nem kell őket idézőjelekkel körülvenni. Opanki, az egyik esetben kell idézetek, a másikban nem. A helyzet egyre bonyolultabb.

Most adjunk hozzá még egy problémát – mi van akkor, ha van egy közönséges idézet (és nem is egy) a karakterláncon belül? Először meg kell keresni az ilyen idézeteket és feldolgozni. Mdaaa. Valahogy kezdjük kényelmetlenül érezni magunkat.

Ha most hozzáadjuk a dátumfeldolgozást, akkor a feladat teljesen unalmassá válik - hatalmas mennyiségű munkát kell végeznie. A dátumok általában kellemetlenek – a különböző SQL szerverek különböző dátumformátumokat fogadnak el.

Szóval mit látunk? Ha paramétereket kell használnunk a lekérdezésben, akkor a lekérdezés manuális felépítése nagyon kellemetlen lesz. És nem csak kellemetlen – akár unalmasnak is mondanám. Rengeteg esetet kell mérlegelni, és ez egy borzasztóan unalmas munka. Alapvetően ilyen esetekre javasolták a PreparedStatement felületet .

Ez a kérés két dolgot tesz lehetővé:

  • Előzetesen készítsen kérelmet, jelezve a paraméterek helyettesítésének helyeit
  • Állítson be egy bizonyos típusú paramétereket, majd hajtson végre egy lekérdezést a már beállított paraméterekkel

PreparedStatement példa

A PreparedStatement felépítése a paraméterek beállításához a következőképpen néz ki:

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

Mint látható, minden nagyon egyszerű.

Először is, egy SQL-lekérdezés írásakor kérdőjelekkel írják azokat a helyeket, ahol a paramétereket be kell cserélni.

Másodszor, a kérés a con.prepareStatement() meghívásával jön létre .

Harmadszor, a paraméterek beállítása a szám és az érték jelzésén keresztül megy végbe. Kérjük, vegye figyelembe, hogy a paraméterek száma 1-től kezdődik, nem 0-tól, ahogy azt megszoktuk, amikor tömbökkel és gyűjteményekkel dolgozunk.

A PreparedStatement felület tartalmaz metódusokat a karakterláncok beállítására — setString() , a számok beállítására — setInt() , setLong() , setDouble() , a dátumok beállítására — setDate() . És bonyolultabb típusok - ez látható a dokumentációban.

Negyedszer, az stmt.executeUpdate() hívás már végrehajtásra kerül a lekérdezési karakterlánc megadása nélkül.

Erősen ajánlom, hogy barátkozzon meg a PreparedStatementtel – ez egy nagyon hatékony eszköz.

Hozzászólások
  • Népszerű
  • Új
  • Régi
Hozzászólás írásához be kell jelentkeznie
Ennek az oldalnak még nincsenek megjegyzései