Protokół JDBC – współpraca z relacyjnymi bazami danych lab4 Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych Zadanie1 – Połączenie z bazą danych travel systemu bazodanowego Derby (metoda void polaczenie_z_baza()), wyświetlanie zawartości tabeli Person (metoda void wyswietl_osoby() ) 1. Uruchom program Baza_1 w środowisku NetBeans 6.7.1 – załącznik do laboratorium. 2. W okienku Services należy otworzyć pozycję Databases. Następnie należy kliknąć prawym klawiszem myszy na rozerwany prostokąt bazy danych jdbc:derby://localhost:1527/travel. W menu podręcznym należy kliknąć na pozycję Connect. Po chwili prostokąt zostanie scalony, co symbolizuje połączenie z bazą danych. Widok bazy danych travel Schemat bazy danych travel Klucze główne Klucze obce Klucze obce Klucze główne Klucze obce Klucze główne Wyświetlenie danych z tabeli PERSON Zawartość tabeli PERSON Wykonanie zapytania na tabeli PERSON wykonanie działań pomocniczych Wynik działania programu Zadanie 2 cd zadania 1- należy dodać: wyświetlanie zawartość tabeli TRIP (metoda void wyswietl_wycieczki()), wyświetlanie wycieczek każdej osoby (metoda void wyswietl_wycieczki_osob()) 1. Wykonaj kopię programu Baza_1 jako Baza_2 (patrz instrukcja do lab3 - zad.2, pkt. 1) 2. Zmień nazwę pliku baza_1 na baza_2 (patrz instrukcja do lab3 – zad.2, pkt. 2 ) 3. Dodaj bibliotekę sterownika derbyclient.jar jak poniżej. (źródłowe położenie to np.. C:\Sun\AppServer\javadb\lib) 4. Zmodyfikuj zawartość metody void wyswietl_osoby() wg slajdu poniżej. 5. Dodaj metodę void wyswietl_wycieczki() - wyświetlanie zawartość tabeli TRIP 6. Dodaj metodę void wyswietl_wycieczki_osob() -- wyświetlanie wycieczek każdej osoby 7. Uruchom program Wynik działania programu (z lewej strony: zawartość tabeli TRIP, z prawej strony zawartość złączonych tabel PERSON i TRIP) Zadanie 3 cd zadania 2 dodawanie nowych osób do tabeli PERSON oraz dodawanie nowych wycieczek wybranej osoby do tabeli TRIP 1. 2. 3. 4. Wykonaj kopię programu Baza_2 jako Baza_3 (patrz instrukcja do lab3 - zad.2, pkt. 1) Zmień nazwę pliku baza_2 na baza_3 (patrz instrukcja do lab3 – zad.2, pkt. 2 ) Dodaj sterownik derbyclient.jar wg pkt3 z zad2. Dodaj metodę void wstaw_osobe() 4.1. dodaj pomocniczą klasę WeWy – do wprowadzania danych z klawiatury. Podczas edycji kodu zaimportuj brakująced biblioteki za pomocą Fix Imports (kliknij prawym klawiszem w oknie Edytora Javy i wybór opcji Fix Imports) class WeWy { static String weString(String menu) { InputStreamReader wejscie = new InputStreamReader(System.in); BufferedReader bufor = new BufferedReader(wejscie); try { System.out.print(menu); return bufor.readLine(); } catch (IOException e) { System.err.println("Blad IO String"); return ""; } } } 4.2. Dodaj klasę Person do wprowadzania danych do tabeli Person class Person { public String name, jobtitle; public void wstaw_tytul() { name = WeWy.weString("Podaj nazwisko: "); jobtitle = WeWy.weString("Podaj stanowisko pracy: "); } } 4.3. Dodaj metodę public String klucz_glowny(String sql1, String sql2) do klasy baza_3 w celu wyznaczenia wartości kolejnego klucza głównego. Metoda jest uniwersalna, ponieważ łańcuch sql2 + "."+sql1 tworzy nazwę pola klucza głównego w dowolnej tabeli (sql1 jest nazwą klucza głównego, a sql2 jest nazwą tabeli). Metoda zwraca wartość kolejnego klucza głównego, jakim można nadać nowej krotce lub null. public String klucz_glowny(String sql1, String sql2) { try { sql = " SELECT MAX(" + sql2 + "."+sql1 + ")+1 AS MAXID FROM " + sql2; krotki = polecenie.executeQuery(sql); krotki.next(); String pom = krotki.getString("MAXID"); return pom; } catch (Exception e) { } return null; } 4.4. Dodaj metodę void wstaw_osobe() do klasy baza_3 w celu dodania nowej krotki do tabeli PERSON public void wstaw_osobe() throws SQLException { String id_osoby; Person t = new Person(); t.wstaw_tytul(); polaczenie.setAutoCommit(false); try { polecenie = polaczenie.createStatement(); if((id_osoby = klucz_glowny("PERSONID", "TRAVEL.PERSON"))==null) return; sql = "INSERT INTO TRAVEL.PERSON (PERSONID,NAME,JOBTITLE,FREQUENTFLYER)" + " VALUES (" + id_osoby + ",'" + t.name + "','" + t.jobtitle + "'," + 0 + ")"; polecenie.addBatch(sql); polecenie.executeBatch(); polaczenie.commit(); } catch (BatchUpdateException e) { System.out.println("Wycofanie transakcji"); polaczenie.rollback(); } } 4.5. Wynik działania nowej metody 5. Dodawanie nowej krotki do tablicy TRIP 5.1. Dodaj klasę Trip do wprowadzania danych do tabeli TRIP. Metoda void wstaw_date() otrzymuje liczbę dni metodą weString() i dodaje je do daty bieżącej metodą setTime. Następnie wykorzystuje metodą SimpleDateFormat do nadania dacie formatu wymaganego w tabeli TRIP w bazie danych class Trip { public String depcity, destcity; String depdate; void wstaw_depcity() { depcity = WeWy.weString("Podaj miasto poczatkowe: "); } void wstaw_destcity() { destcity = WeWy.weString("Podaj miasto koncowe: "); } void wstaw_date() { Date pom1 = new Date(); String pom2 = WeWy.weString("Podaj date: "); // liczbe dni od dnia bieżącego pom1.setTime(pom1.getTime() + Long.parseLong(pom2) * 24 * 60 * 60 * 1000); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); depdate = format.format(pom1.getTime()); } public void wstaw_wycieczke() { wstaw_depcity(); wstaw_destcity(); wstaw_date(); } } 5.2. Należy dodać metodę public String wyszukaj_typ_wycieczki() do klasy baza_3 w celu wyszukania klucza głównego typu wycieczki, którą należy dodać. public String wyszukaj_typ_wycieczki() { try { String typ = WeWy.weString("Podaj typ wycieczki: "); sql = "SELECT * FROM TRAVEL.TRIPTYPE WHERE TRAVEL.TRIPTYPE.NAME = '" + typ + "'"; krotki = polecenie.executeQuery(sql); if (krotki.next()) { return krotki.getString("TRIPTYPEID"); } } catch (Exception e) { } return null; } 5.3. Należy dodać metodę public String wyszukaj_osobe() do klasy baza_3 w celu wyszukania klucza głównego osoby, której należy dodać nowa wycieczkę public String wyszukaj_osobe() { try { String name = WeWy.weString("Podaj nazwisko osoby: "); sql = "SELECT * FROM TRAVEL.PERSON WHERE TRAVEL.PERSON.NAME = '" + name + "'"; krotki = polecenie.executeQuery(sql); if (krotki.next()) { return krotki.getString("PERSONID"); } } catch (Exception e) { } return null; } 5.4. Należy dodać metodę public void wstaw_wycieczke() do klasy baza_3 w celu wstawienia nowej krotki do tabeli TRIP public void wstaw_wycieczke() throws SQLException { Trip k = new Trip(); k.wstaw_wycieczke(); String id_osoby, id_typ, id_trip; polaczenie.setAutoCommit(false); try { polecenie = polaczenie.createStatement(); if ((id_osoby = wyszukaj_osobe()) == null) { return; } if ((id_typ = wyszukaj_typ_wycieczki()) == null) { return; } if ((id_trip = klucz_glowny("TRIPID", "TRAVEL.TRIP")) == null) { return; } sql = "INSERT INTO TRAVEL.TRIP (DEPDATE,DEPCITY,DESTCITY,TRIPTYPEID,PERSONID,TRIPID)" + " VALUES ('" + k.depdate + "','" + k.depcity + "','" + k.destcity + "'," + id_typ + "," + id_osoby + "," + id_trip + ")"; polecenie.executeUpdate(sql); polecenie.executeBatch(); polaczenie.commit(); } catch (BatchUpdateException e) { System.out.println("Wycofanie transakcji"); polaczenie.rollback(); } } 5.5. Metoda main 5.6. Wynik działania nowej metody Zadanie 4 cd zadania 3 dodawanie przeszukiwania tabel PERSON dodawanie nowych krotek do wybranej tabeli z: HOTEL, FLIGHT, CARRENTAL lub TRIPTYPE dodanie dowolnej operacji na tabelach bazy danych travel 1. 2. 3. 4. 5. 6. Wykonaj kopię programu Baza_3 jako Baza_4 (patrz instrukcja do lab3 - zad.2, pkt. 1) Zmień nazwę pliku baza_3 na baza_4 (patrz instrukcja do lab3 – zad.2, pkt. 2 ) Dodaj sterownik derbyclient.jar wg pkt3 z zad2. Dodaj metodę public void wyszukaj_wg_stanowiska() throws SQLException, która wykonuje zapytanie wyszukiwania Osob wg stanowiska w tablicy PERSON Dodaj metodę, która wstawia nową krotkę do tabeli HOTEL, FLIGHT, CARRENTAL lub TRIPTYPE. Wykonaj dowolną operację w bazie danych travel. Zadanie 5 - dodatkowe 1. 2. Wykonaj interfejs graficzny użytkownika do wybranych operacji na bazie danych wykonanych w zadaniach1-4. Przykłady prostych programów z GUI do wyświetlania zawartości tabeli PERSON zamieszczono w przykładowych programach Baza_5 i Baza_6 dołączonych do laboratorium.