Child pages
  • A JDBC Statement típusok
Skip to end of metadata
Go to start of metadata

Statement

A Statement interfész tartalmazza az alap metódusokat az SQL utasítások végrehajtásához és feldolgozásához. Ilyen típusú objektumhoz a Connection objektum createStatement metódusának meghívásával juthatunk. Ennek a metódusnak több fajtája van melyekkel optimalizálhatjuk az adatbázishoz való hozzáférést úgy, hogy megadjuk a ResultSet interfészben definiált konstansok közül valamelyiket:

  • resultSetType:
    • TYPE_FORWARD_ONLY – Az eredménytábla kurzora csak előrefele mozgatható.
    • TYPE_SCROLL_INSENSITIVE – Az eredménytábla kurzora mindkét irányba mozgatható de a mások által eszközölt módosításokat nem képes észlelni. Előfordulhat ugyanis, hogy míg mi az eredménykészletet feldolgozzuk, annak egy vagy több sorát egy másik program módosítja.
    • TYPE_SCROLL_SENSITIVE – Az eredménytábla kurzora mindkét irányba mozgatható és képes észlelni a mások által eszközölt módosításokat.
  • resultSetConcurrency:
    • CONCUR_READ_ONLY – Az eredménytábla nem változtatható meg.
    • CONCUR_UPDATABLE – Az eredménytábla megváltoztatható az update<típus> kezdetű metódusokkal.
  • resultSetHoldability – Bizonyos adatbáziskezelők esetén a ResultSet objektum bezárulhat, ha meghívjuk a Connection.commit metódust. Az alábbi konstansokkal beállíthatjuk ezt a viselkedést.
    • HOLD_CURSORS_OVER_COMMIT – nem zárul be a ResultSet objektum
    • CLOSE_CURSORS_AT_COMMIT – bezárulhat a ResultSet objektum

A Statement futtatása

A Statement objektumot többféleképpen lehet futtatni, mindegyik metódus paraméteréül magát az SQL utasítást kell megadni. Ezek mindegyikének meghívásakor automatikusan lezárulnak az esetlegesen korábban létrejött, ugyanezen Statement objektumhoz kötődő eredménytáblák, ezért ügyelni kell, hogy új SQL utasítás végrahajtása előtt a korábbi ereménytáblák feldolgozásra kerüljenek.

  • execute – ha az adatbázis által visszaadott értékek első komponense eredménykészlet akkor visszatérési értéke igaz egyébként hamis. Akkor érdemes használni, ha nem tudjuk, hogy a paraméteréül átadott SQL utasítás milyen jellegű (select, insert, update, stb), ekkor az execute metódus visszatérési értékének függvényében elágaztathatjuk programunkat a megfelelő feldolgozás érdekében:
    • a getResultSet metódussal juthatunk hozzá az eredménykészlethez
    • a getUpdateCount metódussal juthatunk hozzá a megváltoztatott sorok számához
    • a getMoreResults metódussal lekérhetjük az adatbázis által visszaadott következő komponenst, ha ez eredménykészlet akkor a visszatérési értéke igaz egyébként hamis.
  • executeUpdate – visszatérési értéke egy egész szám mely a megváltoztatott sorok számát jelzi. Akkor érdemes használni, ha tudjuk, hogy a végrehajtandó SQL utasítás adatmanipulációkat fog elkövetni (insert, update, delete). Abban az esetben, ha adatdefiníciós utasítást hajtunk végre (create, drop) a visszatérési érték mindig nulla.
  • executeQuery – visszatérési értéke egy ResultSet objektum mely tartalmazza magát az eredménykészletet. Biztosított, hogy ez az érték soha nem null, még akkor sem, ha a lekérdezés eredménye egyetlen egy sort sem tartalmaz. Ekkor egy üres ResultSet objektumot kapunk.

A Statement bezárása

