Java Database Connectivity

A Wikipédiából, a szabad enciklopédiából
(JDBC szócikkből átirányítva)
JDBC
Programozási nyelv Java
Operációs rendszer multi-platform
Platform Java virtuális gép
Kategória Data access API
A JDBC weboldala

A Java Database Connectivity, röviden JDBC egy API a Java programozási nyelvhez, amely az adatbázishozzáférést támogatja. A JDBC definiálja az adatbázisok lekérdezéséhez és módosításához szükséges osztályokat és metódusokat. A relációs adatmodellhez igazodik.

A Standard Edition és az Enterprise Edition egyaránt tartalmazza a JDBC-t a specifikáció részeként. A Sun terjeszt egy zárt forráskódú ODBC implementációt is a Standard Edition részeként, amellyel minden ODBC-kompatibilis adatbázishoz lehet kapcsolódni.

Áttekintés[szerkesztés]

A JDBC már az 1.1 verziótól kezdve a Standard Edition része. A vonatkozó osztályokat a java.sql csomag tartalmazza. A 3.0 verziótól kezdve a fejlesztés a Java Community Process keretében történik.

  • A JDBC 3.0 verziót a JSR 54 definiálja és a J2SE 1.4 kiadás részét képezi.
  • A JDBC rowset kiterjesztést a JSR 112 fogalmazza meg.
  • A JDBC 4.0 verziót a JSR 221 specifikálja és a Java SE 6 kiadás része.
  • A JDBC 4.1-t a JSR 221 karbantatási kiadás 1 specifikálja[1] és része a Java SE-nak.[2]
  • A legfrissebb verzió a JDBC 4.2, JSR 221 karbantatási kiadás 2 specifikálja[3] és része a Java SE 8-nak.[4]

A JDBC lehetővé teszi több implementáció létezését és használatát egy alkalmazáson belül. Az API biztosít egy mechanizmust a megfelelő java csomagok betöltésére és regisztrálására az úgynevezett Driver Manager-en keresztül. A Driver Manager az objektumorientált programozás tervezési mintái szerint egy factory amely adatbáziskapcsolatokat gyárt.

Az adatbáziskapcsolatot a java.sql csomag Connection osztálya reprezentálja. Ezekkel SQL kifejezéseket lehet készíteni és futtatni. Az SQL kifejezéseket a Statement illetve a PreparedStatement osztályok reprezentálják. A kifejezések lehetnek lekérdező SELECT kifejezések vagy módosító CREATE, INSERT, UPDATE és DELETE kifejezések, de lehetőség van tárolt eljárások futtatására is a java.sql.CallableStatement osztállyal:

  • java.sql.Statement – a kifejezés végrehajtódik az adatbázisszerveren
  • java.sql.PreparedStatement – a kifejezés cache-elődik majd az adatbázisszerver optimalizál neki egy execution path-et, így többször, hatékonyabban lehet futtatni.
  • java.sql.CallableStatement – az adatbázis tárolt eljárásainak futtatására.

A módosító kifejezések, tehát az INSERT, az UPDATE és a DELETE futtatása csak egy int típusú egész számot ad vissza, ami azt mondja meg, hány sorra hatottak a változások. A lekérdező kifejezések az eredményt egy ResultSet objektum formájában adják vissza, ami a relációs adatmodellben egy relációnak felel meg. Ennek a relációnak a sorai iteratívan lekérdezhetőek. Az objektum ezen kívül metaadatokat is tartalmaz, amelyek az oszlopok neveit és típusát adják meg.

Az alap API-hoz létezik egy kiegészítés is a javax.sql csomagban, amivel pozicionálni is lehet az eredményhalmazban és kurzorokat is lehet használni többek között.

Példa[szerkesztés]

A használt adatbázisszerver JDBC driver-ét a java.lang.Class.forName(String) metódussal lehet betölteni. Az alábbi programsor valami jdbc forgalmazó driverét tölti be az alkalmazásba. (Egyes virtuális gépek megkövetelik a Driver objektum példányosítását is a .newInstance() metódussal.)

Class.forName( "com.valamijdbcforgalmazo.ValamiJdbcDriver" );

