• Nem Talált Eredményt

Lekérdezések végrehajtása

In document Programozási technológiák – Jegyzet (Pldal 156-159)

A szerződés alapú tervezés alapelvei

A szerződés

2. Adatbázis-kapcsolatok kezelése

6.5. példa - Két IN és egy INOUT paraméterrel rendelkező tárolt eljárás meghívása

2.4.4. Lekérdezések végrehajtása

Egy lekérdezés végrehajtására a Statement interfész execute metóduscsaládját használhatjuk. Az execute metódus logikai igaz (true) értékkel tér vissza, ha az SQL-utasítás által visszaadott első objektum egy ResultSet. Logikai hamis (false) értéket akkor kapunk, ha az SQL-utasítás egy DML- vagy DDL-művelet.

Elsősorban olyankor használjuk ezt a metódust, ha csak futásidőben dől el, hogy a végrehajtandó művelet lekérdezés vagy egyéb utasítás. Ez például akkor fordul elő, ha egy olyan felhasználói felületet készítünk, ahová lefuttatni kívánt SQL-utasításokat lehet beírni, ami elég tipikus forgatókönyv egy integrált fejlesztőkörnyezet esetén. Másodsorban olyan JDBC-driverek esetén lehet szükség ennek alkalmazására, amelyek támogatják a többszörös eredményhalmazokat (ilyen például az IBM DB2 drivere). Ilyenkor az egyes ResultSet objektumokhoz a getMoreResults és a getResultSet metódusok ismételt hívásával férhetünk hozzá. Az executeQuery metódus csupán egyetlen ResultSet objektummal tér vissza.

Ahogyan arról már volt szó, egy ResultSet egy lekérdezés eredményhalmazát reprezentálja. Mindazonáltal ResultSet objektumot előállíthat bármely olyan objektum, amely implementálja a Statement interfészt, beleértve a PreparedStatement-et, és CallabaleStatement-et (sőt, a RowSet-et is, de ezzel nem foglalkozunk).

Az eredményhalmaz-objektumban lévő adatokhoz egy kurzor segítségével férhetünk hozzá, amely gyakorlatilag egy mutató, amely az eredményhalmaz egy adott sorára mutat. Kezdetben a kurzor az első sor előtt áll. A ResultSet interfész számos metódust definiál a kurzor mozgatására. A leggyakrabban használt a next metódus, amellyel a kurzort eggyel léptethetjük. Amikor a kurzor eléri a ResultSet végét, vagyis az utolsó utáni sorra áll, a next metódus hamis értékkel tér vissza.

...

Statement stmt = conn.createStatement();

ResultSet rs = stmt.executeQuery(query);

Address address = null;

while (rs.next()) {

address = new Address();

address.setId(rs.getInt("ADDRESS_ID"));

address.setCountry(rs.getString("COUNTRY"));

address.setCity(rs.getString("CITY"));

address.setZipCode(rs.getString("ZIP_CODE"));

address.setStreet(rs.getString("STREET"));

address.setHouseNumber(rs.getString("HOUSE_NUMBER"));

resultList.add(address);

} ...

Adatkezelés

A ResultSet objektumokat jellemzi kurzorkezelésük módja, párhuzamos feldolgozási képességük és az, hogy milyen tartósságú kurzorokat kezelnek.

Kurzorkezelés módja

A kurzor kezelése szerint három típust különböztetünk meg:

TYPE_FORWARD_ONLY: az eredményhalmaz nem görgethető. Kurzora csak elölről hátrafelé mozgatható, az első előtti sortól indulva végig az eredményhalmazon, az utolsó utáni sorig. Az eredményhalmaz azokat a sorokat tartalmazza, amelyek kielégítik a lekérdezést annak végrehajtásának pillanatában, vagy amikor azok visszakerülnek a hívóhoz.

TYPE_SCROLL_INSENSITIVE: az eredményhalmaz görgethető. Kurzora léptethető előre- és hátrafelé is, vagy akár egy abszolút pozícióra. Az eredményhalmaz nem érzékeny az adatforrásban bekövetkező változásokra, mialatt nyitva van, vagyis az adatok változása a már megnyitott eredményhalmazokat nem érinti.

TYPE_SCROLL_SENSITIVE: az eredményhalmaz görgethető. Kurzora léptethető előre- és hátrafelé is, vagy akár egy abszolút pozícióra. Az eredményhalmaz „élővé” válik, a háttérben lévő adatforrásban bekövetkező változások hatására automatikusan frissül.

Az alapértelmezett típus a TYPE_FORWARD_ONLY.

Megjegyzés

Nem minden JDBC implementáció támogatja az összes típust. A DatabaseMetaData.supportsResultSetType metódus segítségével megtudhatjuk, hogy az adott típus támogatott-e vagy sem.

A kurzorokra az alábbi műveletek értelmezettek:

next: a kurzort a következő pozícióra mozgatja. Igaz értékkel tér vissza, ha az új pozíció egy sor, és hamis értékkel, ha a pozíció az utolsó sor után található.

