JDBC - Obsługa baz danych w języku Java



Podobne dokumenty
Rozdział 9 Obsługa baz danych w języku Java

JAVA bazy danych. na bazie: Język Java - Podstawy Programowania - Jacek Rumiński

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

JDBC (Java Database Connectivity vit )

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

JAVA I BAZY DANYCH. MATERIAŁY:

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

Metody dostępu do danych

Programowanie w języku Java. Bazy danych SQLite w Javie

JDBC w LoXiMie. Interfejs Java Database Connectivity dla systemu LoXiM. Adam Michalik 2008

Plan wykładu. Dostęp do bazy danych. Architektura JDBC. Dostęp do baz danych z aplikacji Java EE

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Programowanie komputerów. Wykład 10: Dostęp do baz danych z poziomu aplikacji Java. (JDBC Database Access)

Programowanie obiektowe

Podstawy otwartych języków programowania Java Database Connectivity (JDBC)

Bartosz Jachnik - Kino

Połączenia między bazami danych i programem w języku Java część 2

PHP: bazy danych, SQL, AJAX i JSON

Połączenie z bazą danych

Bazy danych wykład dwunasty

Podejście obiektowe do relacyjnych baz danych Hibernate.

Database Connectivity

Programowanie w języku Java

Łączenie z bazą danych przykładowa klasa infpolaczenie import java.sql.drivermanager; import java.sql.connection; import java.sql.

Programowanie obiektowe

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

PL/SQL. Zaawansowane tematy PL/SQL

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Programowanie obiektowe

Podstawy programowania III WYKŁAD 2

Connection con = DriverManager.getConnection(dbUrl, username, passwd);

1.1. System otwartych baz danych ODBC. System otwartych baz danych ODBC. Interfejs ODBC. Interfejs ODBC. System otwartych baz danych ODBC

Założenia do ćwiczeń: SQL Server UWM Express Edition: \SQLEXPRESS. Zapoznaj się ze sposobami użycia narzędzia T SQL z wiersza poleceń.

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Architektura ADO.NET Dostawcy danych Modele dostępu do danych model połączeniowy Model bezpołączeniowy

Protokół JDBC współpraca z relacyjnymi bazami danych lab3

Wywoływanie metod zdalnych

Java Database Connectivity

Typy sterowników. Rozdział 21 JDBC. Podstawowe kroki aplikacji. Historia. Program napisany w języku Java JDBC API. Menadżer sterowników JDBC

Protokół JDBC współpraca z relacyjnymi bazami danych

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Projektowanie systemów baz danych

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Uruchamianie bazy PostgreSQL

Dokumentacja do API Javy.

Aplikacje RMI

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Oracle11g: Wprowadzenie do SQL

Java jako język programowania

Aplikacje Internetowe

15. Funkcje i procedury składowane PL/SQL

Kurs programowania aplikacji bazodanowych

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Plan. Formularz i jego typy. Tworzenie formularza. Co to jest formularz? Typy formularzy Tworzenie prostego formularza Budowa prostego formularza

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Wybrane działy Informatyki Stosowanej

JAVA W SUPER EXPRESOWEJ PIGUŁCE

STWORZENIE BIBLIOTEKI SŁUŻĄCEJ DO WCZYTYWANIA

Programowanie obiektowe zastosowanie języka Java SE

Język SQL, zajęcia nr 1

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Java Database Connectivity

JDBC. Plan ćwiczenia. Wywoływanie poleceń SQL z języków programowania. Plan ćwiczenia cd. Wprowadzenie do laboratorium

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Kontenery i komponenty graficzne

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Aplikacja wielowątkowa prosty komunikator

Systemy Rozproszone - Ćwiczenie 6

Bazy Danych i Usługi Sieciowe

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Oracle PL/SQL. Paweł Rajba.

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski. Zaawansowane Systemy Decyzyjne. Laboratorium

Materiały do laboratorium MS ACCESS BASIC

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

Multimedia JAVA. Historia

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

Przypisywanie bibliotek w architekturze SAS

