Vrstvy internetových a intranetových systémov RNDr. Ľubor Šešera, PhD. 1.10.2010
IS: Architektúra na báze vrstiev (1) Hlavný prístup k tvorbe inform. systémov (IS): Tvorba systému na báze vertikálnych vrstiev (Tiers vs. layers) Výhody vrstiev: Dekompozícia zložitosti systému Časti majú presne definované rozhrania Vrstvy môžu byť založené na štandardoch Zvyšujú opakovanú použiteľnosť Element na nižšej vrstve na viac. miestach vyššej vrstvy Umožňujú realizáciu rôznymi softvérovými prostriedkami Umožňujú prevádzku jednotlivých vrstvy na inom počítači Rozdelenie zodpovednosti vo vývojom tíme 2
IS: Architektúra na báze vrstiev (2) Nevýhody vrstiev: Nezapúzdrujú dobre všetky veci. Zmena v niektorej úrovni si niekedy vyžiada šírenie zmien. Môžu si vyžiadať netriviálne transformácie dát medzi vrstvami Tvorba vrstiev znižuje výkonnosť. 3
IS: Architektúra na báze vrstiev - história Do 90-tych rokov sa vrstvy v IS príliš nepoužívali V 90-tych rokoch: Systémy typu klient-server 2 vrstvy: klient a server Pozor: architekt. štýl klient-server je všeobecnejší Vyšlo z HW: PC v LAN a centrálny počítač Klient: graf. používateľský interfejs +aplikačný kód Server: relačná databáza Prostriedky: Visual Basic, Powerbuilder, Delphi,... Výhodné ak IS iba jednoduché zobrazovanie a jednoduchá aktualizácia dát aplikačný kód bol súčasťou obrazoviek problém spoločného kódu pre viacero obrazoviek a komplexnej business logiky 4
IS: Architektúra na báze vrstiev - história Objektovo-orientované programovanie prinieslo 3 vrstvovú architektúru model-view-controler v Smalltalku málo rozšírené, nie pre distrib. architektúru Skutočná zmena až nástupom internetu potreba využívania internetových prehliadačov je nákladné a zdĺhavé sťahovanie aplikačnej logiky z centra (+ bezpečnosť) preto sa aplikačná logika oddeľuje od prezentačnej časti a umiestňuje na server 5
IS: Architektúra na báze vrstiev - história Ďalšie faktory Bolestivá zmena existujúcich systémov z dôvodu prepletenia aplikačnej a prezentačnej vrstvy Ďalšie typy prezentačnej vrstvy, napríklad rozhrania pre mobilné zariadenia Jednoduchšia administrácia Na PC je iba internetový prehliadač Rozširovanie jazyka Java Nie je natoľko zviazaný s jazykom SQL a je vhodnejší pre vývoj aplikačnej logiky 6
Vrstvy moderných IS 1. Prezentačná vrstva Prístup používateľa k systému 2. Aplikačná vrstva Výpočtová časť systému 3. Dátová vrstva Trvalé (perzistentné) uchovávanie dát v databáze + Medzivrstvy 1.5 (Aplikačná) Servisná vrstva 2.5 Dátová servisná vrstva 7 (vrstva dátových služieb)
Vrstvy moderných IS Nie sú vrstvy abstrakcie, ale viacúrovňový architekt. štýl klient-server cmp 3.1-Vrstv y Prezentačná vrstva. Servisná vrstva. Aplikačná vrstva. Vrstva dátových služieb. Dátová vrstva. 8
Dôvody odčlen. prezentačnej vrstvy Používateľské rozhranie sa zvyčajne mení častejšie ako aplikačná logika Tie isté dáta zobrazovať rôznym spôsobom Rôzne časti prezentačnej vrstvy môžu využívať rovnaké funkcie aplikačnej vrstvy Rôzne technológie HTML versus Java Príklad rozdelenia prezentačná domén. vrstva Zobrazenie neplatičov červenou Aplikačná vrstva bool. funkcia: platič-neplatič Prezentačná vrstva farebné zobrazenie 9
Základné typy architektúr Jednoduchá PV spojená s AV, bez SV, jedn. DS Jedn. PV, jedn. AV, bez SV, jedn. DS Jedn. PV, jedn. AV, bez SV, komplexná DS Komplexná PV, jedn. AV, bez SV, komplexná DS Jednoduchá PV, komplex. AV, so SV, komplex. DS Komplexná PV, komplex. AV, so SV, komplex. DS 10
Fyzické vrstvy Internetový systém s tenkým klientom: dátová vrstva je na 1 HW serveri, AV a PV na inom HW serveri Internetový systém s poloťažkým klientom: PV je rozdelená medzi server a PC Internetový systém s oddeleným prezentačným a aplikačným serverom Intranetový systém s ťažkým klientom: PV je na PC Systém s rozdelenou aplikačnou vrstvou časť AV je v uložených procedúrach na DB serveri Systém so spoločným aplikačným a DB serverom 11
J2EE (1999) sada špecifikácií 1. Java Servlet, verzia 2.2 2. JavaServer Pages (JSP), verzia 1.1 3. Enterprise JavaBeans (EJB), verzia 1.1 4. Java Message Service (JMS), verzia 1.0.2 5. Java Naming and Directory Interface (JNDI), v. 1.2 6. JavaBeans Activation Framework (JAF), verzia 1.0 7. Java Transaction API (JTA), verzia 1.0.1 8. Java Transaction Service (JTS), verzia 0.95 9. Java Database Connectivity (JDBC), verzia 2.0 10.JavaMail API, verzia 1.1
J2EE / JEE Štandard J2EE bol priebežne (cca v trojročných intervaloch) aktualizovaný Najmä problémy so špecifikáciou EJB EJB 2.0 (2001) + lokálne volania metód EJB 3.0 (2006) zmena mapovania na relačné DB, pomocou Java Persistence API (JPA) Doplnenie ďalších špecifikácií, napr. Web Services for J2EE Využitie XML (JAXP a ďalšie) Novšia prezent. vrstva (Java Server Faces, JSF) (2006) nový názov Java EE verzia 5 (2009) JEE verzia 6 13
Základné architektúry v JEE 1. Implementácia bez EJB a bez JPA 2. Implementácia bez EJB a s ORM/JPA 3. Implementácia s EJB a s JPA 14
Architektúra v JEE bez EJB a bez JPA cmp 3.3 Vrstv y v JEE - alt. 1 «JSP,POJO» Prezentačná a aplikačná vrstva «JDBC» Vrstva dátových služieb. «SQL» Dátová vrstva 15
Architektúra v JEE bez EJB a s JPA cmp 3.3 Vrstv y v JEE - alt. 1 «JSF,JSP» Prezentačná vrstva «POJO» Aplikačná vrstva. «JPA» Vrstva dátových služieb «SQL» Dátová vrstva 16
Architektúra v JEE s EJB a s JPA cmp 3.5 Vrstv y v JEE - alt. 3 «JSF,JSP» Prezentačná vrstva «EJB» Aplikačná vrstva «SQL» Dátová vrstva «Session EJB» Servisná vrstva «Entity EJB» Doménová vrstva «JPA» Vrstva dátových služieb 17
Bankový systém príklad Jednoduchý príklad časti bankového systému účet klienta operácie s účtom: vklad, výber, prevod cez viacero kanálov: pokladník, call centrum, internet banking, mobil banking,... pri operáciách sa vyrubujú poplatky predpokladajme okamžite (nie dávkovo) pri operácii môže byť viacero poplatkov predpokladajme, že klient nemá balík služieb nad operatívnou úrovňou je metaúroveň typy účtov, operácií, poplatkov so vzájomnými vzťahmi sadzby poplatkov oddelené od typov poplatkov rôzne spôsoby výpočtu poplatkov fixný, percentuálny, percentuálny s ohraničením, hladinový,... neuvažujeme integráciu s inými systémami
Typ Uctu kod nazov TypPoplatku kod nazov TypOperacie iductu stavuctu Ucet idsadzby sposobvypoctu sadzba minsadzba maxsadzba sumaoperacieod sumaoperaciedo platnostod platnostdo SadzbaPoplatku idoperacie datum suma protiucet bankaprotiuctu Operacia. idpoplatku sumapoplatku Poplatok kodpoplatku * 1 * * kodoperacie * 1 idoperacie * 1 typuctu * 1 idsadzby * 1 * * iductu * 0..1
Aplikačná vrstva 20
Vzory pre aplikačnú a servisnú vrstvu Transakčný scenár procedurálny spôsob návrhu systému Doménový model objektovo orientovaný návrh systému Servisná vrstva Často dopĺňa Doménový model Rozhranie + špecifická a technická funkcionalita Príklad: Vytvorenie operácie vytvorenie inštancie operácie vypočítanie a zaznamenanie poplatkov
Transakčný scenár Procedúra, ktorá: 1. Preberie vstupy z prezentačnej vrstvy 2. Vykoná príslušné (netriviálne) kontroly a výpočty 3. Vyvolá vrstvu dátových služieb na získanie alebo uloženie dát 4. Výsledok vráti prezentačnej vrstve 22
Transakčný scenár Jeden Transakčný scenár pre každú akciu používateľa Zvyčajne tiež predstavuje jednu databázovú transakciu Odtiaľ názov vzoru Výhody: Priamočiara realizácia Nevýhody: Sklon k duplikovaniu kódu Horšia údržba a rozširovanie kódu 23
Transakčný scenár Prezentačná vrstva posiela transferový objekt (TO) Aplikačná vrstva Trieda transakčných scenárov pre Služby operácií Výpočet poplatkov funkcia využívaná viacerými transakčnými skriptami Vrstva dátových služieb napr. Brána k tabuľke obaľuje príkaz SELECT Príklad neskôr
Transakčný scenár class SluzbyOperacii { public vytvoroperaciu (TO toperacia) { try { ResultSet operacie = operaciatablegateway.vytvoroperaciu (TO toperacia); try { operacia.next(); Long idoperacie = operacia.getlong(1); String kodoperacie = toperacia.getkodoperacie(); BigDecimal sumaoperacie = toperacia.getsuma(); ResultSet typypoplatkov = typpoplatkutablegateway. najditypypoplatkov(kodoperacie); 25
Transakčný scenár while (typypoplatkov.next()) { String kodpoplatku = typypoplatkov.getstring ( kodpoplatku ); ResultSet vysledoksql = sadzbapoplatkutablegateway. najdisadzbu(kodpoplatku, new Date(),sumaOperacie); while (vysledoksql.next()) { Long idsadzby = new Long (vysledoksql.getlong(1)); String sposobvypoctu = vysledoksql.getstring(2); BigDecimal sadzba = vysledoksql.getbigdecimal(3);... BigDecimal vyskapoplatku = sluzbypoplatkov.vypocitajpoplatok ( sposobvypoctu, sadzba, minsadzba, ); poplatoktablegateway.vytvorpoplatok (idsadzby, ) } } } catch (SQLException e { }
Transakčný scenár public class SluzbyPoplatkov { public BigDecimal vypocitajpoplatok (SadzbaPoplatku sadzbapoplatku, BigDecimal sumaoperacie) { String sposobvypoctu = sadzbapoplatku.getsposobvypoctu(); BigDecimal sadzba = sadzbapoplatku.getsadzba(); BigDecimal minsadzba = sadzbapoplatku.getminsadzba(); BigDecimal maxsadzba = sadzbapoplatku.getmaxsadzba(); if (sposobvypoctu.equals( fixny )) { return sadzba; } else if (sposobvypoctu.equals( percentualny )) { return sumaoperacie.multiply(sadzba); 27
Transakčný scenár } } } else if (sposobvypoctu.equals( percentualnyohran )) { BigDecimal vyskapoplatku = sumaoperacie.multiply(sadzba); if (vyskapoplatku.compareto(minsadzba) < 0) { return minsadzba; } else if (vyskapoplatku.compareto(maxsadzba) > 0) { return maxsadzba; } else { return vyskapoplatku; } } 28
Doménový model Protipól Transakčného scenára Systém je štrukúrovaný dátovo Prirodzenejšie reprezentuje aplikačnú oblasť Transakčný scenár predstavuje viac algoritmický pohľad na realitu Lepšie podporuje rozširovateľnosť systému Dedenie, polymorfizmus, techniky návrhových vzorov 29
Doménový model Typy doménových modelov Jednoduchý podobný relačnému modelu Komplexný výrazne bohatší ako relačný model V minulosti: problém objektovo-relačného mapovača Tieto boli drahé (napr. TopLink) Viedlo k obchádzaniu ORM a následne k Transakčnému scenáru alebo Jednoduchému Doménovému modelu V súčasnosti nástroje ORM zdarma + JPA 30
Doménový model príklad TypUctu * * TypPoplatku kod nazov * * TypOperacie 1 kodpoplatku * SadzbaPoplatku idsadzby sposobvypoctu sadzba minsadzba maxsadzba sumaoperacieod sumaoperaciedo platnostod platnostdo 1 typuctu kod nazov 1 idsadzby * Ucet 1 kodoperacie * Operacia * Poplatok iducet stavuctu 0..1 iductu * idoperacie datum suma protiucet bankaprotiuctu 1 idoperacie * idpoplatku sumapoplatku
Doménový model príklad rozšíriteľnosť aj pre ďalšie operácie Operacia idoperacie datum suma protiucet bankaprotiuctu PrenajomBezpSchranky cisloschranky zacprenajmu koniecprenajmu poistnasuma
Doménový model príklad Rozšíriteľnosť sadzieb poplatkov Dedenie, polymorfizmus Rozšíriteľnosť spôsobu výpočtu poplatkov vzor Strategy
Doménový model príklad SadzbaPoplatku idsadzby sadzba sposobvypoctu platnostod sadzba platnostdo minsadzba maxsadzba vypocitajpoplatok() sumaoperacieod sumaoperaciedo platnostod platnostdo * PoplatokFixny 1 PoplatkovaFunkcia vypocitajpoplatok() PoplatokPercent PoplatokPercentOhraniceny vypocitajpoplatok() vypocitajpoplatok() vypocitajpoplatok() SadzbaPoplatkuOhranicena minsadzba maxsadzba vypocitajpoplatok() SadzbaPoplatkuHladinova sumaoperacieod sumaoperaciedo vypocitajpoplatok()
Organizácia výpočtu Funkčná dekompozícia je nahradená dátovou dekompozíciou s delegovaním zodpovednosti Pokladník Klient Operacia TypOperacie TypPoplatku SadzbaPoplatku PoplatkovaFunkcia vkladhotovosti vytvoroperaciu... vypocitajpoplatky... vypocitajpoplatok vypocitajpoplatok vypocitajpoplatok
Doménový model príklad public class Operacia { private TypOperacie typoperacie; private Set poplatky;... public TypOperacie gettypoperacie() { } public Set getpoplatky() { } public void vypocitajpoplatky() { gettypoperacie().vypocitajpoplatky(this); } public static void vytvoroperaciu(to operaciato) { Operacia operacia = new Operacia(operaciaTO); operacia.vypocitajpoplatky(); // uloženie zmeny objektu a jeho asoc. objektov do DB operacia.save(); } }
Doménový model príklad public class TypOperacie { public void vypocitajpoplatky(operacia operacia) { for (TypPoplatku typpoplatku : gettypypoplatkov()) { typpoplatku.vypocitajpoplatok(operacia); } } } public class TypPoplatku { public void vypocitajpoplatok(operacia operacia) { SadzbaPoplatku sadzbapoplatku = getaktualnasadzbapoplatku(operacia); sadzbapoplatku.vypocitajpoplatok(operacia); } }
Doménový model príklad public class SadzbaPoplatku { public void vypocitajpoplatok(operacia operacia) { BigDecimal sumapoplatku = getpoplatkovafunkcia().vypocitajpoplatok (this, operacia.getsuma()) Poplatok poplatok = new Poplatok(this, sumapoplatku); operacia.addpoplatok(poplatok); } }
Doménový model príklad interface PoplatkovaFunkcia { public vypocitajpoplatok (SadzbaPoplatku sadzbapoplatku, BigDecimal sumaoperacie); } class PoplatokFixny implements PoplatkovaFunkcia { public vypocitajpoplatok(sadzbapoplatku sadzbapoplatku, BigDecimal sumaoperacie) { return sadzbapoplatku.getsadzba(); } } class PoplatokPercentualny implements PoplatkovaFunkcia { public vypocitajpoplatok (SadzbaPoplatku sadzbapoplatku, BigDecimal sumaoperacie) { BigDecimal percent = sadzbapoplatku.getsadzba(); return sumaoperacie.multiply(percent); } }
Doménový model príklad class PoplatokPercentualnyOhraniceny implements PoplatkovaFunkcia { public vypocitajpoplatok(sadzbapoplatku sadzbapoplatku, BigDecimal sumaoperacie) { BigDecimal percent = sadzbapoplatku.getsadzba(); BigDecimal minsadzba = sadzbapoplatku.getminsadzba(); BigDecimal maxsadzba = sadzbapoplatku.getmaxsadzba(); BigDecimal vyskapoplatku = sumaoperacie.multiply(percent); if (vyskapoplatku.compareto(minsadzba) < 0) return minsadzba; else if (vyskapoplatku.compareto(maxsadzba) > 0) return maxsadzba; else return vyskapoplatku; } }
Servisná vrstva Doménový model by mal obsahovať doménové objekty a pravidlá týkajúce sa príslušnej oblasti Množstvo kódu, ktoré sú špecifické pre príslušý systém: Use cases, workflow a integráciu s inými syst. Plus technický kód samotnej aplikácie riadenie transakcií, auditovanie, autentifikáciu, Znižuje opakovanú použiteľnosť 41
Úlohy Servisnej vrstvy Odčleňuje špecifickú logiku od všeobecnej doménovej logiky Obsahuje technický kód, napríklad pre riadenie transakcií Rozhranie aplikačnej vrstvy vo forme Fasády Zapúzdruje elementy a umožňuje ich opakované použitie Uľahčuje integráciu systémov Napr. Zabalenie do webovej služby 42
Typy Servisnej vrstvy 1. Fasáda doménového modelu = tenká Fasáda Doménového modelu 2. Operačný scenár obsahuje aj implementáciu aplikačnej logiky Zvyčajne nie samostatná vrstva, ale podvrstva aplikačnej vrstvy 43
Typy Servisnej vrstvy cmp 3.9 Operačný scenár Aplikačná vrstva.. Prezentačná vrstva. Servisná vrstva. Doménová vrstva. Vrstva dátových služieb. Dátová vrstva. 44
Spôsob realizácie v JEE @Remote public interface OperaciaSluzby { void vytvoroperaciu (TO operaciato) ; } 45
Spôsob realizácie v JEE @Stateless public class OperacieServiceBean implements OperacieService { @PersistenceContext private EntityManager entitymanager; public void vytvoroperaciu (TO operaciato) { try { Operacia operacia = new Operacia (operaciato); operacia.vypocitajpoplatky();... entitymanager.persist (operacia); if (operacia.getucet().issmsnotificationenabled()) { getsmsservice().sendsms (operacia.createnotificationsms()); } } catch (Exception ex) { throw new EJBException (ex.getmessage()); } } } 46
Servisná vrstva Výhody prispieva k rozšíriteľnosti a znovupoužiteľnosti doménová vrstva väčšia šanca znovupoužiteľnosti servisná vrstva špecifický kód (malá znovupoužiteľnosť) Nevýhody oddelenie vrstiev je intelektuálne náročné extrém: doménová vrstva iba atribúty a aplikačná funkcionalita je v servisnej vrstve
Vrstva dátových služieb 48
Odlišnosti OO modelu a R-modelu Tradič. dátový zdroj relačná databáza objektový a relačný svet štruktúrujú dáta rôznym spôsobom Hlavné rozdiely OO a RDB modelu 1. Spájanie súvisiacich dát: Komplexné objekty. RDB iba n-tice (záznamy) a z nich multimnožiny (tabuľky) OO model aj zoznamy (list), polia,... OO komplexné objekty je možné skladať
Odlišnosti OO modelu a R-modelu Identita objektov. RDB: záznam je určený svojím primárnym kľúčom) OO model: objekt má identifikátor 2. Spájanie dát s funkciami Zapúzdrenie dát RDB: procedúry pristupujú priamo k dátovým štruktúram (databázovým tabuľkám) OO model: ukrývanie dát Zmena vnútornej dátovej štruktúry tak štatisticky zasiahne iba menšiu časť kódu
Odlišnosti OO modelu a R-modelu Typy objektov RDB: preddefinovaná množina atomických typov čísla, bitové a znakové reťazce, dátum a čas Komplexné objekty, t. j. záznamy sú beztypové -> run-time chyby OO model: deklarácia typov aj pre komplexné objekty Rozšíriteľnosť základných typov RDB: tabuľka je zabudovaná štruktúra údajov s pevnou množinou príkazov OO model: vývojár si definuje vlastné typy spolu s operáciami
Odlišnosti OO modelu a R-modelu Dedenie RDB: nie OO model: možná hierarchia typov s dedením atribútov a metód Polymorfizmus RDB: nie OO model: prekrývanie + inkluzívny polymorfizmus Inkluzívny polym. = všade tam, kde sa vyžaduje objekt nadtypu je možné použiť objekt podtypu
Odlišnosti OO modelu a R-modelu 3. Manipulácia s dátami Sekvenčný verzus množinový prístup RDB: množinové operácia (SQL) Spájanie dát: operácia Table join OO model: sekvenčný prístup Spájanie dát: operácia navigácie (prechádzanie cez smerníky) Otázka: OO dopytovacieho jazyka napr. JPQL
Kategórie vzorov (Fowler) 1. Architektonické vzory dátových služieb Stanovujú základný spôsob komunikácie aplikačnej a dátovej vrstvy 2. Štrukturálne vzory pre ORM Spôsob mapovania špecifických OO čŕt Asociácie, dedenie,... Vynecháme v tejto prednáške 3. Vzory správania pre ORM Spôsob, ako sa objekty čítajú z databázy a ukladajú do databázy Vynecháme v tejto prednáške
Archit. vzory vrstvy dátových služieb Alternatívy Brána do tabuľky (Table Data Gateway) Brána do riadku tabuľky (Row Data Gateway) Vynecháme v prednáške Aktívny záznam (Active Record) Vynecháme v prednáške Prostriedok pre objektovo-relačné mapovanie (Object-Relational Mapper, ORM) 55
Použitie JDBC JDBC = rozhranie jazyka Java na relačné databázy Príkazy sú nezávislé od konkrétneho výrobcu RDBMS Služby: Oracle, MS SQL Server, DB2, MySQL a iné Vytvorenie spojenia (connection) na RDB Odoslanie SQL príkazu INSERT, UPDATE, DELETE,... Spracovanie výsledku SQL príkazu JDBC Result Set + kurzor 56
Brána do tabuľky Objekt vo vrstve dátových služieb, ktorý zapúzdruje všetok prístup k jednej DB tabuľke Jeden objekt slúži pre všetky záznamy tabuľky, s ktorými sa pracuje Úlohy: Zapúzdriť operácie SELECT, INSERT, UPDATE, DELETE Dosadiť do SQL príkazu potrebné argumenty Vyvolať vykonanie SQL príkazu Vrátiť výsledok (v tvare ResultSet) 57
Brána do tabuľky - príklad public class SadzbaPoplatkuTableGateway { private static final String sadzbapoplatkuselect = SELECT + STLPCE + FROM SadzbyPoplatkov + WHERE kodpoplatku =? + AND? >= platnostod AND? <= platnostdo + AND (sumaoperacieod IS NULL OR sumaoperacieod <=?) + AND (sumaoperaciedo IS NULL OR sumaoperaciedo >?) ; private static final String STLPCE = idsadzby, sposobvypoctu, sadzba, platnostod, + platnostdo, minsadzba, maxsadzba, + sumaoperacieod,sumaoperaciedo ; 58
Brána do tabuľky príklad (pokr.) public static ResultSet najdisadzbu (String kodpoplatku, Date datum, BigDecimal sumaoperacie) { Connection dbconnection = DriverManager.getConnection( ); PreparedStatement prikaz = dbconnection.preparestatement(sadzbapoplatkuselect); prikaz.setstring(1, kodpoplatku); prikaz.setdate(2, datum); prikaz.setdate(3, datum); prikaz.setbigdecimal(4, sumaoperacie); prikaz.setbigdecimal(5, sumaoperacie); ResultSet vysledok = prikaz.executequery(); return vysledok; } 59
Brána do tabuľky príklad (pokr.) ResultSet vysledoksql = sadzbapoplatkutablegateway.najdisadzbu( kodpoplatku, new Date(), sumaoperacie); while (vysledoksql.next()) { Long idsadzby = new Long (vysledoksql.getlong(1)); String sposobvypoctu = vysledoksql.getstring(2); BigDecimal sadzba = vysledoksql.getbigdecimal(3); BigDecimal minsadzba = vysledoksql.getbigdecimal(4); BigDecimal maxsadzba = vysledoksql.getbigdecimal(5);... BigDecimal vyskapoplatku = sluzbypoplatkov.vypocitajpoplatok (sposobvypoctu, sadzba, minsadzba, maxsadzba, sumaoperacie); 60
Prostriedok pre ORM RDB a OO model: podobnosť aj odlišnosť Podobné: Trieda Tabuľka, Atribút Stĺpec Odlišné Identifikácia objektov, komplexné objekty, dedenie,... Prostriedok pre ORM Umožňuje deklaratívne (meta-jazyk) definovať určité transformácie OO modelu do RDB 61
História ORM Najprv samostatné nástroje TopLink pre Smalltalk (The Object People) TopLink pre Java (1996-1998) Od roku 2002 patrí firme Oracle Hibernate (2001, open source) JBoss Red Hat Súčasť aplikačných serverov: EJB 1.x a 2.x - vlastný mechanizmus mapovania OO na RDB (ťažkopádny) EJB 3.0 obsahuje JPA (Java Persistence API) Vychádza z Hibernate a TopLink 62
Automatický ORM Vstupom je súbor pre metadátové mapovanie, ktorý špecifikuje, ako sa jednotlivé atribúty tried mapujú na jednotlivé stĺpce DB tabuliek. Súbor = tzv. Deployment descriptor (orm.xml) 63
Deployment descriptor v JPA <entity-mappings version= 2.0 > <persistence-unit-metadata> <persistence-unit-defaults> <schema>bankovypriklad</schema> </persistence-unit-defaults> </persistence-unit-metadata> 64
Deployment descriptor v JPA <named-native-query name= sadzbapoplatkuselect > <query> SELECT idsadzby, sposobvypoctu, sadzba, platnostod, platnostdo, minsadzba, maxsadzba, sumaoperacieod,sumaoperaciedo FROM SadzbyPoplatkov WHERE kodpoplatku =? AND? >= platnostod AND? <= platnostdo AND (sumaoperacieod IS NULL OR sumaoperacieod <=?) AND (sumaoperaciedo IS NULL OR sumaoperaciedo >?) </query> </named-native-query> 65
Deployment descriptor v JPA <entity name= SadzbaPoplatku class= SadzbaPoplatku > <table name= SadzbyPoplatkov /> <attributes> <id name= idsadzby > <column name= idsadzby > </id> <basic name= sposobvypoctu > <column name= sposobvypoctu > </basic> <basic name= sadzba > <column name= sadzba > </basic> <basic name= platnostod > <column name= platnostod > </basic>... </attributes> </entity> </entity-mappings> 66
Anotácie v JPA (pre atribúty) @Entity @Table (name= SadzbyPoplatkov ) public class SadzbaPoplatku { @Id @Column (name= idsadzby ) public Long idsadzby; @Column (name= sposobvypoctu ) String sposobvypoctu; } @Column (name= sadzba ) BigDecimal sadzba;... 67
Anotácie v JPA (pre atribúty) +defaults @Entity public class SadzbaPoplatku { @Id public Long idsadzby; String sposobvypoctu; BigDecimal sadzba; BigDecimal minsadzba; BigDecimal maxsadzba; BigDecimal sumaoperacieod; BigDecimal sumaoperaciedo; Date platnostod; Date platnostdo;... } 68
Anotácie v JPA (pre get metódy) @Entity @Table (name= Ucet ) public class Ucet { private String iductu; private String stavuctu;... @Id @Column (name= idsadzby ) public String getiductu() {return iductu;} public void setiductu (String iductu) {this.iductu = iductu;} } @Column (name= stavuctu ) public String getstavuctu() {return stavuctu;} public void setstavuctu (String stavuctu) {this.stavuctu = stavuctu;} 69
Anotácie vs. Deployment descriptor Výhody anotácií Všetko na jednom mieste (pri malých modeloch) Kontroly pri kompilácii Nevýhody anotácií Drôtovanie schémy DB do aplikačného kódu Zneprehľadňuje kód (pri väčších modeloch) Rekompilácia pri zmenách 70
JPA EntityManager ORM zabezpečuje objekt typu EntityManager public void persist (Object entity) uloží objekt do databázy a zoberie ho do svojej správy; public <T> T merge (T entity) pridá existujúci objekt medzi objekty, ktoré spravuje daný EntityManager a následne tak zabezpečí jeho zápis do databázy; public void remove (Object entity) vymaže objekt z databázy; public void refresh (Object entity) obnoví objekt hodnotami z databázy; 71
JPA EntityManager public <T> T find (Class<T> entityclass, Object primarykey) vyhľadá objekt v databáze podľa primárneho kľúča; public Query createquery (String jpqlstring) vytvorí dynamický dopyt v tvare JPQL; public Query createnamedquery (String name) vytvorí inštanciu dopytu na základe definovaného pomenovaného dopytu; public Query createnativequery (String sqlstring) vytvorí dynamický dopyt v tvare SQL; 72
JPA EntityManager Neobsahuje metódu update Ak je objekt v správe, EntityManager dokáže automaticky rozpoznať, že sa objekt zmenil a pred ukončením transakcie aktualizovať zodpovedajúci záznam v databáze 73
JPA príklady Vytvorenie účtu: Ucet ucet = new Ucet(); ucet.setiductu ( 1234567890 ); ucet.setstavuctu ( otvoreny ); entitymanager.persist (ucet); Vyhľadanie podľa primárneho kľúča: String cislouctu = 1234567890 ; Ucet ucet = entitymanager.find (Ucet.class, cislouctu); Vymazanie účtu: entitymanager.remove (ucet); entitymanager.remove (entitymanager.merge(ucet)); Ak nie je v správe 74
Dátová navigácia a OO dopyty RDB poskytujú SQL OO dopyt Využitie bohatých vlastností SQL plus Kolekcia typov. objektov vs. množina záznamov Získavanie asociovaných objektov navigáciou (bodková notácia) V histórii viac pokus o OO dopytovací jazyk Nedosiahli rozšírenosť SQL JPA: Jazyk JPQL (Java Persistence Query Language) 75
JPQL Plne objektovo orientovaný dopytovací jazyk Na rozdiel od JDBC: dopyt nie je znakový reťazec, ktorému rozumie iba RDBMS, ale veta v jazyku, ktorej rozumie procesor dopytov => kontroly Príklad dopytu s navigáciou: Poplatky k danému účtu SELECT p FROM Poplatok p WHERE p.operacia.ucet LIKE?1 76