JDBC Technologia JDBC jest zaawansowanym środowiskiem programistycznym, które zapewnia dostęp do różnych źródeł danych w tym baz danych SQL wielu producentów. Sterowniki JDBC pozwalają łączyć się z dostawcami danych w środowiskach heterogenicznych. JDBC API jest przemysłowym standardem dostępowym nie zależącym od dostawców silników bazodanowych zapewniającym łączność między programami tworzonymi w języku programowania Java i tymi systemami bazodanowymi. Czym jest SQL: SQL (ang. Structured Query Language) to strukturalny język zapytań używany do tworzenia, modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych. Język SQL jest językiem deklaratywnym. Decyzję o sposobie przechowywania i pobrania danych pozostawia się systemowi zarządzania bazą danych DBMS. Jest to język programowania opracowany w latach siedemdziesiątych w firmie IBM. Stał się on standardem w komunikacji z serwerami relacyjnych baz danych. Wiele współczesnych systemów relacyjnych baz danych używa do komunikacji z użytkownikiem SQL, dlatego mówi się, że korzystanie z relacyjnych baz danych, to korzystanie z SQL-a. Pierwszą firmą, która włączyła SQL do swojego produktu komercyjnego, był Oracle. Dalsze wprowadzanie SQL-a, w produktach innych firm, wiązało się nierozłącznie z wprowadzaniem modyfikacji pierwotnego języka. Wkrótce utrzymanie dalszej jednolitości języka wymagało wprowadzenia standardu. Funkcje silnika i middleware Produkty związane z relacyjnymi bazami danych to nie tylko serwery. Sam serwer określa się często takimi nazwami jak "back end", "engine", czy też "motor/silnik bazy danych". Przechowuje on dane oraz zapewnia ich pobieranie i aktualizacje w odpowiedzi na pobierane instrukcje w SQL-u. Uzupełnieniem serwera jest zazwyczaj "front end", "middleware" czy też "fronton" narzędzia upraszczające komunikację z serwerem i wyposażone w mechanizmy pozwalające wykorzystać pobrane dane. Należą do nich mechanizmy generowania i obsługi formularzy oraz raportów, języki czwartej generacji (4GL), graficzne języki zapytań, narzędzia konstrukcyjne użytkownika, oprogramowanie do prezentacji multimedialnych, systemy tworzenia hipertekstu, systemy CAD/CAM, arkusze kalkulacyjne, jak również interfejsy dostępu bezpośredniego. Wszystkie one wykorzystują, do komunikacji z serwerem i wykonywania za jego pośrednictwem różnych operacji, język SQL. Serwer odpowiada za przechowywanie, porządkowanie i pobieranie danych, zapewnia ich integralność, bezpieczeństwo oraz zabezpiecza przed ewentualnymi konfliktami między użytkownikami. Formy SQL-a Z technicznego punktu widzenia, SQL jest podjęzykiem danych. Oznacza to, że jest on wykorzystywany wyłącznie do komunikacji z bazą danych. Nie posiada on cech pozwalających na tworzenie kompletnych programów. Jego wykorzystanie może być trojakie i z tego względu wyróżnia się trzy formy SQL-a: 1. SQL interakcyjny lub autonomiczny wykorzystywany jest przez użytkowników w celu bezpośredniego pobierania lub wprowadzania informacji do bazy. Przykładem może być zapytanie prowadzące do uzyskania zestawienia aktywności kont w miesiącu. Wynik jest wówczas przekazywany na ekran, z ewentualną opcją jego przekierowania do pliku lub drukarki. 2. Statyczny kod SQL (Static SQL) nie ulega zmianom i pisany jest wraz z całą aplikacją, podczas której pracy jest wykorzystywany. Nie ulega zmianom w sensie zachowania niezmiennej treści instrukcji, które jednak zawierać mogą odwołania do zmiennych lub parametrów przekazujących wartości z lub do aplikacji. Statyczny SQL występuje w dwóch odmianach. 1. Embedded SQL (Osadzony SQL) oznacza włączenie kodu SQL do kodu źródłowego innego języka. Większość aplikacji pisana jest w takich językach jak C++ czy Java, jedynie odwołania do bazy danych realizowane są w SQL. W tej odmianie statycznego SQL-a do przenoszenia wartości wykorzystywane są zmienne. 2. Język modułów. W tym podejściu moduły SQL łączone są z modułami kodu w innym języku. Moduły kodu SQL przenoszą wartości do i z parametrów, podobnie jak to się dzieje przy wywoływaniu podprogramów w większości języków proceduralnych. Jest to pierwotne podejście, zaproponowane w standardzie SQL. Embedded SQL został do oficjalnej specyfikacji włączony nieco później. 3. Dynamiczny kod SQL (Dynamic SQL) generowany jest w trakcie pracy aplikacji. Wykorzystuje się go w miejsce podejścia statycznego, jeżeli w chwili pisania aplikacji nie jest możliwe określenie treści potrzebnych zapytań - powstaje ona w oparciu o decyzje użytkownika. Tę formę SQL generują przede wszystkim takie narzędzia jak graficzne języki zapytań. Utworzenie odpowiedniego zapytania jest tu odpowiedzią na działania użytkownika. Wymagania tych trzech form różnią się i znajduje to odbicie w wykorzystywanych przez nie konstrukcjach językowych. Zarówno statyczny, jak i dynamiczny SQL uzupełniają formę autonomiczną cechami odpowiednimi tylko w określonych sytuacjach. Większość języka pozostaje jednak dla wszystkich form identyczna. Możliwości JDBC API: Nawiązanie połączenia z bazą danych lub innym tabelarycznym źródłem danych. Wysyłać i wykonywać polecenia SQL Przetwarzać dane będące wynikiem wykonywanych poleceń. Architektura JDBC JDBC zawiera dwa główne zestawy interfejsów: 1. JDBC API dla programistów aplikacji 2. JDBC niższego poziomu dla programistów sterowników dostępu do baz danych Sterowniki JDBC można podzielić na 4 kategorie. Aplikacje i aplety Java mogą sięgać do baz danych używając bezpośrednio sterowników Java JDBC lub pośrednio poprzez sterowniki ODBC (OpenDataBaseConnectivity). Schematy zasady działania pokazano poniżej. Lewa Strona, Typ 4: Bezpośredni dostęp do bazy danych przez sterowniki Java Ten sposób zamienienia wywołania JDBC na protokół używany bezpośredni ooprzez dostarczyciela bazy danych. Prawa strona, Typ 3: Dostęp do bazy danych przez sterowniki Java za pośrednictwem warstwy pośredniej. Ten sposób tłumaczy wywołania JDBC na protokół pośredni, który potem z kolei jets tłumaczony na protokół dostawcy bazy danych. Warstwa pośrednia pozwala łączyć się z różnymi silnikami baz danych. Rysunek poniżej przedstawia połączenie JDBC używające sterowniki ODBC oraz istniejącą bibliotekę dostępową. Lewa strona, Typ 1: Most JDBC-ODBC w połączeniu ze sterownikami ODBC Ta kombinacja pozwala JDBC na dostęp do źródła danych poprzez ładownie prekompilowanych sterowników na wszystkich maszynach klienckich ODBC. Firma Sun dostarcza sterownik-most JDBC-ODBC, który jest eksperymentalnie używany i w tedy kiedy inne rozwiązania zawodzą. Prawa strona, Typ 2: Funkcje natywne interfejsu sterowników. Ten typ sterowników zamienia wywołania JDBC na funkcje interfejsu dostępu do systemów bazodanowych dla producentów: Oracle, Sybase, Informix, DB2 i innych. To rozwiązanie wymaga ładowania na maszynach klienckich binarnych bibliotek. Linki: http://java.sun.com/products/jdbc/ http://java.sun.com/products/jdbc/overview.html http://java.sun.com/j2se/1.4.2/docs/guide/jdbc/getstart/GettingStartedTOC.fm.html http://pl.wikipedia.org/wiki/SQL Przykład Ten prosty przykład pozwoli poznać jak: Podłączanie się do źródła danych ODBC. Źródło danych ODBC to baza danych zarejestrowana przez sterownik ODBC. Selektywne wyciąganie danych za pomocą języka SQL. Zakładamy, że w sterownikach ODBC mamy zdefiniowane źródło danych o nazwie CafeJolt oraz w bazie tej jest tabela JoltData (o kolumnach programmer, day, cups, variety ) import java.sql.*; public class JoltReport { public static void main (String args[]) { String URL = "jdbc:odbc:CafeJolt"; String username = ""; String password = ""; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (Exception e) { System.out.println("Failed to load JDBC/ODBC driver."); return; } Statement stmt = null; Connection con=null; try { con = DriverManager.getConnection ( URL, username, password); stmt = con.createStatement(); } catch (Exception e) { System.err.println("problems connecting to "+URL); } try { ResultSet result = stmt.executeQuery( "SELECT programmer, cups FROM JoltData ORDER BY cups DESC;"); result.next(); // move to first row String name = result.getString("programmer"); int cups = result.getInt("cups"); System.out.println("Programmer "+name+ " consumed the most coffee: "+cups+" cups."); result = stmt.executeQuery( "SELECT cups FROM JoltData;"); // for each row of data cups = 0; while(result.next()) { cups += result.getInt("cups"); } System.out.println("Total sales of "+cups+" cups of coffee."); con.close(); } catch (Exception e) { e.printStackTrace(); } } }