Programování

Co je JDBC? Úvod do připojení k databázi Java

JDBC (Java Database Connectivity) je rozhraní Java API, které spravuje připojení k databázi, vydává dotazy a příkazy a zpracovává sady výsledků získané z databáze. Vydáno jako součást JDK 1.1 v roce 1997, JDBC byla jednou z prvních komponent vyvinutých pro vrstvu persistence Java.

JDBC bylo původně koncipováno jako rozhraní API na straně klienta, které umožňuje klientovi Java komunikovat se zdrojem dat. To se změnilo s JDCB 2.0, který zahrnoval volitelný balíček podporující připojení JDBC na straně serveru. Každé nové vydání JDBC od té doby obsahuje aktualizace obou balíků na straně klienta (java.sql) a balíček na straně serveru (javax.sql). JDBC 4.3, nejnovější verze tohoto psaní, byla vydána jako součást Java SE 9 v září 2017.

Tento článek představuje přehled JDBC, následovaný praktickým úvodem do používání rozhraní JDBC API k připojení klienta Java k odlehčené relační databázi SQLite.

Jak JDBC funguje

JDBC, vyvinutý jako alternativa k rozhraní API ODBC (Open Database Connectivity) na bázi C, nabízí rozhraní na úrovni programování, které zpracovává mechaniku aplikací Java komunikujících s databází nebo RDBMS. Rozhraní JDBC se skládá ze dvou vrstev:

  1. Rozhraní JDBC API podporuje komunikaci mezi aplikací Java a správcem JDBC.
  2. Ovladač JDBC podporuje komunikaci mezi správcem JDBC a ovladačem databáze.

JDBC je běžné API, se kterým kód vaší aplikace interaguje. Pod tím je ovladač kompatibilní s JDBC pro databázi, kterou používáte.

Obrázek 1 je architektonický přehled JDBC ve vrstvě persistence Java.

JavaWorld /

Použití JDBC pro připojení k databázi

Jedním z šťastných faktů programování v ekosystému Java je, že pravděpodobně najdete stabilní databázový konektor JDBC pro libovolnou databázi, kterou si vyberete. V tomto tutoriálu použijeme k seznámení s JDBC SQLite, hlavně proto, že je tak snadno použitelný.

Kroky pro připojení k databázi pomocí JDBC jsou následující:

  1. Nainstalujte nebo vyhledejte databázi, ke které chcete přistupovat.
  2. Zahrňte knihovnu JDBC.
  3. Ujistěte se, že ovladač JDBC, který potřebujete, je ve vaší třídě.
  4. K získání připojení k databázi použijte knihovnu JDBC.
  5. Pomocí připojení můžete vydávat příkazy SQL.
  6. Po dokončení připojení ukončete.

Projdeme tyto kroky společně.

Nalezení ovladače JDBC

Chcete-li najít ovladač pro databázi, kterou chcete použít, jednoduše vyhledejte databázi a JDBC na webu. Například zadáním „ovladač jdbc mysql"objeví ovladač pro MySQL. Vyzývám vás, abyste našli databázi kompatibilní s Java bez ovladače JDBC!

Krok 1. Stáhněte a nainstalujte SQLite

SQLite je velmi kompaktní databáze. Není určen pro produkční použití, ale je skvělou volbou pro rychlé vyzkoušení. SQLite používá soubor jako svou funkční databázi, aniž by vyžadoval jakoukoli instalaci služby nebo démona.

Chcete-li začít s touto ukázkou, pokračujte a stáhněte si ukázkovou databázi SQLite. Rozbalte .db soubor a uložte jej někam, kam nezapomenete.

Tento soubor obsahuje jak funkční souborovou databázi, tak ukázkové schéma a data, která můžeme použít.

SQL a JDBC

