Projektowanie Aplikacji Rozproszonych Jarosław Kuchta. Wzorce projektowe warstwy danych



Podobne dokumenty
Wzorce projektowe warstwy danych

Projektowanie Aplikacji Internetowych Jarosław Kuchta. Wzorce projektowe warstwy biznesowej

Projektowanie Aplikacji Internetowych. Wzorce projektowe warstwy usług

"Biznesowe" wzorce projektowe

Warstwa integracji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Zagadnienia projektowania aplikacji J2EE

Wzorce logiki dziedziny

METODY PROGRAMOWANIA

Wzorce dystrybucji i wspólbieżności autonomicznej

Szczególne problemy projektowania aplikacji internetowych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Programowanie obiektowe

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Wzorce projektowe. dr inż. Marcin Pietroo

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Wywoływanie metod zdalnych

Programowanie obiektowe

Aplikacje RMI

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

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

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Programowanie w języku Java WYKŁAD

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

Projektowanie obiektowe Wzorce projektowe

Metody dostępu do danych

Enkapsulacja, dziedziczenie, polimorfizm

Zaawansowane programowanie w C++ (PCP)

Builder (budowniczy) Cel: Przykład:

Wywoływanie metod zdalnych

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2017

Podejście obiektowe do relacyjnych baz danych Hibernate.

Enterprise JavaBeans

1 Wprowadzenie do J2EE

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

JAVA I BAZY DANYCH. MATERIAŁY:

Zasady generowania kluczy głównych Język Java Persistence Podstawowa architektura wielowarstwowych aplikacji w oparciu o wzorce oprogramowania

Prototype (prototyp) Cel: Przykład: Określenie rodzaju tworzonych obiektów poprzez wskazanie ich prototypu. Nowe instancje tworzymy kopiując prototyp.

Programowanie obiektowe

Programowanie obiektowe

Plik pobrano z Tytuł: Wzorce projektowe, cz. 2 Strategy Ostatnia aktualizacja:

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Jarosław Kuchta Projektowanie Aplikacji Internetowych. Projektowanie warstwy danych

Analiza i projektowanie obiektowe 2016/2017. Wykład 11: Zaawansowane wzorce projektowe (1)

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Problemy projektowania obiektowego. Czy podobne problemy można rozwiązywac w podobny sposób?

Plan prezentacji. Budowa aplikacji w technologii Enterprise JavaBeans. Przegląd architektur: CORBA. Cele budowy aplikacji rozproszonych

Java: interfejsy i klasy wewnętrzne

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

Programowanie komponentowe 5

PHP 5 język obiektowy

Remote Method Invocation 17 listopada 2010

Aplikacje internetowe i rozproszone - laboratorium

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Wzorce projektowe. Wstęp

Omówienie wzorców wykorzystywanych w Prism 5.0. Dominika Różycka

Projektowanie struktury danych

Wzorce prezentacji internetowych

EJB 3.0 (Enterprise JavaBeans 3.0)

Przykładowa implementacja

Podejście obiektowe do budowy systemów rozproszonych

Klasy i obiekty cz II

Bezstanowe komponenty sesyjne i zdarzenia zwrotne

Dokumentacja do API Javy.

Metody dostępu do danych

Projektowanie obiektowe oprogramowania Wykład 4 wzorce projektowe cz.i. wzorce podstawowe i kreacyjne Wiktor Zychla 2015

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Projektowanie warstwy danych

Programowanie wielowarstwowe i komponentowe

Komponenty sterowane komunikatami

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Programowanie obiektowe

Abstract Factory (fabryka abstrakcyjna)

Wzorce projektowe. dr inż. Marcin Pietroo

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

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

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Aplikacje RMI Lab4

akademia androida Składowanie danych część VI

Technologie obiektowe

Kurs programowania aplikacji bazodanowych

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Kurs WWW. Paweł Rajba.

Budowa prostej aplikacji wielowarstwowej. Laboratorium 1 Programowanie komponentowe Zofia Kruczkiewicz

Informacje wstępne Autor Zofia Kruczkiewicz Wzorce oprogramowania 4

