A szerződés alapú tervezés alapelvei
A szerződés
2. Adatbázis-kapcsolatok kezelése
2.3. A JDBC API főbb elemei
Ebben a szakaszban a JDBC API főbb interfészeinek és osztályainak a rövid bemutatása történik meg.
6.12. ábra - A fő JDBC osztályok és interfészek és üzeneteik
Adatkezelés
• DriverManager: Ez az osztály adatbázis-meghajtók kezelésére szolgál. A DriverManager egy Java alkalmazásból egy úgynevezett JDBC URL segítségével érkező kérésre az alprotokollon keresztül választja ki a megfelelő meghajtót a kapcsolat létrehozásához. Az adatbázis-kapcsolat az első olyan meghajtó segítségével jön létre, amely úgy nyilatkozik, hogy felismeri a jdbc protokoll alatt lévő alprotokollt.
Megjegyzés
Egy JDBC URL általános szerkezete a következő:
<protokoll>:<alprotokoll>:<alnév>
A protokoll értéke a JDBC-specifikáció szerint mindigjdbc.Az alprotokoll segítségével a meghajtó, illetve a kapcsolódási mechanizmus azonosítható, míg az alnév azon információkat tartalmazza, amelyek az adatbázis-hozzáférés kiépítéséhez szükségesek (gépnév, annak a portnak a száma, amelyen a kapcsolódásfigyelő várakozik a kapcsolatokra, stb.). Általában azt mondhatjuk, hogy az alprotokoll a DriverManager-nek szól, hogy ez alapján válassza ki a meghajtóprogramot, míg az alnév már a kiválasztott Driver-nek szól, hogy megtudja, milyen paraméterekkel építhati ki a kapcsolatot. Az alnév felépítése gyártófüggő.
Példa néhány JDBC URL-re:
• Oracle Database:
• jdbc:oracle:thin:@servername.inf.unideb.hu:1521:ORCL
Itt az oracle:thin rész az alprotokoll, ez azonosítja, hogy az Oracle gyártó úgynevezett vékony (thin) meghajtóprogramjára van szükség, amely az Oracle 4-es típusú JDBC-meghajtóprogramja. Az URL további része a szükséges kapcsolódási adatokat – szervernév, port és példányazonosító (SID) –tartalmazza (a felhasználói név és a jelszó nélkül, habár az is belekódolható az URL-be, például a scott nevű, tiger jelszavú felhasználó esetén:
jdbc:oracle:thin:scott/tiger@servername.inf.unideb.hu:1521:ORCL).
• jdbc:oracle:oci8:@TEST
Adatkezelés
Ebben az esetben az alprotokoll az oracle:oci8, amely az Oracle 2-es típusú JDBC-driverét azonosítja. Ennek használatához az Oracle Client szoftver kliensoldali telepítésére is szükség van, és ekkor a kapcsolódási információként az alnévben megadott TEST azonosító a vastag kliens tnsnames.ora állományának egyik bejegyzését azonosítja (ez a bejegyzés részletezi a kapcsolódási adatokat).
• MySQL: jdbc:mysql://servername.inf.unideb.hu:3306/dbname
Az alprotokoll a mysql, az alnév pedig a szervernevet, a portot és annak az adatbázisnak a nevét tartalmazza, amelyhez kapcsolódni szeretnénk.
• PostgreSQL: jdbc:postgresql://servername.inf.unideb.hu:5432/dbname
Ugyanaz, mint a MySQL esetén, leszámítva, hogy az alprotokoll neve mysql helyett postgresql.
• IBM DB2:
• jdbc:db2://servername.inf.unideb.hu:50000/SAMPLE A DB2 4-es típusú drivere esetén.
• jdbc:db2:sample
A DB2 2-es típusú drivere esetén.
• MS SQL Server:
jdbc:sqlserver://localhost:1433;databaseName=AdventureWorks;integratedSecurit y=true;
Az alprotokoll az sqlserver névre hallgat.
• SQLite: jdbc:sqlite:///COMPUTERNAME/shareA/dirB/dbfile
• Driver: Ez az interfész az adatbázisszerverrel történő kommunikáció kezeléséért felelős. Általában nem közvetlenül használjuk az implementáló osztályokat: ez a felelősség a fent említett DriverManager osztályé.
• Connection: Ez az interfész az adatbázissal kiépített kapcsolatot reprezentálja; egy kommunikációs környezetet biztosít.
• Statement, PreparedStatement, CallableStatement: Olyan interfészek, amelyek egy-egy végrehajtandó SQL-utasítás absztrakciói (utasításobjektumok). A felírás sorrendjében szülő-gyermek viszonyban állnak egymással. A PreparedStatement interfész segítségével paraméterezhető SQL-utasítások létrehozását, míg a CallableStatement segítségével adatbázisban tárolt alprogramok hívását (amelyeknek természetesen paraméterek is átadhatók) végezhetjük.
• ResultSet: Ez az interfész tartalmazza az utasításobjektumok segítségével végrehajtott lekérdezés eredményrelációját (vagyis a lekérdezés eredményhalmazának absztrakciójáról van szó), amelynek tetszőleges számú sora (nulla, egy vagy több) lehet, attól függően, hogy a lekérdezés feltételeinek hány rekord felelt meg. A ResultSet objektum iterátorként viselkedik az eredményhalmaz sorainak bejárásakor. Egy időben csak egy sort dolgozhatunk fel, amelyre egy kurzor mutat. A kurzor egy olyan mutató, amely az aktuális sort azonosítja. Közvetlenül a lekérdezés végrehajtását követően a létrejövő kurzor az első sor elé mutat, függetlenül a eredményreláció számosságától. Az eredményhalmazt az elejétől a végéig bejárhatjuk a kurzor segítségével, vagyis az API metódust biztosít a kurzor léptetésére.
Egy eredményhalmaz alaphelyzetben egyszer, egyirányban, szekvenciális módon járható be, azonban már a JDBC 2 óta van mód ennek az alapértelmezésnek a felülírására, vagyis lehetőség van egy eredményhalmaz nem csak az elejétől a vége felé járhatunk be, hanem fordítva is, a végéről az eleje felé haladva, illetve tetszőlegesen is pozícionálhatunk az ereményhalmaz rekordjai között.
• SQLException: Az adatbázis-műveletek végrehajtása során bekövetkező hibákat reprezentáló kivételosztály.
Implementálja az Iterable interfészt, amely lehetővé teszi, hogy az adatbázis oldalon létrejövő kivételek
Adatkezelés
• DatabaseMetaData: Az adatbázis-kezelő rendszerek nemcsak a felhasználók adatait tárolják, de többek között információt nyújtanak az adatok szerkezetéről, tárolási és hozzáférési módjáról is. Ez utóbbi adatok nevezzük metaadatoknak (adatokról szóló adatok). A metaadatbázisban (vagy katalógusban) tárolt információk, azok szervezési és kinyerési módja adatbázis-kezelőről adatbázis-kezelőre változhat. Éppen ezért a JDBC biztosítja a DatabaseMetaData interfészt, amelyet a meghajtó írójának (vagyis az adatbázis-kezelő gyártójának) kötelezően implementálnia kell, így szabványos módon férhetünk hozzá az adatbázis metaadataihoz.
• ResultSetMetaData: Nem minden esetben ismerjük a program írásakor, hogy az egyes SELECT-utasítások által visszaadott eredményhalmazok milyen szerkezetűek (gondoljunk különösen a SELECT * FROM táblanév alakú lekérdezésekre, amely eredményhalmazának a szerkezete az oszlopok létrehozását illetve törlését végző DDL-utasítások hatására is megváltozhat). A ResultSetMetaData interfész segítségével a lekérdezés eredményének többek között olyan metaadataihoz férhetünk hozzá, mint amilyen az eredményhalmaz oszlopainak száma és az egyes oszlopok neve és típusa.
A leggyakoribb műveletek a JDBC API használatakor természetesen DML utasítások, vagyis a SELECT, az INSERT, a DELETE, és az UPDATE, de lehetőség van DDL-utasítások (például CREATE TABLE, DROP TABLE és ALTER TABLE) végrehajtására is. A főbb típusokat (az SQLException kivételével, amelyet tulajdonképpen bármelyik típus metódusai kiválthatnak) a közöttük lévő viszonyokkal az alábbi osztálydiagram szemlélteti: