Java Database Connectivity
A Wikipédiából, a szabad enciklopédiából.
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.
Tartalomjegyzék |
[szerkesztés] Áttekinté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 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ázisszerverenjava.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.
[szerkesztés] Példa
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[1].
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ó.
[szerkesztés] Kivétel (java.sql.SQLException)
Ha valamilyen adatbázismű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 loggolá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.
[szerkesztés] JDBC driverek
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.
[szerkesztés] Típusok
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 – hálózati protokoll driver
- Type 4 – natív protokoll driver