Programowanie zorientowane obiektowo. Mateusz Kołecki

Polimorfizm. dr Jarosław Skaruz

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

Aplikacje Internetowe. Najprostsza aplikacja. Komponenty Javy. Podstawy języka Java

Wzorce projektowe cz. II. Wzorce projektowe cz. II 1/35

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

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Warstwa prezentacji. wg. D.Alur, J.Crupi, D. Malks, Core J2EE. Wzorce projektowe.

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Kurs programowania aplikacji bazodanowych

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Transkrypt:

Rozproszonych Jarosław Kuchta Wzorce projektowe warstwy danych

Wzorce projektowe Core J2EE Patterns (podział umowny) Warstwy danych: Data Access Object, Transfer Object, Value List Handler Warstwy biznesowej: Transfer Object Assembler, Composite Entry, Business Delegate Warstwy usług: Service Locator, Service Activator, Session Facade, Warstwy aplikacji: Front Controller, Dispatcher View, Service To Worker Warstwy prezentacji: Intercepting Filter, View Helper, Composite View 2

Wzorce projektowe warstwy dostępu do danych Data Access Object (DAO) Uniezależnia warstwę danych od sposobu dostępu do danych (np. zastosowanego systemu bazy danych) Transfer Object Łączy w jednym obiekcie dane pobierane ze źródła danych i przekazywane z warstwy danych do warstwą usług Value List Handler Ułatwia przekazywanie listy wartości z warstwy danych partiami do warstwy usług 3

Data Access Object 4

DAO spostrzeżenia i problemy Dane komponentów biznesowych muszą być przechowywane w pamięci trwałej (masowej). Interfejs API pamięci trwałej zależy od typu pamięci: pliki danych pliki XML relacyjne bazy danych (RDBMS) obiektowo-relacyjne bazy danych (ORDBMS) obiektowe bazy danych (OODBMS) API zależy również od dostawcy produktu zapewniającego przechowywanie danych. Zmiana dostawcy powoduje modyfikację komponentów warstwy danych. Uniezależnienie aplikacji od systemu przechowywania danych wymaga stworzenia uniwersalnego API dostępu do danych w pamięci masowej. 5

DAO - rozwiązanie Komponent dostępu do danych (DAO Data Access Object) zapewnia jednolity dostęp do różnych źródeł danych. Źródłem danych może być: system relacyjnej bazy danych (RDBMS) repozytorium plików XML system wymiany danych (B2B) usługa biznesowa dostępna przez protokół CORBA inny mechanizm przechowywania i udostępniania danych DAO zapewnia wspólny, uproszczony interfejs ukrywający szczegóły implementacyjne. Interfejs DAO nie zmienia się wraz z implementacją źródła danych, DAO uniezależnia warstwę biznesową od zastosowanego mechanizmu dostępu do danych. 6

DAO struktura komponentów Business Object uses Data Access Object encapsulates Data Source obtains/modifies optional} Transfer Object creates/uses optional} RDBMS XML B2B Corba 7

DAO współdziałanie komponentów Business Object 1: Create Data Access Object Data Source 2: Get Data 2.1: Get Data 2.3: Return Object 2.2: Create Transfer Object 3: Get Property 4: Set Property 5: Set Data 5.1: Get Property 5.2: Get Property 5.3: Set Data 8

DAO strategie implementacyjne Strategia z automatycznym generowaniem kodu DAO Strategia z fabryką obiektów DAO 9

Automatyczne generowanie kodu DAO (przykład ADO.NET) 10

Strategia z fabryką DAO Factory Method Abstract Factory DAO Factory abstract} DAO Factory XML DAO Factory RDB DAO Factory OODB DAO Factory creates creates creates creates creates creates creates creates DAO_1 DAO_2 XML DAO1 XML DAO2 RDB DAO1 RDB DAO2 OODB DAO1 OODB DAO2 «interface» DAO1 «interface» DAO2 «interface» DAO1 «interface» DAO2 11

