Adatbázis-kezelés Jávában

A JDBC könyvtár
A könyvtár rétegei
Program vagy programka
Adatbázisok címzése
A JDBC-rõl programozóknak
Egy egyszerû példaprogram
A JDBC osztályok
Adattípusok
Tranzakciók
Forgalomban lévõ termékek
Egyéb adatbázis fejlesztések

A Jáva környezet terjedésében jelentõs szerepet játszhat, hogy a programozók milyen szabványos, minden platformon implementált könyvtárakat használhatnak. Már a JDK kezdeti változata is tartalmaz néhány jól használható könyvtárat, mint pl. a hálózatkezelés (java.net), programkák (java.applet) vagy a kezelõi felületek (java.awt) támogatása. Azonban komoly üzleti programok írásához óhatatlanul az adatbázis-kezelés támogatására is szükség van.

 Az adatbázisok kezelésére szolgáló JDBC (Java Database Connection) könyvtár bekerül az év végén megjelenõ JDK 1.1-es változatába, azaz alap-könyvtárrá válik, azaz a programozók minden architektúrán számíthatnak a könyvtár meglétére. A JDBC érdekes, és remélhetõleg gyakran követésre találó módon született. A korai specifikációt közzétették az Internet-en és azt a befutott megjegyzéseket figyelembe véve, csak többszörös módosítás után véglegesítették. Azóta a JavaSoft a specifikációnak eleget tevõ implementációt is közzétett, sõt nagy tempóban dolgoznak a független implementációkat tesztelõ készleten is.

A JDBC könyvtár

A JDBC-t adatbázisok elérésének alacsony szintû, közvetlenül az SQL utasítások szintjét használó könyvtárnak szánták. A könyvtár tervezésénél nem kellett teljesen új dolgokat kitalálni, a tervezõk az X/OPEN konzorcium SQL CLI (Call Level Interface) specifikációjából indultak ki, amely nagyon hasonló az ipari szabványnak tekinthetõ ODBC (Open Database Connectivity) specifikációhoz. Ettõl lényegében csak a Jáva nyelv C-tõl eltérõ sajátosságainak - objektumorientáltság, mutatók hiánya - figyelembe vétele miatt tértek el. Egyébként a JDBC - legalábbis a felsõ rétege - nem egyszerûen az ODBC hívási felületének becsomagolása, hanem teljesen Jávában implementálódott, így az implementáció megõrizte a Jáva kód architektúra-függetlenségét, hordozhatóságát.

 Bár a JDBC módszerei segítségével tetszõleges SQL utasításokat, sõt bármilyen szöveges parancsot el lehet juttatni az adatbázis-kezelõnek, de a fejlesztés alatt álló teszt készlet megköveteli, hogy az adatbázis legalább az ANSI SQL92 alapszintû (Entry Level) specifikációját támogassa. Amennyiben az adatbázis-kezelõ megengedi, lehetõség van az adatbázis-kezelõn tárolt eljárások hívására is.

A könyvtár rétegei

A könyvtár lényege, az ún. JDBC menedzser tulajdonképpen 2 felületet specifikál. A felsõ felülete az a programozói interfész, amely segítségével a programozók elérhetik az adatbázis szolgáltatásait. A menedzser alsó szintje viszont a különbözõ adatbázisok elérését megvalósító meghajtó programok implementációjánál játszik szerepet.

 

A meghajtók implementálására több mód kínálkozik. Készülhet olyan meghajtó, amely valamilyen gyártó specifikus módon kommunikál az adatbázis-kezelõvel. Másik módszer, hogy egy már meglévõ, szabványos ODBC meghajtót megfejelnek egy vékony réteggel, amely a kívánt specifikációra konvertálja az ODBC felületet. Lehetõség kínálkozik arra is, hogy valamilyen nyilvános, általános protokollon keresztül kapcsolódjunk egy adatbázis-kezelõhöz. E két utóbbi megoldás elõnye, hogy több gyártó adatbázisát is ugyanazon meghajtó szolgálhatja ki, igaz viszont, hogy általában kissé lassabban, mintha specifikus meghajtót használnánk.

Program vagy programka