SYSTEM MONITORINGU PARAMETRÓW WĘZŁÓW PRZECHOWYWANIA DANYCH DLA PROJEKTU KRAJOWY MAGAZYN DANYCH PODRĘCZNIK DEWELOPERA

DECLARE <nazwa_zmiennej> typ [(<rozmiar> )] [ NOT NULL ] [ { := DEFAULT } <wartość> ];

Programowanie w Ruby

PLAN WYKŁADU BAZY DANYCH PODSTAWOWE KWESTIE BEZPIECZEŃSTWA OGRANICZENIA DOSTĘPU DO DANYCH

akademia androida Składowanie danych część VI

PRZESTRZENNE BAZY DANYCH WYKŁAD 2

Systemy GIS Tworzenie zapytań w bazach danych

Transkrypt:

JDBC - Obsługa baz danych w języku Java JDBC (Java Database Conectiviti) jest interfejsem pozwalającym połączyć aplikację Javy z zewnętrzną bazą danych za pomocą odpowiednich sterowników. Dużą zaletą JDBC jest łatwość przejścia na inny system bazodanowy, co najczęściej odbywa się bez zmian w kodzie aplikacji lub ze znikomą ich ilością. Polega to zazwyczaj na zmianie sterownika JDBC na taki, który współpracuje z systemem bazodanowym do którego chcemy mieć dostęp w aplikacji. Samo JDBC jest olbrzymim krokiem naprzód w porównaniu z innymi technologiami dostępu do baz danych. Mimo to, bardzo często wykorzystuje się ją jako bazę do tworzenia jeszcze bardziej przyjaznych interfejsów przeznaczonych dla konkretnych zastosowań. Taka, "zewnętrzna" a warstwa komunikuje się z użytkownikiem w mniej skomplikowanym języku, tłumaczy zapytania na postać zrozumiałą dla JDBC, a potem prezentuje otrzymane wyniki. Typowy scenariusz korzystania z JDBC opiera się na trzech krokach. 1. Nawiązanie połączenia z bazą danych 2. Wysyłanie zapytania, ew. polecenia zmiany, dodania lub usunięcia informacji z bazy. 3. Opracowanie wyników. JDBC może stanowić podstawę do tworzenia interfejsów wyższego rzędu. Znane są prace nad stworzeniem interfejsu mieszającego elementy SQL i Javy (np. umieszczenie zmiennych Javy w SQL). Określony preprocesor wbudowanego w Javie języka SQL tłumaczyłby stworzone rozkazy na rozkazy niskiego poziomu zgodnie z JDBC. Inna wersja interfejsu wysokiego rzędu zakłada odwzorowanie tabel na klasy. Każdy rekord staje się wówczas obiektem danej klasy. Tworzenie interfejsów wyższego poziomu jest również istotne z punktu widzenia planowanego modelu dostępu do bazy danych. Popularna dwu-warstwowa metoda dostępu (twotier) daje bezpośredni dostęp do bazy danych (aplikacja/applet - baza danych). Oznacza to, że musimy znać format danych bazy by móc pobrać lub zmienić informacje. W przypadku bardziej uniwersalnym dodaje się trzecią warstwę w modelu dostępu do bazy (aplikacja/applet (GUI) - serwer - baza danych). W modelu trzy punktowym stosuje się interfejs wyższego poziomu po to aby struktura dostępu do bazy danych stanowiła pewną abstrakcję, co umożliwia tworzenie różnych klientów bez potrzeby zagłębiania się w szczegóły protokołów wymiany danych z bazą. Tak stworzona konstrukcja dostępu do bazy danych uwalnia klienta od znajomości organizacji bazy danych, co za tym idzie możliwe są prawie dowolne modyfikacje ustawień bazy danych np. kilka rozproszonych baz zamiast jednej. Istnieją inne interfejsy dostępu do baz danych jak na przykład popularny Open DataBase Connectivity firmy Microsoft. Jednak korzystanie z ODBC przez programy Javy nie stanowi dobrego rozwiązania ponieważ: 1. występuje różnica języków programowania - ODBC jest stworzony w C, a co za tym idzie konieczna konwersja porzuca cechy języka Java, a często staje się nie realizowalna ze względu na inne koncepcje np. problem wskaźników Strona 1