Przykład system zamówień «interface» CustomerDAO Client uses Customer_DAO encapsulates AnyCompDB obtains/ modifies creates CustomerData 12

Przykład wzorzec z pojedynczą fabryką DAO DAOFactory getcustomerdao(): CustomerDAO getaccountdao(): AccountDAO getorderdao(): OrderDAO Customer_DAO Account_DAO Order_DAO «interface» CustomerDAO «interface» AccountDAO «interface» OrderDAO 13

Przykład kod fabryki DAO public class DAOFactory // tworzenie połączenia do bazy danych public static Connection createconnection()... } // metoda tworzenia obiektu DAO dla klasy Customer public CustomerDAO getcustomerdao() return new Customer_DAO(); } // metoda tworzenia obiektu DAO dla klasy Account public AccountDAO getaccountdao() return new Account_DAO(); } // metoda tworzenia obiektu DAO dla klasy Order public OrderDAO getorderdao() return new Order_DAO(); }... } 14

Przykład wzorzec z abstrakcyjną fabryką DAO DAOFactory abstract} getcustomerdata(): CustomerData getaccountdata): AccountData getorderdata(): OrderData MySQL_DAOFactory MsSQL_DAOFactory Oracle_DAOFactory MySQLCustomer_DAO MsSQLCustomer_DAO OracleCustomer_DAO «interface» CustomerDAO 15

Przykład kod abstrakcyjnej fabryki DAO public abstract class DAOFactory // typy implementacyjne wspierane przez fabrykę public static final int MYSQL = 1; public static final int MSSQL = 2; public static final int ORACLE = 3; // abstrakcyjne metody tworzenia obiektów DAO public abstract CustomerDAO getcustomerdao(); public abstract AccountDAO getaccountdao(); public abstract OrderDAO getorderdao(); // metoda tworzenia konkretnej fabryki DAO public static DAOFactory getdaofactory (int whichfactory) switch (whichfactory) case MYSQL: return new MySQL_DAOFactory(); case MSSQL: return new MsSQL_DAOFactory(); case ORACLE: return new Oracle_DAOFactory(); } } } default: return null; 16

Przykład interfejs i klasa implementująca obiekt DAO «interface» CustomerDAO insertcustomer (data: CustomerData): integer; deletecustomer (ID: integer): boolean; findcustomer (ID: integer): CustomerData; updatecustomer (data: CustomerData): boolean; public class Customer_DAO implements CustomerDAO } public Customer_DAO()... } public int insertcustomer(customerdata data)... } public boolean deletecustomer(int ID)... } public CustomerData findcustomer(int ID)... } public boolean updatecustomer(customerdata data)... } 17

Przykład klasa trwała i obiekt transferowy do przekazywania Customer persistent} firstname: string lastname: string danych realization CustomerData ID: int; firstname: string lastname: string // klasa implementuje interfejs Serializable - dla automatyzacji tranferu danych public class CustomerData implements java.io.serializable // pola danych int ID; public String firstname;... } public String lastname; 18

Przykład kod klienta wykorzystującego fabrykę DAO // 1. Utworzenie fabryki DAO dla implementacji MYSQL DAOFactory afactory = DAOFactory.getDAOFactory(DAOFactory.MYSQL); // 2. Utworzenie obiektu DAO CustomerDAO custdao = afactory.getcustomerdao(); // 3. Znalezienie encji danych i pobranie przez obiekt transferowy CustomerData custdata = custdao.findcustomer (...); // 4. Modyfikacja encji danych po stronie klienta custdata.setfirstname (...); custdata.setlastname (...); // 5. Aktualizacja danych po stronie serwera poprzez obiekt DAO custdao.updatecustomer(custdata); 19

Zalety i wady DAO Zalety: Zapewnienie transparentności Zapewnienie przenośności Zmniejszenie złożoności kodu obiektów biznesowych Centralizacja dostępu do danych w osobnej warstwie Wady Nieprzydatne przy zapewnianiu trwałości przez kontener (CMP) Wprowadzenie dodatkowej warstwy Wymagane zaprojektowanie całej hierarchii klas 20

Transfer Object 21