NoSQL se za poslední desetiletí stal populárním, ale relační databáze zůstávají nejběžnějším typem používaného úložiště dat. A relační databáze je strukturované úložiště skládající se z tabulek se sloupci a řádky. SQL (Structured Query Language) je jazyk, který architekti dat používají k vytváření, čtení, aktualizaci a mazání nových záznamů v relační databázi. JDBC je vrstva adaptéru z prostředí Java na SQL: poskytuje vývojářům prostředí Java společné rozhraní pro připojení k databázi, vydávání dotazů a příkazů a správu odpovědí.

Krok 2. Importujte JDBC do své aplikace Java

Mohli bychom udělat naše kódování v IDE, ale kódování přímo v textovém editoru lépe předvede jednoduchost JDBC. Pro začátek budete potřebovat kompatibilní instalaci JDK pro váš operační systém.

Za předpokladu, že máte nainstalované vývojové nástroje platformy Java, můžeme začít vytvořením jednoduchého programu Java. V textovém editoru vložte kód zobrazený v Seznamu 1. Volejte tento soubor WhatIsJdbc.java.

Výpis 1. Jednoduchý program Java

 třída WhatIsJdbc {public static void main (String args []) {System.out.println ("Hello JavaWorld"); }} 

Nyní zkompilujte kód zadáním příkazu: javac WhatIsJdbc.java. Kompilace vygeneruje WhatIsJdbc.class soubor. Spusťte tento soubor z příkazového řádku s voláním: java WhatIsJdbc.

[Další informace o interakci s JDK na příkazovém řádku najdete v části „Co je to JDK? Úvod do sady Java Developer Kit“.]

Jakmile máte základní program Java, můžete zahrnout knihovny JDBC. Vložte kód z výpisu 2 do hlavy vašeho jednoduchého programu Java.

Výpis 2. Importy JDBC

 importovat java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; 

Každý z těchto importů poskytuje přístup ke třídě, která usnadňuje standardní připojení k databázi Java:

  • Spojení představuje připojení k databázi.
  • DriverManager získá připojení k databázi. (Další možností je Zdroj dat, který se používá ke sdružování připojení. )
  • SQLException zpracovává chyby SQL mezi aplikací Java a databází.
  • ResultSet a Prohlášení modelovat sady výsledků dat a příkazy SQL.

Brzy uvidíme každou z nich v akci.

Krok 3. Přidejte ovladač JDBC do své cesty ke třídě

Dále přidáte ovladač SQLite do své cesty ke třídě. A Ovladač JDBC je třída, která implementuje rozhraní JDBC API pro konkrétní databázi.

Stáhněte si ovladač SQLite z GitHubu. Nezapomeňte získat nejnovější .sklenice soubor a uložte jej někam, kde si pamatujete.

Až příště spustíte program Java, stáhnete to .sklenice přihlaste se přes cestu ke třídě. Existuje několik způsobů, jak nastavit cestu ke třídě. Výpis 3 ukazuje, jak to udělat pomocí přepínače příkazového řádku.

Výpis 3. Spuštění ovladače SQLite na třídě Java Class

 java.exe -classpath /path-to-driver/sqlite-jdbc-3.23.1.jar :. WhatIsJdbc 

Všimněte si, že jsme nastavili cestu ke třídě tak, aby ukazovala na řidiče a místní adresář; tímto způsobem Java stále najde náš soubor třídy.

Krok 4. Získejte připojení k databázi

Classpath má nyní přístup k ovladači. Nyní změňte svůj jednoduchý soubor aplikace Java tak, aby vypadal jako program ve Výpisu 4.

Výpis 4. Použití třídy JDBC Connection pro připojení k SQLite

 importovat java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.ResultSet; import java.sql.Statement; třída WhatIsJdbc {public static void main (String [] args) {Connection conn = null; zkuste {String url = "jdbc: sqlite: path-to-db / chinook / chinook.db"; conn = DriverManager.getConnection (url); System.out.println ("Mám to!"); } catch (SQLException e) {hodit novou chybu ("Problém", e); } konečně {try {if (conn! = null) {conn.close (); }} catch (SQLException ex) {System.out.println (ex.getMessage ()); }}}} 