2. korzystanie z ODBC jest znacznie trudniejsze, a nauka pochłania zbyt dużo czasu, 3. praca z ODBC wymaga ręcznych ustawień na wszystkich platformach klientów, podczas gdy korzystanie z JDBC umożliwia automatyczne wykorzystanie kodu JDBC na wszystkich platformach Javy począwszy od komputerów sieciowych do superkomputerów. W okresie wprowadzania języka Java oraz sterowników JDBC stworzono (JavaSoft) mosty JDBC-ODBC, będące rozwiązaniem dla tych, którzy korzystają z baz danych nie posiadających innych, "czystych" sterowników JDBC Typy sterowników JDBC Typ I Most JDBC-ODBC umożliwia połączenie z każdą bazą danych, dla której istnieje sterownik ODBC Typ II Sterownik napisany częściowo w Javie, wykorzystujący biblioteki klienta bazy danych efektywne rozwiązanie wymaga preinstalowanego oprogramowania klienta bazy danych Typ III Uniwersalny sterownik w czystej Javie, z obsługą specyficznych baz danych w warstwie pośredniej najbardziej elastyczna architektura Typ IV Sterownik w czystej Javie, komunikujący się bezpośrednio z serwerem bazy danych nie wymaga bibliotek klienta bazy danych odpowiedni dla dostępu do bazy danych z apletów Sterowniki JDBC Oracle JDBC Thin (typ IV) w 100% napisany w czystej Javie może być pobrany przez sieć wraz z apletem Java JDBC OCI (typ II) wykonuje wywołania OCI do fabrycznego sterownika, preinstalowanego po stronie klienta wykorzystywany wyłącznie w aplikacjach języka Java Server-side internal driver wykorzystywany przez aplikacje Java uruchamiane wewnątrz serwera Oracle (np. Java Stored Procedures) Server-side Thin driver wykorzystywany przez aplikacje Java uruchamiane wewnątrz serwera Oracle do nawiązywania połączeń z innymi serwerami Strona 2

Architektura JDBC 1. Utworzenie połączenia z bazą danych Stworzenie połączenia z bazą danych polega utworzeniu obiektu Connection. W tym celu stosuje się jedną ze statycznych metod DriverManager.getConnection(). Każda metoda getconnection() zawiera jako argument adres URL dostępu do bazy danych. Adres ten definiowany jest poprzez trzy człony: jdbc:<subprotocol>:<subname>. Pierwszy element adresu jest stały i nosi nazwę jdbc. Określa on typ protokołu. Kolejny element stanowi nazwa sterownika lub mechanizmu połączenia do bazy danych. Przykładowo mogą to być nazwy: msql - sterownik dla bazy msql, odbc - mechanizm dla sterowników typu ODBC. Ostatna część adresu zawiera opis konieczny do zlokalizowania bazy danych. Element ten zależy od sterownika czy mechanizmu połączeń i może zawierać dodatkowe rozszerzenia zgodnie z koncepcją przyjętą przez twórcę sterownika. Standardowo omawiana część adresu wygląda następująco: ///hostname:port/subsubname. Przykładowe pełne adresy url mogą wyglądać następująco: jdbc:odbc:biomed,jdbc:msql://athens.imaginary.com:4333/db_test Jedna z metod getconnection() umożliwia dodatkowo przesłanie nazwy użytkownika i hasła dostępu do bazy danych: Strona 3