Transfer Object - spostrzeżenia Dostęp do obiektów biznesowych przez zdalne interfejsy narzut sieciowy. Klient zazwyczaj wymaga wartości więcej niż jednego atrybutu od obiektu biznesowego wykonuje wiele wywołań zdalnych dla pozyskania wymaganych danych. Duża liczba wywołań komponentów warstwy biznesowej przez klienta obniża wydajność sieci. Zazwyczaj aplikacje częściej dokonują transakcji odczytu niż transakcji aktualizacji danych. 22

Wzorzec Transfer Object - rozwiązanie Gdy klient żąda danych od obiektu biznesowego, ten tworzy obiekt transferowy, wypełnia go wartościami atrybutów i wysyła go do klienta przez wartość. Klient odczytuje właściwości z instancji obiektu transferowego za pomocą prostych metod dostępu bez pośrednictwa zdalnego interfejsu. Do utworzenia i wysłania obiektu transferowego wystarczy pojedyncze wywołanie zdalnego interfejsu. 23

Transfer Object struktura komponentów uses Transfer Object creates Client requests Business Object «entity» Business Entity «session» Business Session Data Access Object 24

Transfer Object współdziałanie komponentów Client Business Object 1: Get Data 1.1: Create Server Copy: Transfer Object 1.2: Return Object 1.2.1: Create Client Copy: Transfer Object 2: Get Property 3: Get Property 25

Transfer Object strategie implementacyjne Strategia z modyfikowalnym obiektem transferowym Strategia z wieloma obiektami transferowymi Strategia z rozszerzaniem obiektu transferowego przez komponent encji Strategia z fabryką obiektów transferowych 26

Modyfikowalny obiekt transferowy Client 1: Get Data Business Object 1.1: Create Server Copy: Transfer Object 1.2: Return Object 1.2.1: Create Client Copy: Transfer Object 2: Get Property 4: Set Property 5: Set Data 5.1: Create Modified Copy: Transfer Object 5.2: Get Updated Values 5.3: Merge Changes 27

Przykład kod obiektu transferowego // obiekt trasferowy dla klasy "Customer" public class CustomerData implements java.io.serializable // pola danych private int ID; private String firstname; private String lastname; } // konstruktor inicjujący identyfikator encji public CustomerData (int aid) ID = aid; } // metody pobierania danych public int getid() return ID; } public String getfirstname() return firstname; } public String getlastname() return lastname; } // metody modyfikacji danych - nie można modyfikować pola ID public void setfirstname (String value) firstname = value; } public void setlastname (String value) lastname = value; } 28

Przykład modyfikowalny obiekt transferowy z flagami modyfikacji // obiekt transferowy dla klasy "Customer" public class CustomerData implements java.io.serializable private int ID; private String firstname; private String lastname; // flagi oznaczające, które pole zostało zmodyfikowane public static final int FIRST_NAME = 1; public static final int LAST_NAME = 2; // pole zawierające flagi oraz metody dostępu do tego pola private int ismodified; public int getismodified() return ismodified;} public void clearismodified() ismodified = 0; }... // metoda modyfikacji pola danych - ustawia flagę modyfikacji public void setfirstname (String value) if (value!=firstname) firstname = value; ismodified = FIRST_NAME; } }... 29

Przykład obiekt biznesowy implementowany jako komponent encji // klasa warstwy biznesowej implementująca interfejs encji public class CustomerEntity implements EntityBean private EntityContext context; // pole wymagane dla encji public int ID; public String FirstName; public String LastName; // metoda pobrania danych encji - tworzy obiekt transferowy // i ustala jego dane - ale czyści flagi modyfikacji public CustomerData getdata() CustomerData result = new CustomerData (ID); result.setfirstname(firstname); result.setlastname(lastname); result.clearismodified(); return result; }... 30