A JDBC 4.0 verziótól már nem kell explicit betölteni a JDBC drivert a Class.forName() metódussal.[5]

Miután a virtuális gép betöltötte a java.sql.Driver osztályt, példányosítja azt és regisztrálja a java.sql.DriverManager.registerDriver(Driver) metódussal. Ezt a példányosító és regisztráló kódot a driver gyártójának kell implementálnia a driver osztály statikus konstruktorában.

A következő lépés az adatbáziskapcsolat létrehozása egy Connection példány formájában a DriverManager.getConnection() metódus segítségével:

Connection conn = DriverManager.getConnection(
     "jdbc:valamijdbcforgalmazo:további adatok a jdbc forgalmazótól függően",
     "felhasznalonev",
     "jelszo" );

Az URL mindig a „jdbc:” karaktersorozattal kezdődik, a többi része a forgalmazótól függ. Ha megvan az adatbáziskapcsolat, akkor létre lehet hozni az SQL kifejezést:

Statement stmt = conn.createStatement();
try {
    stmt.executeUpdate( "INSERT INTO MyTable( name ) VALUES ( 'Rob' ) " );
} finally {
    // Fontos lezárni a kifejezést!
    stmt.close();
}

A JDBC objektumok lezárása nagyon fontos, mert az adatbáziskapcsolatok, kifejezések és eredményhalmazok erőforrásokat, például socket-eket és file descriptorokat, foglalnak le az operációs rendszerben. Távoli szerver esetében a szerveren kurzorokat is lefoglalhatnak. A nyitva felejtett objektumok váratlan és zavarbaejtő hibákhoz vezethetnek. A JDBC objektumok használatakor ajánlatos követni az alábbi try-finally mintát:

Statement stmt = conn.createStatement();
try {
    ResultSet rs = stmt.executeQuery( "SELECT * FROM MyTable" );
    try {
        while ( rs.next() ) {
	    // Sorfeldolgozás.
        }
    } finally {
        rs.close();
    }
} finally {
    stmt.close();
}

A PreparedStatement használata hasonlít a Statement használatához, de dinamikusan paraméterezhető:

PreparedStatement ps = conn.prepareStatement( "SELECT i.*, j.* FROM Omega i, Zappa j WHERE i = ? AND j = ?" );
try {
    ps.setString(1, "Poor Yorick");
    ps.setInt(2, 8008);
    ResultSet rs = ps.executeQuery();
    try {
        while ( rs.next() ) {
	    // Sorfeldolgozás.
        }
    } finally {
        rs.close();
   }
} finally {
   ps.close();
}

Az alábbi SQL típusokra lehet konvertálni változókat a Java nyelvből:

Oracle típus setXXX()
CHAR setString()
VARCHAR2 setString()
NUMBER setBigDecimal()
setBoolean()
setByte()
setShort()
setInt()
setLong()
setFloat()
setDouble()
INTEGER setInt()
FLOAT setDouble()
CLOB setClob()
BLOB setBlob()
RAW setBytes()
LONGRAW setBytes()
DATE setDate()
setTime()
setTimestamp()

Tárolt eljárásos példa a CallableStatement használatával az API dokumentációjában található.

Kivételek[szerkesztés]

Ha valamilyen adatbázis művelet sikertelen, az java.sql.SQLException kivételt vált ki. Általában programkódból nem lehet sokat tenni az ilyen hibáknál a naplózáson kívül. Népszerű gyakorlat az ilyen kivételeknél alkalmazásszintű kivételt kiváltani, ami adott esetben a tranzakció visszavonását és a felhasználó értesítését eredményezheti.

JDBC driverek[szerkesztés]

A driver nem más, mint egy kliensoldali adapter, amely a java program kéréseit átalakítja az adatbázisszerver által értelmezhető formára.

Típusok[szerkesztés]

A legtöbb relációs adatbázisszerverhez léteznek driverek. Ezeket a következő módon tipizálják:

  • Type 1 – JDBC-ODBC híd
  • Type 2 – natív driver
  • Type 3 – pure java, hálózati protokoll driver
  • Type 4 – pure java, natív protokoll driver

Források[szerkesztés]