-
Notifications
You must be signed in to change notification settings - Fork 2
Instrukcja
Czyli jak OneWeb SQL przyspiesza programowanie przy wciąż zmieniającym się schemacie bazy danych
Zainstaluj na swoim komputerze następujące programy.
- Java 1.6 lub wyższa. Ustaw zmienną
JAVA_HOMEodpowiednio. - PowerDesigner 16. Wersję ewaluacyjną można pobrać ze strony http://response.sybase.com/forms/PDV16-EA
- Eclipse (http://www.eclipse.org/downloads/)
- PostgreSQL 9.1 (http://www.enterprisedb.com/products-services-training/pgdownload). Razem z PostgreSQL instaluje się program pgAdmin. Jako locale wybierz ’Polish’.
- Tomcat 7.0 (http://tomcat.apache.org/download-70.cgi)
- OneWebSQL PD2Java 1.0.0 (http://OneWebSQL.com/download)
W instrukcjach dla użytkowników używamy następujących skrótów.
-
<PROJECT>– główny katalog aplikacji demo -
<ONEWEBSQL HOME>– katalog, w którym jest zainstalowany OneWebSQL -
<TOMCAT HOME>– katalog, w którym jest zainstalowany serwer Tomcat
- Rozpakuj plik ZIP z aplikacją demo.
- Skonfiguruj projekt. Utwórz nowy projekt w Eclipse’ie File > New > Java Project ... i podaj lokalizację źródeł.
Sprawdź, że katalogi src,generated-sourcessą folderami źródłowymi (Source Folders). Załóż katalogWEB-INF\classesi ustaw go jako folder docelowy (Output Folder). - Skopiuj plik
<ONEWEBSQL HOME>\onewebsql-runtime-1.0.0.jardo katalogu<PROJECT>\WEB-INF\lib. Skopiowany plik dodaj do Build Path. - Do Build Path dodaj ścieżkę do pliku
<TOMCAT HOME>\lib\servlet-api.jar. - Przygotuj bazę danych. Uruchom program pgAdmin (został zainstalowany razem z PostgreSQL-em). Uruchom konsolę SQL.
- Stwórz użytkownika ’onewebsql’ z hasłem ’onewebsql’.
create user onewebsql password ’onewebsql’; - W ten sam sposób załóż bazę ’onewebsql’.
create database onewebsql owner onewebsql; - Połącz się z bazą danych jako użytkownik onewebsql.
- Uruchom skrypt zakładający tabele (
<PROJECT>\database\create-schema.sql), wstaw dane początkowe (skrypt<PROJECT>\database\initial-data.sql). - Skonfiguruj serwer Tomcat.
- kopiuj plik
<PROJECT>\lib\postgresql-9.1-902.jdbc3.jardo<TOMCAT HOME>\lib. - Do katalogu
<TOMCAT HOME>\conf\Catalina\localhostskopiuj plik<PROJECT>\META-INF\context.xml. Zmień jego nazwę naonewebsql.xml. - W pliku
onewebsql.xmlw atrybuciedocBasepodaj ścieżkę do projektu w Eclipse’ie. - Uruchom serwer Tomcat: plik
<TOMCAT HOME>\bin\startup.bat. - W przeglądarce otwórz stronę http://localhost:8080/onewebsql.
Będziemy pracować w prostej aplikacji WWW. Uruchom program PowerDesigner i otwórz plik
<PROJECT>\database\Bookshop.pdm. Plik zawiera początkowy schemat bazy danych.

Dla każdej tabeli OneWebSQL generuje 3 pliki Javy:
- prostego beana reprezentującego wiersze tabeli,
- interfejs DAO, dający dostęp do tabeli,
- implementację DAO.

Jak to w życiu bywa, schemat bazy danych będzie się zmieniał. Dlatego każde ćwiczenie rozwiązuj w osobnej metodzie. Wtedy zobaczysz, w jaki sposób OneWebSQL pomaga poprawić kod aplikacji po zmianie schematu bazy danych.
Użyjemy OneWebSQL-a w wersji standalone (jest też plugin do Maven 2). W Eclipse’ie wybierz Run > External Tools > External Tools Configurations... Utwórz nową konfigurację typu Program.

- Podaj javę jako program do uruchomienia.
- Jako katalog uruchomienia podaj swój projekt w Eclipse’ie.
- Podaj argumenty generatora:
-jar <ONEWEBSQL_HOME>\onewebsql-pd2java-1.0.0.jar -classpath <ONEWEBSQL_HOME>\onewebsql-runtime-1.0.0.jar -model_sets database\Bookshop.pdm -java_output_dir generated-sources -java_default_package com.onewebsql.demo.or -dictionaries_dir database - Zapisz konfigurację pod nazwą OneWebSQL. Uruchom generację.
- Odśwież projekt w Eclipse’ie.
- Obejrzyj kod klasy DemoServlet. Klasa zawiera szkielet aplikacji WWW. Główną metodą jest metoda doGet.
- Wypisz listę wszystkich książek. W metodzie doGet odkomentuj wywołanie metody
exercise1. Przeczytaj kod metodyexercise1. Do wypisania listy książek użyto metodygetBookList()w interfejsieBookDAO.
- Uporządkuj wypisywaną listę książek według tytułu
- rosnąco,
- malejąco.
- Wykorzystaj metody z interfejsu
BookDAO:getBookList(AExp orderByColumn)oraz `getBookList(AExp OrderByColumn, boolean ascending). Jako orderByColumn podaj stałąBookDAO.TITLE``. - Wypisz listę książek o id większym od 2. Użyj metody
getBookList(LExp whereClause)z interfejsuBookDAO. Warunek where powinien mieć postaćBookDAO.NAZWA KOLUMNY.gt(2). - Wypisz listę książek, których tytuły zaczynają się na literę A. Podpowiedź: użyj metody
like.
- Nie wszystkie zapytania można wygenerować za pomocą metod get*List() z klas typu DAO. Istnieje również obiektowy język zapytań, w którym zapytania SQL można tworzyć bezpośrednio. Zapytanie jest reprezentowane przez obiekt klasy SelectQuery. Obiekt tego typu można podać, np. do metody getBookList(SelectQuery query) w interfejsie BookDAO. Poniższy diagram pokazuje, które klasy odpowiadają różnym częściom zapytania SQL.
- Wypisz listę wszystkich książek używając obiektowego języka zapytań. Zapytanie, które pobiera dane z tabeli book tworzymy za pomocą
new SelectQuery(BookDAO.TABLE EXPRESSION)`. Zapytanie wykonujemy metodągetBookList(SelectQuery)w interfejsieBookDAO.SelectQuery query = new SelectQuery(BookDAO.TABLE_EXPRESSION);bookDAO.getBookList(query);`` - Powtórz poprzednie zapytania, używając obiektowego języka zapytań:
- Wypisz listę książek, których tytuły zaczynają się na literę A.
- Wypisz listę książek, które wydano po 2005 roku.
- Uporządkuj listę książek według roku wydania. Wykorzystaj metodę
orderByw klasieSelectQuery.
- Wypisz listę pierwszych 2 książek o ponad 100 stronach, w porządku alfabetycznym według tytułów. Wykorzystaj metodę
limit(int)w klasieSelectQuery.
Wszyscy wiemy, że zmiany schematu bazy danych są nieuniknione. Tym razem zmiana jest prosta: kolumna number of pages nie będzie nam potrzebna i chcemy ją usunąć. Na tym przykładzie pokażemy, jak wygląda proces dewelopmentu aplikacji z OneWebSQL-em.
- Zmień schemat bazy danych. W schemacie bazy danych w PowerDesignerze (plik \database\Bookshop.pdm) w ta- beli book usuń kolumnę number of pages. Zapisz zmiany w PowerDesignerze.
- Wygeneruj skrypt SQL. Wygeneruj skrypt zakładający bazę danych (Database > Generate Database...).
-
Wprowadź zmiany w bazie danych.
- W programie pgAdmin usuń wszystkie tabele w bazie onewebsql. Kliknij prawym klawiszem myszy na tabeli i wybierz Drop Cascaded.... Powtórz czynność dla sekwencji (węzeł Sequences).
- Uruchom wygenerowany przez PowerDesignera skrypt zakładający bazę danych. Kliknij ikonę Wykonaj dowolne zapytanie SQL. Wskaż lokalizację skryptu, a następnie kliknij przycisk Wykonaj zapytanie.
- Wstaw dane początkowe. Możesz użyć przygotowanego skryptu
<PROJECT>\database\initial-data-without-number-of-pages.sql.
- Wygeneruj klasy OneWebSQL-a. Uruchom generator, który skonfigurowaliśmy w części 2. Odśwież projekt w Eclipse’ie.
-
Popraw kod aplikacji.
Zauważ, że niekompatybilne zmiany są sygnalizowane w postaci błędów kompilacji. Nie musisz zastanawiać się, co trzeba poprawić. Popraw kilka metod, pozostałe możesz usunąć lub zakomentować.
- Wypisz listę książek, które należą do kategorii, których nazwa zaczyna się na literę P. Potrzebne zapytanie wykorzystuje dwie tabele: book i category. Możesz użyć:
- konstruktora klasy SelectQuery, który bierze listę tabel. Podaj odpowiedni warunek złączenia w metodzie
where. - konstruktora klasy
SelectQuery, który bierze obiekt typucom.onewebsql.query.Join. Użyj odpowiedniej metody statycznej z klasyJoin. - Wypisz listę książek i nazwę kategorii, do której dana książka należy. Rekomendowany sposób to utworzenie odpowiedniego widoku i wygenerowanie dla niego klas OneWebSQL-a.
- W PowerDesignerze w panelu Toolbox wybierz ikonę View z sekcji Physical Diagram i kliknij w diagram. Zakończ dodawanie widoku klikając w prawy przycisk.
- Zmień nazwę widoku. Kliknij dwukrotnie na ikonę widoku. W oknie dialogowym wpisz nazwę:
book_with_category_view. - W zakładkę SQL Query wpisz treść zapytania SQL:
SELECT
book.book_id,
book.category_code,
category.category_name,
book.title,
book.publication_year
FROM
book JOIN category ON book.category_code = category.category_code;
- Wciśnij OK a następnie zapisz model PowerDesignera.
W PowerDesignerze wygeneruj skrypt zakładający bazę danych. Skasuj tabele i sekwencje z bazy danych analogicznie jak w części 5. Następnie uruchom wygenerowany skrypt zakładający bazę danych i skrypt
<PROJECT>\initial-data-book-with-category-view.sql. Wygeneruj klasy OneWebSQL-a i odśwież projekt w Eclipse’ie. - Tę samą listę można wypisać inaczej, nie tworząc widoku, lecz korzystając z obiektowego języka zapytań.
- Utwórz obiekt SelectQuery reprezentujący zapytanie SQL z punktu 2c.
- Metody klas DAO w rodzaju getBookList(SelectQuery) przekształcają wyniki na obiekty klasy Book. Jeśli chcemy zwrócić obiekt innej klasy, musimy posłużyć się metodą selectObjectList(SelectQuery,RowHandler) i podać jej odpowiedni RowHandler.
public interface RowHandler<T> {
T getObject(ResultSet resultSet) throws SQLException;
}
Obiekty typu com.onewebsql.util.jdbc.RowHandler przekształcają wyniki bazy danych na obiekty Javy.

- Przykładowy kod istniejącego
RowHandlera.
public class ListRowHandler<T> implements RowHandler<List<T>> {
@SuppressWarnings("unchecked")
public List<T> getObject(ResultSet resultSet) throws SQLException {
int count = resultSet.getMetaData().getColumnCount();
List<T> result = new ArrayList<T>(count);
for (int i = 1; i <= count; i++) {
Object obj = resultSet.getObject(i);
if (resultSet.wasNull()) {
obj = null;
}
result.add((T) obj);
}
return result;
}
}
- Użyj obiektu
ListRowHandler<Object>, aby pobrać i wypisać wyniki zapytania utworzonego w punkcie 3a.