Java Database Connectivity

Technology
12 hours ago
8
4
2
Avatar
Author
Albert Flores

Java Database Connectivity (známé spíše jako JDBC) je API pro programátory v programovacím jazyku Java, které definuje jednotné rozhraní pro přístup k relačním databázím. JDBC je součástí Javy SE („Standard Edition“) od JDK 1.1. Pro přístup ke konkrétnímu databázovému serveru je potřeba JDBC driver (ovladač), který poskytuje tvůrce databázového serveru.

Úvod

JDBC API vzniklo jako vrstva mezi Java aplikací a vlastní komunikací s databází. Datové typy SQL lze získat z výsledku SQL dotazu jako instance Java tříd a s těmi pracuje aplikace. +more Naopak JDBC ovladač (driver) dokáže vkládat instance Java tříd do SQL dotazů a správně, v závislosti na zvolené databázi, je uložit, upravit apod. Takto lze vytvořit aplikaci nezávislou na zvoleném databázovém stroji. Nicméně je stále potřeba psát dotazy v SQL - naproti tomu stojí Hibernate.

Historie a implementace

JDBC bylo poprvé uveřejněno společností Sun Microsystems jako součást JDK 1. 1 19. +more února 1997. Od té doby je standardní součástí Java Standard Edition. Třídy knihovny JDBC jsou uloženy v balíčku knihoven jazyka Java [url=http://download. oracle. com/javase/6/docs/api/java/sql/package-summary. html]java. sql[/url] a [url=http://download. oracle. com/javase/6/docs/api/javax/sql/package-summary. html]javax. sql[/url].

Od verze 3. 0 je JDBC vyvíjen pod hlavičkou Java Community Process. +more JSR 54 obsahuje specifikaci pro JDBC 3. 0 (který je součástí J2SE 1. 4), JSR 114 specifikuje implementaci rozhraní Rowset v JDBC a JSR 221 je zahrnuje specifikaci pro JDBC 4. 0, jako součást Java SE 6.

Funkčnost

JDBC umožňuje paralelní použití několika implementací v jediné aplikaci. API poskytuje možnost dynamického načtení příslušných Java knihoven a jejich registraci pomocí JDBC Driver Manager. +more Driver Manager obsahuje tovární metodu pro vytvoření připojení s databází přes JDBC. Připojení k databázi přes JDBC umožňuje tvorbu a vykonání jednotlivých příkazů. Patří mezi ně SQL příkazy pro modifikaci dat: CREATE, INSERT, UPDATE a DELETE a také dotazovací příkaz SELECT. JDBC připojení také umožňuje přístup k uloženým procedurám. Používání jednotlivých příkazů je specifikováno v následujících rozhraních: * [url=https://web. archive. org/web/20110317093557/http://download. oracle. com/javase/1. 4. 2/docs/api/java/sql/Statement. html]Statement[/url] - příkaz je vždy odeslán databázovému serveru * [url=https://web. archive. org/web/20110317054154/http://download. oracle. com/javase/1. 4. 2/docs/api/java/sql/PreparedStatement. html]PreparedStatement[/url] - příkaz je uložen a následně je stanoven postup pro jeho vykonání přímo na databázovém serveru. Toto rozhraní umožňuje několikanásobné vykonání stejného příkazu efektivním způsobem. * [url=https://web. archive. org/web/20110310090436/http://download. oracle. com/javase/1. 4. 2/docs/api/java/sql/CallableStatement. html]CallableStatement[/url] - používá se pro vykonání uložené procedury nad databází.

Příkazy pro modifikaci dat jako INSERT, UPDATE a DELETE vrací hodnotu, která uvádí, kolik řádků bylo v databázi pozměněno. Tyto příkazy dále nevrací žádnou další informaci.

Dotazovací příkazy vrací JDBC řádek s množinou výsledků. Řádek s množinou výsledků se používá k přenesení množiny výsledků. +more Jednotlivé sloupce jsou v řádku označeny pomocí jména nebo čísla sloupce. Množina výsledků může obsahovat libovolný počet řádků. Dále také obsahuje metadata, která identifikují jména jednotlivých sloupců a jejich datových typů.

Rozšíření pro základní verzi JDBC API je obsaženo v knihovně [url=http://download.oracle.com/javase/6/docs/api/javax/sql/package-summary.html]javax.sql[/url].

Připojení přes JDBC jsou většinou zprostředkovány pomocí návrhového vzoru fond (anglicky connection pool), zřídkakdy jsou získány přímo skrze ovladač. Příklady připojovacích fondů jsou například: * [url=http://jolbox. +morecom/]Bone CP[/url] * [url=http://sourceforge. net/projects/c3p0/]C3PO[/url] * [url=http://commons. apache. org/dbcp/]DBCP[/url].

Přístup k databázi

Identifikace databáze se děje na základě URI, Unified Resource Identifier. Formát tohoto URI je závislý na zvoleném JDBC driveru:

Příklady JDBC URI: * MySQL: jdbc:mysql://server/jméno_databáze?characterEncoding=UTF-8 * Sybase: jdbc:sybase:Tds:server:port/jméno_databáze * IBM AS400: jdbc:as400://server/jméno_databáze * Oracle: jdbc:oracle:thin:@server:port:jméno_databáze

JDBC driver je klientský adaptér, který převádí požadované příkazy z Java aplikací do protokolu, který využívá Systémem řízení báze dat.

Typy

Existují jak placené tak freeware ovladače použitelné pro většinu relačně databázových serverů. Každý jednotlivý ovladač je možno zařadit do jednoho z následujících typů: * Typ 1, který zavolá původní kód lokálně přístupného ODBC driveru. +more * Typ 2, který zavolá původní knihovnu od výrobce příslušného databázového systému přímo na straně klienta. Tento kód poté komunikuje s danou databází pomocí sítě. * Typ 3, ovladač výhradně určený pro Javu, který komunikuje se serverovou stranou pomocí prostředníka, který dále komunikuje s příslušnou databází. * Typ 4, ovladač výhradně určený pro Javu, který využívá původní databázový protokol.

Mimo jiné existuje také tzv. internal JDBC driver, který je spolu s JRE zařazený v SQL databázích přístupných pro Javu. +more Tento ovladač se používá pro Java uložené procedury. Zmíněný typ ovladače se nedá přímo určit podle zařazení uvedeného výše, nejvíce se podobá ovladači typu 2, případně typu 4 (záleží na tom, zdali je příslušná databáze implementována přímo v Javě, či nikoli). Příkladem takového typu ovladač je KPRB vydaný společností Oracle. "jdbc:default:connection" je víceméně standardní způsob jak vytvořit dané připojení (je podporovaný např. Oracle a Apache Derby). Jeho výhoda spočívá v tom, že JDBC klient vlastně funguje jako součást databáze, se kterou chceme pracovat, takže přímý přístup je používanější nežli přístup skrze síťové protokoly.

Příklady JDBC driverů

MySQL: com. mysql. +morejdbc. Driver * Sybase: com. sybase. jdbc3. jdbc. SybDriver * IBM AS400: com. ibm. as400. access. AS400JDBCDriver * Oracle: oracle. jdbc. driver. OracleDriver * Apache Derby org. apache. derby. jdbc. ClientDriver nebo org. apache. derby. jdbc. EmbeddedDriver.

Samozřejmostí je autentizace uživatelským jménem a heslem.

Příklad

Metoda [url=http://download. oracle. +morecom/javase/6/docs/api/java/lang/Class. html#forName(java. lang. String)]Class. forName(String)[/url] se používá k načtení třídy JDBC driver. Řádka kódu dole znázorňuje načtení JDBC driveru od jistého poskytovatele (some jdbs vendor). Některé JVM také požadují, aby byla příslušná třída zavedena pomocí metody [url=http://download. oracle. com/javase/6/docs/api/java/lang/Class. html#newInstance]. newInstance[/url].

Class.forName("com.somejdbcvendor.TheirJdbcDriver");

public void connect throws DriverNotFoundException, ConnectionFailedException { try { Class. forName(jdbcDriver); connection = DriverManager. +moregetConnection(dbURI, user, passwd); } catch (ClassNotFoundException e) { throw new DriverNotFoundException(e. getMessage); } catch (SQLException e) { throw new ConnectionFailedException(e. getMessage); } }.

Nezapomínejte uzavírat navázaná spojení!

public void disconnect throws DisconnectFailedException { try { connection.close; } catch (SQLException e) { throw new DisconnectFailedException(e.getMessage); } }

Od verze JDBC 4. 0 není již nutné explicitně načítat JDBC drivery pomocí Class. +moreforName. Pro více informací klikněte na [url=http://onjava. com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6. html]JDBC 4. 0 Enhancements in Java SE 6[/url].

Když je [url=http://download. oracle. +morecom/javase/6/docs/api/java/sql/Driver. html]driver[/url] načten, je vytvořena jeho vlastní instance, která je dále zaregistrována pomocí třídy [url=http://download. oracle. com/javase/6/docs/api/java/sql/DriverManager. html]Driver manager[/url]. Proto je nezbytné ve třídě příslušného driveru zahrnout potřebný kód ve statickém inicializačním bloku, např. DriverManager. getConnection.

Nyní, když je třeba vytvořit JDBC připojení, použijeme jednu z metod DriverManager.getConnection.

Connection conn = DriverManager. getConnection( "jdbc:somejdbcvendor:other data needed by some jdbc vendor", "myLogin", "myPassword"); try { /* you use the connection here */ } finally { //It's important to close the connection when you are done with it try { conn. +moreclose; } catch (Throwable ignore) { /* Propagate the original exception instead of this one that you may want just logged */ } }.

Použitá URL závisí na příslušném JDBC driveru. Vždy začíná "jdbc:"protokol, avšak zbytek závisí na jednotlivých výrobcích DB systémů. +more Když je vytvořeno připojení, musí následovat vytvoření příkazu.

Statement stmt = conn. createStatement; try { stmt. +moreexecuteUpdate("INSERT INTO MyTable(name) VALUES('my name')"); } finally { //It's important to close the statement when you are done with it try { stmt. close; } catch (Throwable ignore) { /* Propagate the original exception instead of this one that you may want just logged */ } }.

Je důležité povšimnout si faktu, že Připojení (Connections), Příkazy (Statements) a Množiny Výsledků (ResultSets) často vytěžují operační systém, především sockety a popisovač souborů. V případě připojení ke vzdáleným databázovým serverům jsou vytěžovány i další součásti serveru jako např. +more ukazatele na současně otevřené Množiny výsledků. Je tedy nezbytně nutné zavřít (pomocí close) jakýkoli JDBC objekt, který již není třeba; programátor by neměl spoléhat pouze na Garbage collector. Pominutí správného použití metody close vede k nežádoucím chybám a nesprávnému chodu programu. Při práci s JDBC objekty je doporučeno používat vzorovou konstrukci try-finally (použita též v kódu nahoře).

Data jsou získána z databáze použitím databázového mechanizmu dotazů. Na následujícím příkladu je znázorněno vytvoření příkazu (Statement) a vykonání příslušného dotazu.

Statement stmt = conn.createStatement; try { ResultSet rs = stmt.executeQuery("SELECT * FROM MyTable"); try { while (rs.next) { int numColumns = rs.getMetaData.getColumnCount; for (int i = 1; i

Pokud dojde k selhání databázové operace, JDBC vyvolá [url=http://download. oracle. +morecom/javase/6/docs/api/java/sql/SQLException. html]SQLException[/url]. Obvykle existuje velmi málo možností, jak zotavit program z takové chyby, kromě co nejdetailnějšího logování. Je doporučeno přeložit SQLException do Application Domain Exception, která v tomto případě vede k návratu do stavu před chybnou transakcí (transaction rollback) a k upozornění uživatele.

Příklad databázové transakce:

boolean autoCommitDefault = conn.getAutoCommit; try { conn.setAutoCommit(false);

/* You execute statements against conn here transactionally */

conn.commit; } catch (Throwable e) { try { conn.rollback; } catch (Throwable ignore) {} throw e; } finally { try { conn.setAutoCommit(autoCommitDefault); } catch (Throwable ignore) {} }

Zde jsou příklady typů hostitelské databáze, do kterých je umí převést Java pomocí svých metod:

Oracle DatatypesetXXX
CHARsetString
VARCHAR2setString
NUMBERsetBigDecimal
NUMBERsetBoolean
NUMBERsetByte
NUMBERsetShort
NUMBERsetInt
NUMBERsetLong
NUMBERsetFloat
NUMBERsetDouble
INTEGERsetInt
FLOATsetDouble
CLOBsetClob
BLOBsetBlob
RAWsetBytes
LONGRAWsetBytes
DATEsetDate
DATEsetTime
DATEsetTimestamp

Pro znázornění použití příkazu pro práci s uloženou procedurou (CallableStatement) navštivte [url=http://download. oracle. +morecom/javase/6/docs/technotes/guides/jdbc/getstart/callablestatement. html]JDBC API Guide[/url].

Odkazy

Reference

Související články

Open Database Connectivity * JDBC Driver

Externí odkazy

[url=http://java.sun.com/j2se/1.5.0/docs/guide/jdbc]Popis JDBC API[/url] * [url=http://www.jdbc-tutorial.com/]Tutorial k JDBC[/url]

Kategorie:Rozhraní pro programování aplikací Kategorie:Databáze Kategorie:Java

5 min read
Share this post:
Like it 8

Leave a Comment

Please, enter your name.
Please, provide a valid email address.
Please, enter your comment.
Enjoy this post? Join Cesko.wiki
Don’t forget to share it
Top