Zkompilujte a spusťte tento kód. Za předpokladu, že vše půjde dobře, dostanete potvrzující zprávu.

Nebyl nalezen vhodný ovladač?

Pokud jste obdrželi chybu, která vypadá jako „Nebyl nalezen vhodný ovladač pro jdbc: sqlite„pak musíte znovu navštívit třídu cesty a ujistit se, že směřuje na stažený ovladač. Selhání připojení ovladače je nejčastější překážkou pro začátečníky používající JDBC. Nepotěšte se jím; jen to opravte.

Nyní jsme připraveni na některé příkazy SQL.

Krok 5. Dotaz na databázi

S živým objektem připojení v ruce můžeme udělat něco užitečného, ​​například dotazovat se na databázi. Výpis 5 ukazuje, jak dotazovat na SQLite pomocí JDBC Spojení a Prohlášení předměty.

Výpis 5. Dotazování na databázi pomocí JDBC

 importovat java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; importovat java.sql.ResultSet; importovat java.sql.Statement; třída WhatIsJdbc {public static void main (String [] args) {Connection conn = null; zkuste {String url = "jdbc: sqlite: cesta k souboru db / chinook / chinook.db"; conn = DriverManager.getConnection (url); Prohlášení stmt = null; Řetězcový dotaz = "vybrat * z alb"; try {stmt = conn.createStatement (); ResultSet rs = stmt.executeQuery (dotaz); while (rs.next ()) {Název řetězce = rs.getString ("název"); System.out.println (název); }} catch (SQLException e) {hodit novou chybu ("Problém", e); } konečně {if (stmt! = null) {stmt.close (); }}} catch (SQLException e) {hodit novou chybu ("Problém", e); } konečně {try {if (conn! = null) {conn.close (); }} catch (SQLException ex) {System.out.println (ex.getMessage ()); }}}} 

V seznamu 5 používáme naše Spojení předmět k získání a Prohlášení objekt: conn.createStatement (). Poté použijeme tento objekt k provedení dotazu SQL: stmt.executeQuery (dotaz).

The executeQuery příkaz vrátí a ResultSet objekt, který pak použijeme k iteraci dat s while (rs.next ()). V tomto příkladu byste měli jako výstup vidět názvy alb, na které jsme se dotazovali.

Všimněte si, že jsme také ukončili spojení prostřednictvím volání na conn.close ().

Síťová připojení s JDBC

Řetězec připojení k databázi v seznamu 5 je pro místní připojení: jdbc: sqlite: cesta k souboru db / chinook / chinook.db. Pro přístup k databázi prostřednictvím sítě by řetězec připojení musel obsahovat adresu URL sítě a (obvykle) pověření pro přístup k ní.

Dělat více s JDBC

Zatím jsme pokryli základy používání JDBC pro připojení k databázi a vydávání příkazů SQL. Zatímco Prohlášenís a ResultSetPokud dobře fungují pro běžné scénáře, budete pravděpodobně potřebovat další možnosti pro větší nebo složitější aplikace. Naštěstí se knihovna JDBC nadále vyvíjí tak, aby vyhovovala většině potřeb přístupu k databázi.

Připravená prohlášení

Jedním ze snadných způsobů, jak zvýšit flexibilitu kódu, je nahradit Prohlášení třída s Připravené prohlášení, jak je uvedeno v seznamu 6.

Výpis 6. Používání připravených prohlášení JDBC

 String prepState = "vložit do alb hodnoty (?,?);"; PreparedStatement prepState = connection.prepareStatement (sql); prepState.setString (1, "Uprising"); prepState.setString (2, „Bob Marley and the Wailers“); int linesAffected = readyStatement.executeUpdate (); 