Wiele obiektów transferowych // klasa biznesowa korzystająca z obiektów "Customer" i "Address" public class CustomerEntity implements EntityBean private EntityContext context; // pole wymagane dla klasy encji public int ID; public String FirstName; public String LastName; public Address HomeAddress; // dodatkowy obiekt adresu // pobranie danych obiektu "Customer" public CustomerData getdata()... } // pobranie danych obiektu "Address" skojarzonego przez ID public AddressData getaddressdata() AddressData result = new AddressData (ID);... return result; }... 31

Rozszerzanie klasy obiektu transferowego przez klasę biznesową // Klasa obiektu transferowego zdefiniowana w warstwie danych public class CustomerData implements java.io.serializable protected int ID; protected String firstname; protected String lastname;... // konstruktor kopiujący dane z obiektu źródłowego public CustomerData (CustomerData src)... }... } // Klasa warstwy biznesowej rozszerzająca klasę obiektu transferowego // i implementująca interfejs encji public class CustomerEntity extends CustomerData implements EntityBean // metoda pobrania danych wykorzystująca konstruktor odziedziczony public CustomerData getcustomerdata() return new CustomerData(this); }... } 32

Strategia z fabryką obiektów transferowych «interface» Value B «interface» Value A Transfer Object B Complete Transfer Object Transfer Object A creates creates Transfer Object Factory «entity» Business Object requests uses uses Client uses 33

Implementacja fabryki // Klasa fabryki tworzącej obiekty transferowe dla danej klasy encji public class TransferObjectFactory private static HashMap classdatainfo = new HashMap(); // metoda tworzenia obiektu transferowego dla podanego komponentu // encyjnego ejb, podanego typu obiektu transferowego whichtotype // oraz typu obiektu kompletnego completetotype public static java.io.serializable createtransferobject (Object ejb, String whichtotype, String completetotype) ClassData cdata = getclassdata (completetotype); ClassData vocdata = getclassdata (whichtotype); Object whichto = Class.forName(whichTOType).newInstance(); // kopiowanie wspólnych pól z obiektu klasy completetotype // do pól obiektu klasy whichtotype... return (java.io.serializable)whichto; } 34

Zalety i wady wzorca Zalety Uproszczenie komponentu encyjnego i jego interfejsu zdalnego dostępu Przekazywanie większej ilości danych przez mniejszą liczbę zdalnych wywołań Zmniejszenie ruchu w sieci Zmniejszenie powielania się kodu Wady Możliwość pojawiania się nieaktualnych obiektów transferowych Zwiększenie złożoności kodu w związku z synchronizacją i kontrolą wersji Problemy z zapewnieniem dostępu równoległego 35

Value List Handler 36

Value List Handler - spostrzeżenia Wynikiem wyszukiwania danych są często bardzo duże listy, a klient raczej nie potrzebuje wszystkich wyników Po stronie serwera potrzebny jest bufor przechowujący wyszukane dane dla klienta. Klienci chcą poruszać się po zbiorze wynikowym zarówno w przód, jak i w tył. Zapytanie wykonywane w sposób powtarzalny na nie zmienianych danych może być zoptymalizowane. 37

Value List Handler - rozwiązanie Wzorzec Value List Handler umożliwia przechowywanie wyników wyszukiwania po stronie serwera. Wyniki te są dostarczane do klienta w postaci listy, której rozmiar i możliwości nawigacyjne są dostosowane do wymagań klienta. 38

Value List Handler struktura komponentów «interface» Value List Iterator Client uses Value List Handler iterates «list» Value List Value Object provides data accesses Data Access Object 39

Value List Handler współdziałanie komponentów Client Data Access Object 1: Create Value List Handler 2: Search 2.1: Search 2.2: Return Value List 2.1.1: Create «list» Value List 3: Get Next 3.2: Return Sub-List 3.1: Get Sub-List 3.1.1: Return Sub-List 3: Get Prior 3.2: Return Sub-List 3.1: Get Sub-List 3.1.1: Return Sub-List 40

Strategie implementacji Implementacja przez zwykły obiekt Javy przydatna dla prostszych aplikacji Implementacja jako stanowy komponent sesji pełniący rolę fasady 41