getconnection(stringuurl,stringuuser,stringppassword). Połączenie byłoby niemożliwe bez istnienia sterowników. Zarządzaniem sterownikami, które zarejestrowały się za pomocą metody DriverManager.registerDriver() zajmuje się klasa DriverManager (np. metody getdriver(), getdrivers()). Klasy sterowników powinny zawierać kod statyczny (stanic{), który w wyniku ładowania tych klas stwarza obiekt danej klasy automatycznie rejestrującej się za pomocą metody DriverManager.registerDriver(). Ładowanie sterownika (a więc jego rejestracja) odbywa się najczęściej poprzez wykorzystanie metody Class.forName(). Ta metoda ładowania sterownika nie zależy od ustawień zewnętrznych (konfiguracji sterowników) i ma charakter dynamiczny. Przykładowe ładowanie sterownika o nazwie "oracle.db.driver" wykonane jest poprzez zastosowanie metody Class.forName("oracle.db.Driver"). Fragment kodu obrazujący etap łączenia się z bazą danych ukazano poniżej: String url = "jdbc:odbc:kurs"; //przykładowa nazwa drivera - slowo "kurs" jest nazwą zasobów //definiowaną w ODBC dla bazy np. pliku tekstowego String username = ""; //brak parametrów dostępu do pliku tekstowego String password = ""; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //ładowanie sterownika - most JDBC-ODBC catch (Exception e) { System.out.println("Blad ladowania sterownika JDBC/ODBC."); return; Connection c = null; try { c = DriverManager.getConnection (url, username, password); //połączenie catch (Exception e) { System.err.println("Wystapil problem z polaczeniem do "+url); Powyższy przykład zakłada rejestrację w ODBC bazy tekstowej o dostępie "kurs" i wskazanie odpowiedniego katalogu. Poniżej przedstawiono zasady tworzenia połączenia i wykorzystywania kodu zdalnego (sterowniki) dla bazy danych qabase pracującej na serwerze Msql: try{ Class.forName("com.imaginary.sql.msql.MsqlDriver"); catch (Exception e){ System.out.println("Błąd wczytywania sterowników"); return; String URL = "jdbc:msql://biomed.eti.pg.gda.pl:1114/qabase"; String username ="msql"; Strona 4

String password=""; s=null; con=null; try{ con=drivermanager.getconnection(url,username,password); s=con.createstatement(); catch (Exception e) { System.err.println("Błąd połączenia z "+URL); W przypadku apletu sterowniki (pakiet kodu) musi być zainstalowany na serwerze WWW tam, skąd pochodzi aplet. 2. Wysłanie polecenia SQL W celu wysłania polecenia SQL należy stworzyć obiekt Statement. Obiekt ten stanowi kontener dla wykonywanych poleceń SQL. Wykorzystywane są dodatkowo dwa kontenery: PreparedStatement oraz CallableStatement. Obiekt Statement jest wykorzystywany do wysyłania prostych poleceń SQL nie zawierających parametrów, obiekt PreparedStatement używany jest do wykonywania prekompilowanych (przygotowanych - prepared) poleceń SQL zawierających jedno lub więcej pól parametrów (oznaczanych znakiem "?"; tzw. parametry IN), natomiast obiekt CallableStatement jest wykorzystywany do stworzenia odwołania (call) do przechowywanych w bazie danych procedur. W celu stworzenia obiektu dla opisanych wyżej interfejsów wykorzystuje się trzy odpowiednie metody interfejsu Connection: createstatement() - dla interfejsu Statement, preparestatement() dla interfejsu PreparedStatement oraz preparecall() dla interfejsu CallableStatement. Przykładowy fragment kodu tworzący obiekt wyrażenia Statement może wyglądać następująco: Connection c=null; try{ c=drivermanager.getconnection(url,username,password); //połączenie Statements =c.createstatement(); //tworzymy obiekt wyrażenia catch(exceptionee){ System.err.println("Wystąpił problem z polaczeniem do"+url); Posiadając obiekt Statement można wykorzystać trzy podstawowe metody umożliwiające wykonanie polecenia SQL. Pierwsza z metod executequery() jest używana do wykonywania poleceń, których efekt daje pojedynczy zbiór rezultatów ResultSet np. wyrażenie SELECT - wybierz. Drugą metodę executeupdate() wykorzystuje się przy wykonywaniu poleceń INSERT, UPDATE oraz DELETE a także wyrażeń typu SQL DDL (Data Definition Language - język definicji danych) jak CREATE TABLE i DROP TABLE. Efekt działania pierwszych trzech poleceń daje modyfikację jednej lub więcej kolumn w zero i więcej wierszach tabeli. Zwracana Strona 5

wartość w wyniku działania metody executeupdate() to liczba całkowita wskazująca ilość rzędów, które podlegały modyfikacjom. Dla wyrażeń SQL DDL zwracana wartość jest zawsze zero. Metoda execute() jest rzadko używana, ponieważ jest przygotowana do obsługi poleceń zwracających więcej niż jeden zbiór danych (więcej niż jeden obiekt ResultSet). Obsługa zwracanych danych jest więc kłopotliwa stąd metoda ta jest wykorzystywana dla obsługi specjalnych operacji. W przypadku obiektu PreparedStatement interfejs definiuje własne metody execute(), executeupdate() oraz executequery(). Dlaczego? Czy nie wystarczy, że interfejs PreparedStatement dziedziczy wszystkie metody interfejsu Statement, a więc i te omawiane. Otóż nie. Obiekty Statement nie zawierają wyrażenia SQL, które musi być podane jako argument do ich metod. W przypadku obiektu PreparedStatement wyrażenie SQL musi być przygotowane obiekt zawiera prekompilowane wyrażenie SQL. Dlatego wykonanie odpowiedniego polecenia polega na wywołaniu metody dla obiektu PreparedStatement bez podawania żadnego argumentu. Poniżej przedstawiono porównanie wykonania polecenia SQL dla obiektu Statement oraz obiektu PreparedStatement: Statement: staticstring SQL="INSERT INT kurs VALUES('Mariusz','MK',22.08) ; Statement s=... s.executeupdate(sql); PreparedStatement: Connection c=... PreparedStatement ps=c.preparestatement("insertiintto kurs VALUES(?,?,?)"); ps.setstring(1,"mariusz"); ps.setstring(1,"mk"); ps.setint(1,28); ps.executeupdate(); W pracy z zewnętrznymi procedurami przechowywanymi poza kodem programu istotą wykorzystania Javy jest stworzenie wyrażenia typu CallableStatement poprzez podanie jako parametru metody Connection.prepareCall() sekwencji ucieczki typu {call procedure_name[(?,?)] lub {? = call procedure_name[(?,?)] w przypadku gdy procedura zwraca wartość. Jak widać istota polega na znajomości nazwy i parametrów obsługiwanej procedury. Parametry ustawia się tak jak dla wyrażeń PreparedStatement natomiast pobiera się metodami getxxx(). Wykonanie polecenia (poleceń) procedury odbywa się poprzez wykorzystanie metody execute(). Strona 6

3. Rezultaty i ich przetwarzanie W zależności od typu polecenia SQL, a co za tym idzie typu wyrażenia executexxx(), możliwe są różne rezultaty wykonanych operacji. Metoda executeupdate() zwraca liczbę zmienionych wierszy, metoda executequery() zwraca obiekt typu ResultSet zawierający wszystkie rekordy (wiersze) będące wynikiem wydania polecenia SQL (SELECT). Dostęp do danych zawartych w ResultSet następuje poprzez odpowiedni przesuw (ResultSet.next()) po rekordach (początkowo wskaźnik ustawiony jest przed pierwszym elementem) oraz odczyt wartości pól za pomocą metod podanych w powyższej tabelce typu getxxx(), gdzie identyfikator kolumny określany jest poprzez jej nazwę (typu String - ważna jest wielkość liter) lub numer kolejny w rekordzie (np. 1 kolumna, 2 kolumna,...). Informację o kolumnach obiektu ResultSet dostępne są poprzez wywołanie metod interfejsu ResultSetMetaData, którego obiekt zwracany jest poprzez przywołanie metody ResultSet.getMetaData. Przykładowe własności kolumn to nazwa kolumnygetcolumnname(), czy typ kolumny- getcolumntype(). Niektóre systemy zarządzania bazami danych umożliwiają tzw. pozycjonowane zmiany i kasowanie polegające na wprowadzaniu zmian w aktualnie dostępnym rekordzie w ResultSet. Możliwe jest wówczas wykorzystanie metod updatexxx() interfejsu ResultSet do aktualizacji danych. Klasa ResultSet zawiera metody: next() zwraca kolejny rekord, zwraca wartość false w przypadku gdy gdy kursor wskazuje na ostatni rekord pevious() zwraca poprzedni rekord, zwraca wartość false w przypadku gdy kursor wskazuje na pierwszy rekord beforefirst() : Ustawia kursor przed pierwszym wierszem. afterlast() : Ustawia kursor za ostatnim wierszem. absolute(i) przechodzi do i-tego rekordu relative(i) Przesuwa kursor o i rekordów względem bieżącej pozycji kursora getstring(i) zwraca z aktualnego rekordu i-tą kolumnę jako String getinteger(i),getfloat(i),get zwraca z aktualnego rekordu i-tą kolumnę jako Integer, Float, updatestring(kolumna,wartość) zmienia kolumnę updaterow() zmienia rekord w bazie danych movetoinsertrow() przesuwa kursor na dodawanie rekordu Poniżej przedstawiono przykład wyświetlenia zapytania SQL tabeli autorów. Wyniki zostaną przedstawione w JTextArea 1 2 // 3 package com.deitel.advjhtp1.jdbc; 4 5 // Java core packages 6 import java.awt.*; 7 import java.sql.*; 8 import java.util.*; 9 10 // Java extension packages 11 import javax.swing.*; Strona 7

12 13 public class DisplayAuthors extends JFrame { 14 15 // constructor connects to database, queries database, 16 // processes results and displays results in window 17 public DisplayAuthors() 18 { 19 super( "Authors Table of Books Database" ); 20 21 22 // connect to database books and query database 23 try { 24 25 // load database driver class 26 Class.forName( "COM.cloudscape.core.RmiJdbcDriver" ); 27 28 // connect to database 29 Connection connection = DriverManager.getConnection( 30 "jdbc:cloudscape:rmi:books" ); 31 32 // create Statement to query database 33 Statement statement = connection.createstatement(); 34 35 // query database 36 ResultSet resultset = 37 statement.executequery( "SELECT * FROM authors" ); 38 39 // process query results 40 StringBuffer results = new StringBuffer(); 41 ResultSetMetaData metadata = resultset.getmetadata(); 42 int numberofcolumns = metadata.getcolumncount(); 43 44 for ( int i = 1; i <= numberofcolumns; i++ ) { 45 results.append( metadata.getcolumnname( i ) 46 + "\t" ); 47 48 49 results.append( "\n" ); 50 51 while ( resultset.next() ) { 52 53 for ( int i = 1; i <= numberofcolumns; i++ ) { 54 results.append( resultset.getobject( i ) 55 + "\t" ); 56 57 58 results += "\n"; 59 60 61 // close statement and connection 62 statement.close(); 63 connection.close(); 64 65 // set up GUI and display window 66 JTextArea textarea = new JTextArea( 67 results.tostring() ); Strona 8

68 Container container = getcontentpane(); 69 70 container.add( new JScrollPane( textarea ) ); 71 72 setsize( 300, 100 ); // set window size 73 setvisible( true ); // display window 74 // end try 75 76 // detect problems interacting with the database 77 catch ( SQLException sqlexception ) { 78 JOptionPane.showMessageDialog( null, 79 sqlexception.getmessage(), "Database Error", 80 JOptionPane.ERROR_MESSAGE ); 81 82 System.exit( 1 ); 83 84 85 // detect problems loading database driver 86 catch ( ClassNotFoundException classnotfound ) { 87 JOptionPane.showMessageDialog( null, 88 classnotfound.getmessage(), "Driver Not Found", 89 JOptionPane.ERROR_MESSAGE ); 90 91 System.exit( 1 ); 92 93 // end DisplayAuthors constructor definition 94 95 // launch the application 96 public static void main( String args[] ) 97 { 98 DisplayAuthors window = new DisplayAuthors(); 99 100 window.setdefaultcloseoperation( JFrame.EXIT_ON_CLOSE ); 101 102 // end class DisplayAuthors Wynik powyższego kodu: Strona 9