A Statement objektumot ugyanezen objektum close metódusának megívásával zárhatjuk be melyről minden esetben nekünk kell gondoskodni, különben egy idő után azt fogjuk tapasztalni, hogy elfogyott a memóriánk. A Statement objektum bezárásakor automatikusan bezáródnak az esetlegesen létező ResultSet objektumok is, így azokat nekünk külön nem kell bezárnunk, bár lehetőségünk van rá a ResultSet objektum close metódusának meghívásával.

PreparedStatement

A PreparedStatement interfész a Statement interfészt terjeszti ki újabb tulajdonságokkal melyek lehetővé teszik az előfordított utasítások használatát adatbázisunkban. Míg a Statement interfész alkalmazása esetén minden egyes újabb utasítás végrehajtásának alkalmával át kell adni az adatbáziskezelőnek az utasítás teljes szövegét, illetve az adatbáziskezelőnek fel kell dolgoznia azt, addig a PreparedStatement interfész alkalmazása esetén elegendő ezt egy alkalommal megtenni, majd a későbbiekben – az újbóli használat alkalmával – már csak a paramétereket kell átadni az adatbázisban lévő előfordított utasításnak. Ennek a technológiának az előnyét nyilván akkor tudjuk leginkább kamatoztatni, ha ugyanazt az utasítást ciklikusan többször hajtjuk végre egymás után más-más paraméterekkel, mivel az utasításunk előfordított (csőre töltött) állapotban figyel az adatbáziskezelőben, melynek csak a paramétereit kell megadni és már futtatható is.

PreparedStatement létrehozása

Ezért az SQL utasítás szövegét már a PreparedStatement objektumot létrehozó metódus paramétereként meg kell adni, melyben a paraméterek helyét '?' karakterrel kell kijelölnünk. Ez a paraméter átadódik a PreparedStatement interfészt implementáló osztály konstruktorának, mely továbbítja azt az adatbázis-kezelő felé, amely létrehozza az előkészített utasítást. PreparedStatement objektumhoz a Connection objektum prepareStatement metódus meghívásával juthatunk, melynek – mint ahogy a Statement interfész bemutatásánál láthattuk – szintén többféle típusa van melyekkel speciális, a ResultSet objektummal kapcsolatos tulajdonságokat állíthatunk be.

PreparedStatement futtatása

A PreparedStatement végrehajtása előtt minden kijelölt paramétert inicializálni kell, melyeket a set<típus> kezdetű metódusokkal tehetünk meg úgy, hogy a metódus első paramétereként egy egész számmal hivatkozunk az SQL szövegében kijelölt paraméterre, a metódus második paraméterében pedig megadjuk magát az értéket. A balesetek elkerülése végett, üdvös dolog ha ezt a tevékenységet megelőzi egy clearParameters metódus meghívása, amely törli az összes, korábban beállított értéket. Mindezek után végrehajthatjuk SQL utasításunkat a PreparedStatement objektum execute, executeQuery vagy executeUpdate metódusának megívásával melyeknek különbözőségeiről fentebb írtam.

Egy konkrét példa a PreparedStatement interfész alkalmazására:

PreparedStatement pstmt = con.prepareStatement("INSERT INTO PICTURE (KEP, KOZEPES_KEP, KEP_IDX, SORREND, ALBUM, VISIBLE) VALUES (?, ?, ?, ?, ?, ?)");
pstmt.clearParameters();
pstmt.setBlob(1, sbKep);
pstmt.setBlob(2, sbKozepesKep);
pstmt.setBlob(3, sbKepIndex);
pstmt.setInt(4, sorrend);
pstmt.setString(5, album);
pstmt.setBoolean(6, visible);
pstmt.execute();
pstmt.close();

PreparedStatement bezárása

A PreparedStatement objektum bezárására ugyanazok a szabályok érvényesek mint a Statement objektum bezárására.

      
      
Page viewed times
#trackbackRdf ($trackbackUtils.getContentIdentifier($page) $page.title $trackbackUtils.getPingUrl($page))
  • No labels