ResultSet testreszabása
A modern JDBC API lehetővé teszi az objektumok nagymértékben testreszabását.NyilatkozatÉseredménykészlet. Például a használatávaleredménykészletmódosíthatja a sorokat az adatbázisban.
Egy utasításobjektum létrehozásakor egy csomó kívánságunkat átadhatjuk bele. Ezek a kívánságok három csoportra oszthatók:
- Alapcsatlakozás típusa
- Egyidejű hozzáférés-szabályozás
- Kitartás és tranzakciók
Ezek a paraméterek átadhatók egy objektum létrehozásakorNyilatkozatvagyKészített nyilatkozat. Példa:
Statement statement = connection.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.CLOSE_CURSORS_OVER_COMMIT );
PreparedStatement statement = connection.prepareStatement(sql,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.CLOSE_CURSORS_OVER_COMMIT);
Nem fogjuk ezeket a dolgokat mélyrehatóan tanulmányozni, de szeretném, ha tudná, hogy ez lehetséges, ha valaki más kódjában találkozik hasonlóval.
ResultSet típusok
A ResultSet adott típusú lehet. A típus meghatározza a ResultSet néhány jellemzőjét és képességét.
Nem minden típust támogat minden adatbázis és JDBC-illesztőprogram. Ellenőriznie kell az adatbázist és a JDBC illesztőprogramot, hogy lássa, támogatja-e a használni kívánt típust. A DatabaseMetaData.supportsResultSetType(int type) metódus igaz vagy hamis értéket ad vissza attól függően, hogy az adott típus támogatott-e vagy sem.
A cikk írásakor háromféle ResultSet létezik:
- ResultSet.TYPE_FORWARD_ONLY
- ResultSet.TYPE_SCROLL_INSENSITIVE
- ResultSet.TYPE_SCROLL_SENSITIVE
Az alapértelmezett típus a TYPE_FORWARD_ONLY.
A TYPE_FORWARD_ONLY azt jelenti, hogy a ResultSet csak előre mozgatható. Vagyis csak az 1. sorból, a 2. sorból, a 3. sorból stb. lehet lépni. ResultSetben nem lehet visszafelé haladni: a 9. sorból nem lehet adatokat olvasni a tizedik beolvasása után.
A TYPE_SCROLL_INSENSITIVE azt jelenti, hogy a ResultSet mozgatható (görgethető) előre vagy hátra. Mozoghat az aktuális pozícióhoz képest egy pozícióba, vagy egy abszolút pozícióba.
Az ilyen típusú ResultSet érzéketlen a mögöttes adatforrás változásaira, amíg a ResultSet nyitva van. Azaz, ha a ResultSet egy bejegyzését egy másik szál vagy folyamat megváltoztatja az adatbázisban, az nem fog tükröződni a már megnyitotteredménykészletebből a típusból.
A TYPE_SCROLL_SENSITIVE azt jelenti, hogy a ResultSet mozgatható (görgethető) előre vagy hátra. Mozoghat az aktuális pozícióhoz képest egy pozícióba, vagy egy abszolút pozícióba.
Az ilyen típusú ResultSet érzékeny a mögöttes adatforrás változásaira, amíg a ResultSet nyitva van. Ez azt jelenti, hogy ha a ResultSet egy bejegyzését megváltoztatja az adatbázisban egy másik szál vagy folyamat, akkor az tükröződik a már nyitotteredménykészletebből a típusból.
Egyidejűség
A ResultSet egyidejűsége határozza meg, hogy a ResultSet frissíthető-e vagy csak olvasható.
Egyes adatbázisok és JDBC-illesztőprogramok támogatják a ResultSet frissítését, de nem mindegyik. A DatabaseMetaData.supportsResultSetConcurrency(int concurrency) metódus igaz vagy hamis értéket ad vissza attól függően, hogy az adott párhuzamossági mód támogatott-e vagy sem.
A ResultSet két párhuzamossági szint egyikével rendelkezhet:
- ResultSet.CONCUR_READ_ONLY
- ResultSet.CONCUR_UPDATABLE
A CONCUR_READ_ONLY azt jelenti, hogy a ResultSet csak olvasható.
A CONCUR_UPDATABLE azt jelenti, hogy a ResultSet olvasható és módosítható.
Példa az adatbázisban lévő adatok megváltoztatására
Ezekkel a paraméterekkel vezérelheti a generált utasítást és annak eredménykészletét.
Létrehozhat például egy frissíthető ResultSet-et, és ezzel módosíthatja az adatbázist. Nyilatkozat készítésekor fontos betartani a következő feltételeket:
- csak egy táblázat van megadva
- nem tartalmaz csatlakozási vagy csoportosítási záradékokat
- A lekérdezési oszlopoknak tartalmazniuk kell egy elsődleges kulcsot
Ha a fenti feltételek teljesülnek, a frissített ResultSet használható egy tábla frissítésére az adatbázisban. Kimutatás objektum létrehozásakor a következő paramétereket kell megadnia:
Statement st = createStatement(Result.TYPE_SCROLL_INSENSITIVE, Result.CONCUR_UPDATABLE)
Egy ilyen utasítás végrehajtásának eredménye egy frissíthető eredményhalmaz. A frissítési módszer az, hogy a ResultSet kurzort a frissíteni kívánt sorra mozgatja, majd meghívja az updateXXX() metódust .
Az updateXXX metódus a getXXX() metódushoz hasonlóan működik . Az updateXXX() metódusnak két paramétere van. Az első a frissítendő oszlop száma, amely lehet oszlopnév vagy sorozatszám. A második a frissítendő adat, és ennek az adattípusnak meg kell egyeznie a XXX-el.
A sor tényleges frissítéséhez az adatbázisban meg kell hívni az updateRow() metódust , mielőtt a ResultSet kurzor elhagyná a módosított sort, különben a változtatások nem kerülnek be az adatbázisba.
Új sorokat is hozzáadhat a táblázathoz:
Először a kurzort egy üres sorra kell mozgatnia. Ehhez hívja meg a moveToInsertRow() metódust .
Ezután ki kell töltenie ezt a sort adatokkal az updateXXX() metódussal .
Ezután meg kell hívnia az inserterRow() metódust , hogy hozzáadja a sort az alaphoz.
Végül pedig vissza kell állítania a kurzort a moveToCurrentRow() metódus meghívásával .
Fontos! Nem minden DBMS támogatja ezeket a lehetőségeket a kiterjesztett nyilatkozathoz. Probléma esetén tekintse meg az adott DBMS hivatalos dokumentációját.
GO TO FULL VERSION