previous: a kurzort az előző pozícióra mozgatja. Igaz értékkel tér vissza, ha az új pozíció egy sor, és hamis értékkel, ha a pozíció az első sor előtt található.

first: a kurzort az első sorra mozgatja. Igaz értékkel tér vissza, ha az új pozíció az első sor, és hamis értékkel, ha az eredményhalmaz nem tartalmaz sorokat.

last: a kurzort az utolsó sorra mozgatja. Igaz értékkel tér vissza, ha az új pozíció az utolsó sor, és hamis értékkel, ha az eredményhalmaz nem tartalmaz sorokat.

beforeFirst: az induló pozícióra mozgatja a kurzort, vagyis az első sor elé.

afterLast: a ResultSet végére állítja a kurzort, vagyis az utolsó sor mögé.

relative(int rows): a kurzort annak aktuális pozíciójához képest relatív módon mozgatja el, pozitív paraméterérték esetén a vége felé, negatív paraméterérték esetén az eleje felé lép.

absolute(int row): abszolút pozícionálás, a kurzort pontosan a megadott sorra állítja Párhuzamosság

A ResultSet párhuzamossága határozza meg a módosítási műveletek támogatottsági szintjét. Két párhuzamossági szintet különböztetünk meg:

CONCUR_READ_ONLY: a ResultSet objektum nem módosítható a ResultSet interfész segítségével.

CONCUR_UPDATABLE: a ResultSet objektum módosítható a ResultSet interfész segítségével.

Adatkezelés

Megjegyzés

Nem minden JDBC implementáció támogatja az összes szintet. A DatabaseMetaData.supportsResultSetConcurrency metódus segítségével tudhatjuk meg, hogy az adott szint támogatott-e vagy sem

Ha az eredményhalmaz módosítható (CONCUR_UPDATABLE), frissíthetjük az egyes sorok oszlopaiban tárolt értékeket..Ezt az updateXXX metódusok meghívásával érhetjük el, ahogyan az alábbi példák is mutatják:

result.updateString("name", "Alex");

result.updateInt("age", 55);

result.updateBigDecimal("coefficient", new BigDecimal("0.1323");

result.updateRow();

Ugyanezt a hatást persze oszlopnevek helyett oszlopindexekkel is elérhetjük:

result.updateString(1, "Alex");

result.updateInt(2, 55);

result.updateBigDecimal(3, new BigDecimal("0.1323");

result.updateRow();

Az updateRow metódus meghívásakor a kurzor által mutatott sor értékeivel megtörténik az adatbázis frissítése. Ha ezt a metódust nem hívjuk meg, akkor az updateXXX metódusok által elért hatás csak lokális lesz, az adatbázis tartalma nem frissül! A módosítás természetesen a tranzakciók kezelésére vonatkozó szabályok maximális betartásával történik, vagyis, ha az automatikus véglegesítés kikapcsolt állapotban van, akkor a módosítás hatása a többi tranzakció számára csak egy esetleges commit után válik elérhetővé.

A módosítható eredményhalmaz segítségével új sort is felvihetünk.az alábbi módon:

• először egy ResultSet.moveToInsertRow() hívással egy speciális sorra, az úgynevezett puffersorra lépünk, amelyet addig használhatunk, amíg a sor összes oszlopának adatai nem ismertek,

• az updateXXX metódusok hívásával beállítjuk a puffersor tartalmát,

• és végül a ResultSet.insertRow() metódus meghívásával elvégezzük a beszúrást, majd a kurzort egy érvényes állapotba visszük.

Példa:

result.moveToInsertRow();

result.updateString(1, "Alex");

result.updateInt(2, 55);

result.updateBigDecimal(3, new BigDecimal("0.1323");

result.insertRow();

result.beforeFirst();

Kurzor tartóssága

A Connection interfész commit metódus hívása bezárhatja azokat a ResultSet objektumokat, amelyek az aktuális tranzakció során jöttek létre. Néhány esetben viszont ezt el szeretnénk kerülni. A ResultSet típus tartóssági jellemzője lehetővé teszi, hogy az alkalmazás felügyelje a ResultSet objektum (kurzor) véglegesítéskor történő bezárását.

Egy kurzor tartóssága az alábbi értékek valamelyike lehet:

HOLD_CURSORS_OVER_COMMIT: a kurzor nem záródik be véglegesítéskor, vagyis tartós. A tartós kurzorok használata olyan alkalmazás esetében ideális, amely csak olvasható ResultSet objektumokat tartalmaz.

CLOSE_CURSORS_AT_COMMIT: a kurzor (vagyis a ResultSet objektum) bezáródik a véglegesítéskor.

Az alapértelmezett kurzortartóssági szint adatbáziskezelőrendszer-specifikus.

Adatkezelés

Megjegyzés

Nem minden JDBC implementáció támogatja a tartós és nem tartós kurzorokat. A

DatabaseMetaData.getResultSetHoldability és a

DatabaseMetaData.supportsResultSetHoldability metódusok segítségével kaphatunk információt a tartósság támogatottságáról.

In document Programozási technológiák – Jegyzet (Pldal 156-159)