A JDBC szolgáltatásait mind programok, mind programkák felhasználhatják. A Jáva programokkal nincs is különös baj, a Jáva biztonsági szempontból nem törõdik különösebben velük, minden olyan, mint egy nem Jávás program esetében. Azonban a programkákból használt JDBC esete bonyolultabb. Egyrészt a programkák a helyi rendszerben tárolt információkat nem érhetnek el, tehát sem az adatbázis-kapcsolatok konfigurálását nem lehet helyi állományokban megoldani, sem a felhasználók helyi rendszerbeli azonosítását (pl. Unix UID, User Identifier) nem lehet felhasználni. Másrészt a hálózaton keresztüli adatbázis kapcsolatra ki kell terjeszteni a programkáknál szokásos szigorú megszorításokat: egy programka csak azon a szerveren lévõ adatbázishoz kapcsolódhat, ahonnan letöltõdött, sõt, ha a meghajtót is a hálózatról töltötték le, akkor ez is csak a forrás gépen lévõ adatbázisok elérésére használható.

 Ezeken a megszorításokon csak a "megbízható" - digitálisan aláírt - programkákkal lehet majd túllépni, no meg az ún. háromlépcsõs (three tiers) kliens-szerver rendszerekkel, ahol a programka a közbülsõ szerverrel tartja a kapcsolatot, amelyik az adatbázis igényeket szétosztja esetleg több gépen elszórt szerverek között.

 Megjegyzendõ, hogy a JDBC nem foglalkozik az ügyfél program és az adatbázis-kezelõ közötti adatátvitel titkosításával, ez a meghajtó feladata, felelõssége.

Adatbázisok címzése

A JDBC programokban az adatbázisokra a Hálón már ismert, kibõvített URL (Uniform Resource Locator) szintaxissal lehet hivatkozni:
jdbc:<alprotokoll>:<adatbázis hivatkozás>

Az alprotokoll neve a meghajtók kiválasztásánál játszhat szerepet, hiszen a JDBC egyes kapcsolatokhoz más-más meghajtót használhat. Az adatbázis hivatkozás pedig már meghajtó specifikus szöveg lehet, bár az ajánlások szerint ahol lehet, használjuk a szokásos URL szintaxist. Például a

jdbc:odbc:employee;UID=scott;PWD=tiger

egy ODBC feletti meghajtó használatát írja elõ az employee adatbázishoz, kiegészítõ paraméterként megadva a felhasználó nevét és jelszavát, míg a

jdbc:dbnet://vala.hol.com:2100/records

a vala.hol.com gép 2100-as kapuját használva a records adatbázisra hivatkozik, az általános hálózati protokollt használó meghajtón keresztül.

A JDBC-rõl programozóknak

Egy egyszerû példaprogram

A példaprogramunk az Oracle adatbázisoknál jól ismert - dolgozói EMP és a részlegeket leíró DEPT - táblákat használja. A programunk kiírja az összes olyan dolgozó azonosító számát (EMPNO), nevét (ENAME) és a részlegének nevét (DNAME), akik a paraméterben megadott városban (lévõ részlegben) dolgoznak. A táblák részletes ismertetése helyett csak annyit jegyzek meg, hogy a feladat megoldásához a két táblát össze kell kapcsolni (join), hiszen a részleg címe csak a DEPT táblában van tárolva. A két tábla között a részleg száma (DEPTNO) teremt kapcsolatot, amely a DEPT tábla kulcsa, az EMP táblában pedig külsõ kulcs. Megnyitunk egy kapcsolatot az ODBC protokoll segítségével az employees adatbázishoz. A nyitott kapcsolathoz hozzárendelünk egy ún. elõkészített parancsot. A parancs tartalmazza az SQL SELECT utasítást, amely az eredmény oszlopait elõállítja. Az SQL parancsban kérdõjel jelzi a megadandó paraméter helyét, ezt a setString módszerrel definiáljuk. A parancsot végrehajtva az eredményekhez egy ResultSet típusú objektumon keresztül férhetünk hozzá. A next() módszer az eredmény tábla következõ sorát készíti elõ. Egy while ciklusban végigfutunk a sorokon. A ciklusban az eredmény aktuális sora egyes oszlopainak értékéhez a getXXX módszerek segítségével férhetünk hozzá, ahol az XXX egy Jáva, vagy JDBC adattípus neve. Az értékeket kiírjuk a szabványos kimenetre. A példaprogram elég lezseren kezeli a futás közben esetleg elõforduló kivételeket, minden lehetséges kivételt egy kalap alá véve egyszerûen kiírjuk az elõforduláskor érvényes hívási láncot, majd kilépünk. Egy "tisztességes" programban ennél szelektívebben illene a kivételekkel bánnunk. Az összes sor kiírása, vagy egy hiba bekövetkezése után lezárhatjuk az utasítást és mivel a programban más parancsot nem akarunk végrehajtani, lezárjuk az adatbázis kapcsolatot is. Ennyi az egész. A program persze szándékosan egyszerû, de a legfontosabb lépéseket illusztrálja:
  1. kapcsolat kiépítése egy adatbázishoz;
  2. SQL parancs elõkészítése, esetleg kívülrõl paraméterek megadása;
  3. a parancs végrehajtása;
  4. az eredmény tábla soronkénti feldolgozása;
  5. a szükséges lezárások.

