Ebben a cikkben a Java Database Connectivity témáját és annak mai társadalmunkra gyakorolt hatását fogjuk feltárni. A Java Database Connectivity egy olyan skin, amely a szakértők és a rajongók figyelmét egyaránt felkeltette, és relevanciája az elmúlt években csak nőtt. Ebben a cikkben a Java Database Connectivity különböző aspektusait fogjuk megvizsgálni, a történetétől és fejlődésétől a mai világra gyakorolt hatásaiig. Reméljük, hogy részletes elemzésünkkel megvilágítjuk ezt a témát, és mélyebben megérthetjük olvasóinkat a Java Database Connectivity-ről és annak fontosságáról a modern világban.
| 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.
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 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.
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ó.
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.
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.
A legtöbb relációs adatbázisszerverhez léteznek driverek. Ezeket a következő módon tipizálják: