Łączność z bazą danych Java
W informatyce JDBC ( Java DataBase Connectivity ) [1] jest łącznikiem i sterownikiem bazy danych , który umożliwia dostęp i zarządzanie trwałością danych w bazach danych z dowolnego programu napisanego w języku programowania Java , niezależnie od typu używanego systemu DBMS . Składa się z obiektowego API zorientowanego na relacyjne bazy danych , zgrupowane w pakiecie java.sql , który jest używany przez klientów do łączenia się z bazą danych poprzez dostarczanie metod odpytywania i modyfikowania danych.
Platforma Java 2 Standard Edition zawiera interfejs API JDBC wraz z implementacją mostka JDBC-ODBC , który umożliwia łączenie się z relacyjnymi bazami danych obsługującymi ODBC , który jest w kodzie natywnym, a nie w Javie. Zazwyczaj każda baza danych ma swój własny sterownik JDBC, który współpracuje z aplikacją. Często frameworki utrwalające w Javie (np . Hibernate ) w ich implementacji na wyższym poziomie interfejsu na niższym poziomie z warstwą oprogramowania JDBC.
Architektura
Architektura JDBC, podobnie jak ODBC, przewiduje użycie „menedżera sterowników”, który udostępnia aplikacjom zestaw standardowych interfejsów i dba o ładowanie odpowiednich sterowników w „ czasie wykonywania ” do „napędu” konkretny DBMS. Aplikacje Java używają "JDBC API" do komunikowania się z menedżerem sterowników JDBC, podczas gdy menedżer sterowników używa interfejsu API sterownika JDBC do komunikowania się z poszczególnymi sterownikami sterującymi określonymi DBMS. Istnieje specjalny sterownik, „JDBC-ODBC Bridge”, który umożliwia łączenie się z dowolnym sterownikiem ODBC w środowisku Windows .
Typy sterowników
Dla większości serwerów relacyjnych baz danych dostępne są bezpłatne i komercyjne sterowniki. Sterowniki mogą być czterech typów:
Przegląd API
JDBC przyznaje, że istnieją różne implementacje i są używane przez tę samą aplikację . Interfejs API udostępnia mechanizm, który dynamicznie ładuje odpowiednie sterowniki i rejestruje je w Menedżerze sterowników JDBC. Działa jako fabryka połączeń.
Połączenia JDBC wspierają tworzenie i wykonywanie instrukcji . Mogą to być polecenia SQL typu INSERT, UPDATE, DELETE, zapytania typu SELECT lub wywołania procedur składowanych . Obsługiwane typy instrukcji to:
- Wyciąg - wyciąg jest co jakiś czas przesyłany do bazy danych;
- Przygotowana instrukcja - instrukcja jest kompilowana tylko raz, dzięki czemu kolejne wywołania są wydajniejsze;
- Callable Statement — służy do wywoływania procedur składowanych.
Polecenia zapisu, takie jak INSERT, UPDATE i DELETE, zwracają wartość wskazującą, ile wierszy zostało włączonych (wstawionych, zmodyfikowanych, usuniętych) w instrukcji. Nie zwracają żadnych innych informacji.
Zapytania ( zapytania ) zwracają zestaw wyników ( klasa ResultSet ). Możesz poruszać się po zestawie wyników linia po linii (poprzez następną () metodę ). Dostęp do kolumn każdego wiersza można uzyskać, dzwoniąc do nich po imieniu lub numerze. Zestaw wyników może składać się z dowolnej liczby wierszy. Zawiera metadane wskazujące nazwę, typ i rozmiar kolumn.
Istnieje rozszerzenie JDBC, które umożliwia między innymi korzystanie z przewijalnych zestawów wyników i kursorów po stronie klienta . Więcej informacji można znaleźć w dokumentacji firmy Sun Microsystems .
Wyjątki
Wszystkie metody JDBC API mogą zgłaszać wyjątki , ponieważ połączenie z DBMS może w dowolnym momencie zostać przerwane lub w każdym przypadku mogą wystąpić błędy w wykonywaniu poleceń SQL. Wszystkie wyjątki JDBC pochodzą z klasy SQLException i można je również łączyć z kilkoma różnymi wyjątkami. Każdy wyjątek zawiera opisowy komunikat, ciąg znaków zawierający status SQL (zgodny ze specyfikacją XOPEN SQL) oraz liczbę całkowitą zawierającą dodatkowy kod błędu specyficzny dla konkretnego używanego sterownika lub źródła.
Przykłady
Metoda Class.forName() ładuje klasę sterownika JDBC. Poniższy wiersz ładuje sterownik myDbms do aplikacji.
Klasa . forName ( "com.mioDbms.mioDriver" );
Następnie metoda DriverManager.getConnection() tworzy połączenie.
Połączenie połączenia = Menedżer sterowników . getConnection (
"jdbc: myDbms: inne przydatne dane dla sterownika" ,
"myLogin" , "myPassword
" );
Używany ciąg zależy od sterownika JDBC, którego będziemy używać. Zawsze zaczyna się od „jdbc:”, reszta różni się w zależności od wybranego produktu. Po nawiązaniu połączenia należy przekazać instrukcję.
Instrukcja stmt = conn . utwórzOświadczenie ();
stmt . executeUpdate ( "WSTAW DO myTable (nazwa) WARTOŚCI ('andrea')" );
Dane pobierane są z bazy danych za pomocą klasycznego mechanizmu zapytań. Poniższy przykład pokazuje, jak utworzyć i uruchomić zapytanie:
Instrukcja stmt = conn . utwórzOświadczenie ();
Zestaw wyników rs = stmt . executeQuery ( "WYBIERZ * Z myTable" );
while ( rs . next ( ) ) {
int liczba Kolumn = rs . getMetaData (). pobierzLiczbęKolumn ();
for ( int i = 1 ; i <= numberColumns ; i ++ ) {
// Numery kolumn zaczynają się od 1.
// Istnieje kilka metod konwertujących wartość kolumny na określony typ.
// Zapoznaj się z dokumentacją, aby uzyskać listę poprawnych konwersji.
System . się . println ( "KOLUMNA" + i + "=" + rs .getObject ( i ) ) ;
}
}
rs . zamknij ();
stmt . zamknij ();
Jednak rzadko zdarza się , aby programista Java pisał kod w tym stylu. Najczęstszym sposobem jest wstawienie logiki bazy danych do innej klasy i przekazanie już przetworzonych ciągów SQL (być może również pochodzących z innej klasy) oraz połączenia z metodami, które ich potrzebują.
Przykład przygotowanego oświadczenia. Używane jest połączenie z poprzedniego przykładu.
spróbuj {
Zestaw wyników rs ;
Przygotowane oświadczenie ps = conn . readyStatement (
"SELECT i. *, j. * FROM Omega i, Zappa j WHERE i =? AND j =?" );
// W przygotowanym oświadczeniu ps znaki zapytania oznaczają zmienne wejściowe,
// które można np. przepuścić przez listę parametrów.
// Poniższy kod zastępuje znaki zapytania ciągami lub liczbami całkowitymi.
// Pierwszy parametr wskazuje miejsce, w którym ma zostać wstawiona wartość,
// drugi parametr to wartość do wstawienia.
ps . setString ( 1 , "Biedny Yorick" );
ps . setInt ( 2 , 8008 );
// Zestaw wyników rs otrzymuje odpowiedź z bazy danych.
rs = ps . executeQuery ();
while ( rs . next ( ) ) {
int liczba Kolumn = rs . getMetaData (). pobierzLiczbęKolumn ();
for ( int i = 1 ; i <= liczbaKolumn ; i ++ ) {
System . się . println ( "KOLUMNA" + i + "=" + rs .getObject ( i ) ) ;
}
rs . zamknij ();
ps . zamknij ();
} catch ( SQLException e ) {
// obsługa wyjątków
}
Oto kilka przykładów konwersji między DBMS a Javą.
| Typy Oracle | Metody Java |
|---|---|
|
ZWĘGLAĆ
|
setString ()
|
|
VARCHAR2
|
setString ()
|
|
DŁUGIE
|
setString ()
|
|
NUMER
|
setBigDecimal () |
|
setBoolean ()
| |
|
setByte ()
| |
|
setKrótki ()
| |
|
setInt ()
| |
|
setLong ()
| |
|
setFloat ()
| |
|
setDouble ()
| |
| LICZBA CAŁKOWITA | setInt () |
| PLATFORMA | setDouble () |
| CLOB | setClob () |
| KROPELKA | setBlob () |
|
SUROWE
|
setBytes ()
|
|
LONGRAW
|
setBytes ()
|
|
U CIEBIE
|
ustawić datę ()
|
|
setTime ()
| |
|
setTimestamp ()
|
Zamykanie połączeń
Zwolnienie zasobów przydzielonych podczas operacji na bazie danych, w szczególności obiektu połączenia , jest szczególnie krytyczne, ponieważ całkowita liczba dostępnych połączeń jest ograniczona i zwykle połączenie z bazą danych nie jest zwalniane automatycznie, gdy nie jest już używane.
Aby mieć pewność, że połączenie jest prawidłowo zamknięte, nawet w przypadku wystąpienia wyjątku, dobrym pomysłem jest użycie last . Ponadto należy szczególnie uważać, aby nie rzucać dalszych wyjątków w bloku last:
Połączenie con = null ;
spróbuj {
con = DriverManager . getConnection ( URL , „” , „” );
// użyj połączenia
...
} catch ( Exception e ) {
...
} ostatecznie {
if ( con ! = null ) con . zamknij ();
}
Notatki
Powiązane pozycje
Inne projekty
Wikimedia Commons zawiera obrazy lub inne pliki na JDBC
Linki zewnętrzne
- Samouczek Sun , na stronie java.sun.com .
- ( EN ) Składnia API w Javie 2 1.4.1 , pod adresem java.sun.com .
- Duke 's Bakery — prototyp wprowadzania zamówień JDBC na stronie java.sun.com .
- ( EN ) DBAccessor : Pakiet JDBC Wrapper , na stronie java.sun.com .
- ( EN ) Lista baz danych Java Open Source ze sterownikami JDBC na stronie java-source.net .