Připravené prohlášení nahrazuje Prohlášenípevně zakódované hodnoty s otazníky (?). Použitím Připravené prohlášenís optimalizuje váš kód pro opětovné použití: a Připravené prohlášení je kompilován pouze jednou a poté může být znovu použit s různými parametry. Jak vaše základna kódu roste, jednoduše vložíte nové hodnoty do příkazu, místo toho, abyste hackli samotný objekt řetězce.

Dávkové aktualizace

Kdykoli má aplikace k vydání několik aktualizací, jejich provádění v dávkách může výrazně prospět výkonu. Podstata dávkování je vzít více aktualizací a shromáždit je společně, pak je vydat všechny najednou. Výpis 7 používá dávkové metody JDBC k provedení dávkové aktualizace několika Připravené prohlášenís.

Výpis 7. Dávkování s PreparedStatement

 prepState.setString (1, "Uprising"); prepState.setString (2, „Bob Marley and the Wailers“); readyStatement.addBatch (); prepState.setString (1, "Květy"); prepState.setString (2, „Tom Petty and the Heartbreakers“); readyStatement.addBatch (); int [] řádkyAffected = připravenýStatement.executeBatch (); 

Transakce JDBC

Transakce v relačních databázích umožňují zabalení sady aktualizací do interakce, která buď uspěje, nebo zcela selže. Základem používání transakce prostřednictvím JDBC je říct systému, aby se otočil vypnuto automatické potvrzení a poté ručně řekněte systému, aby se zavázal, až budete hotovi. Ve výchozím nastavení je automatické potvrzení na, což znamená kdykoli executeUpdate nebo executeInsert je spuštěn, příkaz je potvrzen.

Výpis 8 ukazuje malou část transakce JDBC.

Výpis 8. JDBC transakce

 connection.setAutoCommit (false); // Několikrát použijte executeUpdate connection.commit (); 

Když connection.commit () dojde k pokusu o všechny aktualizace zabalené uvnitř, a pokud dojde k chybě, všechny budou vráceny zpět.

Existuje mnoho dalších funkcí v JDBC 4.3, které stojí za prozkoumání, včetně použití Vyvolatelné prohlášení pro uložené procedury pomocí Zdroj dat objekty pro lepší výkon aplikací (zejména prostřednictvím sdružování připojení) a převod sady výsledků JDBC na stream Java.

Funkce specifické pro databázi

Ačkoli každá databáze kompatibilní s JDBC nabízí stejné základní funkce pro připojení a interakci s databází pomocí SQL, některé databáze fungují více než jiné. Například Oracle DB nabízí ukládání výsledků do mezipaměti, které specifikace JDBC nevyžaduje. Zde je příklad:

 conn.prepareStatement ("select / * + result_cache * / * od zaměstnanců, kde employee_id <: 1"); 

Tento příklad je převzat z dokumentace k ovladači JDBC OCI společnosti Oracle.

Závěr

JDBC je jedno z nejstarších API v Javě a poskytuje snadno použitelné řešení pro jednu z trvalých potřeb vývoje Java aplikací. Znalost jen několika volání JDBC předvedených v tomto článku vám umožní začít používat JDBC pro připojení k prakticky jakékoli databázi. Jakmile tyto příkazy zrušíte, můžete začít zkoumat některé sofistikovanější možnosti, které byly integrovány do JDBC.

Zatímco JDBC je pro jednodušší aplikace dostačující, většina vývojářů nakonec vyhledá rozhraní Java Persistence API (JPA), aby vytvořila formálnější vrstvu přístupu k datům. SPS vyžaduje náročnější práci a sofistikovanější porozumění aplikační architektuře, ale vytváří vám konzistentnější, izolovanější a přesně definovanou vrstvu přístupu k datům. V doprovodném článku k tomuto článku „Co je to JPA? Úvod do rozhraní Java Persistence API“ najdete další informace o vývoji vrstvy persistence dat pro vaše aplikace Java.

Tento příběh „Co je JDBC? Úvod do připojení k databázi Java“ byl původně publikován společností JavaWorld.