Przykład implementacja listy wartości przez zwykłą klasę Javy (1) // Klasa implementuje interfejs iteratora po liście wartości public class ValueListHandler implements ValueListIterator protected List list; // wewnętrzna lista wartości protected ListIterator listiterator; // wewnętrzny iterator // konstruktor inicjujący public ValueListHandler(List list) this.list = list; listiterator = list.listiterator(); } // metoda dostępu do wewnętrznej listy public Collection getlist() return list; } // metoda dostępu do liczby elementów public int getsize() return list.size(); } 42

Przykład implementacja listy wartości przez zwykłą klasę Javy (2) // metoda dostępu do elementu bieżącego public Object getcurrentelement() int currindex = listiterator.nextindex(); return list.get(currindex); } // metoda dostępu do elementu następnego public List getnextelements(int count) int i = 0; Object object = null; LinkedList list = new LinkedList(); while (listiterator.hasnext() && (i < count) ) object = listiterator.next(); list.add(object); i++; } } // analogiczna metoda dostępu do elementu poprzedniego public List getpreviouselements(int count) } 43

Przykład implementacja listy wartości z wykorzystaniem obiektu DAO (1) public class Customer_DAO // nazwa tabeli danych final private String tablename = "CUSTOMERS"; // wykorzystywane pola danych - fragment dla języka SQL final private String fields = "id, firstname, lastname";... // funkcja wyboru danych z tabeli - przez konstruowane wyrażenie SQL private List executeselect(customerdata criteria) // przygotowanie do połączenia z bazą danych Statement stmt= null; List list = null; Connection con = getconnection(); StringBuffer selectstatement = new StringBuffer(); // tworzenie wyrażenia SQL selectstatement.append("select "+ fields + " FROM " + tablename + "where 1=1");... 44

Przykład implementacja listy wartości z wykorzystaniem obiektu DAO (2) // opcjonalne dodanie kryteriów wyboru - zwłaszcza wg pola ID // depending on the values specified in criteria if (criteria.getid()!= 0) selectstatement.append (" AND ID = " + criteria.getid()); }... // chronione otwarcie połączenia z bazą danych i wykonanie zapytania SQL try stmt = con.preparestatement(selectstatement); stmt.setstring(1, resourceid); ResultSet rs = stmt.executequery(); list = prepareresult(rs); stmt.close(); } finally con.close(); } return list; } 45

Przykład implementacja listy wartości z wykorzystaniem obiektu DAO (3) // opracowanie wyników zapytania SQL // pobranie danych do wynikowej listy danych private List prepareresult (ResultSet rs) ArrayList list = new ArrayList(); // wynikowa lista danych while (rs.next()) int i = 1; // utworzenie obiektu dla każdego rekordu CustomerData custdata = new CustomerData(new Integer(rs.getString(i++)).intValue()); // przepisanie danych do obiektu i dodanie do wynikowej listy danych custdata.setfirstname(rs.getstring(i++)); custdata.setlastname(rs.getstring(i++)); custdata.clearismodified(); list.add(custdata); } return list; } 46

Zalety i wady wzorca Zalety Alternatywa dla metody wyszukiwania dla dużych zapytań Zapewnienie większej elastyczności zapytań Zwiększenie wydajności sieci Umożliwienie opóźnienia transakcji Wady Przechowywanie wyników zapytania po stronie serwera 47

Literatura Rysunki i przykłady pochodzą z następujących źródeł: http://java.sun.com/blueprints/corej2eepatterns/patterns/dataaccessobject.html http://java.sun.com/blueprints/corej2eepatterns/patterns/transferobject.html http://java.sun.com/blueprints/corej2eepatterns/patterns/valuelisthandler.html Literatura uzupełniająca: Gamma et al: Wzorce projektowe, WNT Warszawa 2005 http://student.agh.edu.pl/~zegarow/filez/wzorce/wzorce_projektowe.pdf Buschman et al: Pattern-Oriented Software Architecture Volume 1: A System of Patterns, Wyd. Wiley, Schmidt et al: Pattern-Oriented Software Architecture Volume 2: Patterns for Concurrent and Networked Objects, Wyd. Wiley, 48