A JDBC osztályok

Az egyes fontosabb JDBC osztályokat és kapcsolatukat a következõ ábra szemlélteti:

 

Az itt ábrázolt osztályok segítségével a felhasznált adatbázisok szerkezetének ismeretében a leggyakoribb mûveletek könnyen végrehajthatók, de a JDBC definiál az adatbázisok szerkezetének - például táblái nevének, az oszlopai nevének és típusának -, mûködési paramétereinek megállapítására szolgáló osztályokat is.

Adattípusok

A JDBC meghajtók az SQL adattípusokat lehetõség szerint a szokásos Jáva adattípusokká konvertálják. Ezek a típusok használhatók az egyes oszlopok elérésénél a getXXX(int index), illetve az SQL utasításba bejuttatható setXXX(int index, Object obj) eljárásoknál. Csak a dátum- és idõkezelésnél, illetve a numerikus adatok fix precizitásának megtartása miatt definiáltak új osztályokat.

 

SQL típus Jáva típus 
CHAR  String 
VARCHAR  String 
LONGVARCHAR  java.io.InputStream 
NUMERIC  java.sql.Numeric 
DECIMAL  java.sql.Numeric 
BIT  boolean 
TINYINT  byte 
SMALLINT  short 
INTEGER  int 
BIGINT  long 
REAL  float 
FLOAT  float 
DOUBLE  double 
BINARY  byte[] 
VARBINARY  byte[] 
LONGVARBINARY  java.io.InputStream 
DATE  java.sql.Date 
TIME  java.sql.Time 
TIMESTAMP  java.sql.Timestamp 
Látható, hogy a két LONG típus használatánál a Jáva programozó az akár több MByte-nyi visszaadott értékeket állományszerûen, Jáva stream-eken keresztül kezelheti.

Tranzakciók

Az adatbázis meghajtók alapállapotban az adatbázisokat AUTOCOMMIT módban használják, azaz a táblákat módosító utasítások azonnal érvényre jutnak, de mint a meghajtó sok egyéb mûködésmódja, ez is módosítható, ilyenkor programból kell kiadni a Connection.commit() vagy Connection.rollback() hívásokat.

Forgalomban lévõ termékek

Már jelenleg is tucatnyi cég forgalmaz JDBC meghajtókat, de ezek száma napról napra bõvül, az igazán nagy adatbázisrendszerek gyártóinak implementációi még nem hozzáférhetõk. Így is minden lehetséges típusú meghajtóra található példa. JavaSoft a JDBC implementációval együtt szabadon hozzáférhetõvé tett egy JDBC-ODBC áthidaló meghajtót, de létezik jó néhány általános hálózati protokollt használó meghajtó implementáció is. A barkácsolók figyelmébe ajánlom, hogy a közkedvelt és ingyenes mSQL-hez is van már JDBC meghajtó.

Egyéb adatbázis fejlesztések

A JDBC alacsony szintû könyvtárnak készült, de ezzel JavaSoft még nem tartja befejezettnek az adatbázisok környéki fejlesztéseket. Készülõdik és az év végére ígérnek olyan könyvtárat, amely Jáva osztályokat automatikusan leképzi adatbázis táblákra (Java Object-Relational Mapping). Tervezik már az elosztott tranzakciók kezelését megvalósító Java Transaction Service könyvtárat is.

A relációs adatbázis-kezelésen túl a Jáva objektumorientáltsága kínálja az objektumorientált adatbázisok felé nyitást. A már bejelentett objektum sorosítás (object serialization) könyvtár segítségével egyszerû perzisztens objektumokat lehet létrehozni, de készül az ODMG (Object Database Management Group) által specifikált objektumorientált adatbázis-felület Jávához illesztése is. 


Kiss István

  updated: 97/05/01, http://www.eunet.hu/infopen/cikkek/java/jdbc.html 1