Wykład - Spring

Transkrypt

Wykład - Spring
mgr inż. Michał Paluch
Spring DAO
Wzorzec projektowy Data Access Object (DAO)
– rozdzielenie mechanizmu trwałości obiektów
od reguł biznesowych
 Oferuje wsparcie dla
– interfejsu JDBC
– narzędzi ORM: Hibernate, JDO, iBATIS SQL
Maps
 Dlaczego kolejna warstwa nad JDBC?
– zarządzanie Connection, ResultSet,
Statement
– uniwersalny wyjątek DataAccessException

mgr inż. Michał Paluch
Spring DAO
Połączenie przez JDBC
...
import org.springframework.jdbc.core.JdbcTemplate;
import
org.springframework.jdbc.datasource.DriverManagerDataSource;
...
DriverManagerDataSource dbBean =
(DriverManagerDataSource)ctx.getBean("dbBean");
JdbcTemplate template = new JdbcTemplate(dbBean);
List result = template.queryForList("SELECT * FROM emp");
for (Object o : result) {
Map map = (Map)o;
System.out.println(map.get("ENAME") + " " + map.get("JOB"));
}
mgr inż. Michał Paluch
Spring DAO
Konfiguracja połączenia













<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
...
<bean id="dataBean"
class="org.springframework.jdbc.datasource.DriverManagerDat
aSource">
<property name="driverClassName"
value="oracle.jdbc.driver.OracleDriver"/>
<property name="url"
value="jdbc:oracle:thin:@kis:1521:psoir"/>
<property name="username" value="student"/>
<property name="password" value=„psoir"/>
</bean>
</beans>
mgr inż. Michał Paluch
Transakcje w Spring
Framework
Wsparcie transakcji w architekturze Spring
– Interfejs PlatformTransactionManager
– Wybór między JTA, Hibernate, JDO, JDBC
– Szablon TransactionTemplate
– Deklaratywne zarządzanie transakcjami za
pomocą
 POJO i programowania aspektowego przy użyciu
 ProxyFactoryBean i TransactionInterceptor,
– Demarkacja transakcji przez metadane i
adnotacje,
– Jednolity obraz dla transakcji lokalnych i
globalnych

mgr inż. Michał Paluch
Transakcje w Spring
Konfiguracja
...
<bean id="dataSource"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/sid"/>
</bean>
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager
"/>
<bean id="empManagerJdbcBean"
class=„com.spring.ManagerJdbc">
<property name="dataSource"><ref
bean="dataSource"/></property>
</bean>
…
mgr inż. Michał Paluch
Transakcje w Spring
Konfiguracja cz.2
...
<bean id="empManagerBean"
class="org.springframework.transaction.interceptor.TransactionProxyFactor
yBean">
<property name="transactionManager">
<ref bean="transactionManager"/></property>
<property name="target"><ref bean="empManagerJdbcBean"/></property>
<property name="transactionAttributes">
<props>
<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="store*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
…
mgr inż. Michał Paluch
Spring MVC
Kontrolery i interceptory wewnątrz
kontenera IoC
 Zalety w porównaniu ze Struts to:
– Bardziej elastyczna architektura
– Serwlety DispatcherServlet
współdzielą kontekst
– Łatwa konfiguracja środowiska
– Brak zależności aplikacji od szkieletu
– Warstwa widoku niezwiązana z
technologią

mgr inż. Michał Paluch
Spring MVC
Zalety modelu:
– Separacja warstw modelu, prezentacji
i kontrolera
– Model niezależny od Spring API lub
Servlet API
– Obiekty modelu do obsługi formularzy
– Testowanie przy pomocy JUnit
– Integracja z warstwą pośrednią
– Integracja z technologiami warstwy
prezentacji

mgr inż. Michał Paluch
Spring MVC – przykład cz.2












<?xml version = '1.0' encoding = 'windows-1252'?>
<web-app>
<servlet>
<servlet-name>empStudent</servlet-name>
<servletclass>org.springframework.web.servlet.DispatcherServle
t</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>empStudent</servlet-name>
<url-pattern>/empStudent/*</url-pattern>
</servlet-mapping>
</web-app>
mgr inż. Michał Paluch
Spring MVC - przykład












<bean name="/index"
class="my.spring.EmpStudentController"/>
<bean id="dbBean"
…
</bean>
<bean
class="org.springframework.web.servlet.view.InternalResource
ViewResolver">
<property name="prefix"><value>/WEBINF/jsp/</value></property>
<property name="suffix"><value>.jsp</value></property>
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
</bean>
mgr inż. Michał Paluch
Spring MVC – przykład cz.3















public class EmpStudentController implements Controller {
public ModelAndView handleRequest(
HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
ApplicationContext ctx = new
ClassPathXmlApplicationContext("beans.xml");
DriverManagerDataSource dbBean =
(DriverManagerDataSource)ctx.getBean("dbBean");
JdbcTemplate template = new JdbcTemplate(dbBean);
List employeesRaw = template.queryForList("select ename from emp");
List employees = new ArrayList();
for (Object o : employeesRaw)
employees.add(((Map)o).get("ENAME"));
ModelAndView mv = new ModelAndView("emps");
mv.addObject("employees", employees);
return mv; } }
mgr inż. Michał Paluch
Spring MVC – przykład cz.4









<%@ page
contentType="text/html;charset=windows-1252" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"
prefix="c" %>
<html>
<body>
<c:forEach var="emp" items="${students}">
<c:out value="${emp}"/> <br/>
</c:forEach>
</body>
</html>
mgr inż. Michał Paluch
mgr inż. Michał Paluch
TECHNOLOGIE ORM
Object-Relational Mapping obejmuje:
– API do zarządzania trwałością
obiektów
– mechanizm specyfikowania
metadanych Descujących
- odwzorowanie klas na relacje w
bazach danych
– język do wykonywania zapytań
 Najpopularniejszą implementacją ORM jest
Hibernate.

mgr inż. Michał Paluch
Hibernate
Najpopularniejsza implementacja
odwzorowania
obiektowo-relacyjnego dla języka Java
 „Relational Persistence For Idiomatic Java”
 obsługa asocjacji, kompozycji,
dziedziczenia,
polimorfizmu, kolekcji
 Wysoka wydajność i skalowalność
 Wiele sposobów wydawania zapytań
 Wykorzystuje siłę technologii relacyjnych
baz danych

mgr inż. Michał Paluch
Architektura Hibernate
Żródło: http://www.tutorialspoint.com/hibernate/hibernate_pdf_version.htm
mgr inż. Michał Paluch
Konfiguracja Hibernate
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property
name="hibernate.connection.datasource">jdbc/sample</property>
<property name="dialect">
org.hibernate.dialect.OracleDialect</property>
<mapping resource="myhib/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
mgr inż. Michał Paluch
Student Class
Są to klasy implementujące encje występujące w
modelu danych aplikacji
Definiowane w formie POJO
Posiadające sztuczny identyfikator
public class Student {
private Long id;
private String dname;
public void setId(Long id) { this.id = id; }
public Long getId() { return id; }
public void setDname(String dname)
{ this.dname = dname; }
public String getDname() { return dname; }
}
mgr inż. Michał Paluch
ORM w Hibernate
Definiowane w pliku lub plikach XML
– typowo odrębny plik dla każdej klasy
– zwyczajowe rozszerzenie .hbm.xml.
 Zorientowane na Desc odwzorowania z
punktu widzenia klasy Java, a nie tabeli
 Tworzone ręcznie lub generowane za
pomocą narzędzi
 Typowo pliki odwzorowania wskazywane w
pliku konfiguracyjnym hibernate.cfg.xml

mgr inż. Michał Paluch
ORM, przykład odwzorowania
<?xml version="1.0"?>
<hibernate-mapping package=„kisStud">
<class name=„Student" table=„Student">
<id name="id" type="long" column=„studno">
<generator class="sequence">
<param name="sequence">stud_seq</param>
</generator>
</id>
<property name=„studname" column=„studname„
type="string" not-null="true” />
</class>
</hibernate-mapping>
mgr inż. Michał Paluch
Interfejsy Hibernate API
SessionFactory
– służy do tworzenia obiektów Session
– obiekt tworzony raz dla całej aplikacji
 Session
– jednostka pracy („unit of work”)
– obsługuje trwałość obiektów
 Transaction
– transakcja w bazie danych
– najczęściej jedna w sesji

mgr inż. Michał Paluch
Przykład 1
SessionFactory sf =New
Configuration().configure().buildSessionFacto
ry();
Session s = sf.openSession();
Transaction tx = s.beginTransaction();
Student d = new Student();
d.setstudname(„Anarkowski");
s.save(d);
tx.commit();
s.close();
mgr inż. Michał Paluch
Stany obiektu
Ulotny (ang. transient)
– utworzony operatorem new, ale
niezwiązany z sesją
 Trwały (ang. persistent)
– posiada identyfikator i reprezentację w
bazie danych
– związany z sesją
 Odłączony (ang. detached)
– obiekt, który był trwały, ale jego sesja się
zakończyła
– można go modyfikować, a następnie
związać z nową sesją

mgr inż. Michał Paluch
Obsługa obiektów w Hibernate
Uczynienie obiektu trwałym:
– metoda save() obiektu Session
 Odczyt obiektu o znanym identyfikatorze:
– metody load() i get() obiektu Session
 Usunięcie obiektu:
– metoda delete() obiektu Session
 Modyfikacja trwałego obiektu
– metody setXXX() obiektu
 Synchronizacja obiektów odłączonych
– metody update(), saveOrUpdate() i merge()
obiektu
 Session

mgr inż. Michał Paluch
Przykłady obsługi obiektów
Utworzenie i zachowanie obiektu
Student d = new Student();
d.setstudname("Anarkowski");
Long genId = (Long) session.save(d);

Odczyt i modyfikacja obiektu
Student d = (Student) session.load(Student.class, new
Long(20));
d.setstudname(" Anarkowski XYZ");

Usunięcie obiektu
Student d = (Student) session.load(Student.class, new
Long(20));
session.delete(d);

mgr inż. Michał Paluch
Zapytania w Hibernate
Zapytania w języku HQL (Hibernate
Query Language)
– składnia podobna do SQL
– zorientowany obiektowo
– zapytania odwołują się do klas, a
nie tabel
 Zapytania w natywnym SQL
 Zapytania poprzez obiekty Criteria
 Zapytania poprzez obiekty Example

mgr inż. Michał Paluch
Asocjacje w Hibernate
1:1, N:1, 1:N, N:M
 Z tabelą pośrednią (1:1, N:1, 1:N, N:M)
 lub bez (1:1, N:1, 1:N)
 Jednokierunkowe lub dwukierunkowe
 Istnieje możliwość kaskadowej
propagacji operacji na następujące
obiekty zależne:
none, all, save-update, delete, all-deleteorphan

mgr inż. Michał Paluch
Java Persistence API
Standard dotyczący zapewniania
trwałości obiektów w aplikacjach Java
EE i Java SE
 Rola Java Persistence na tle technologii
ORM
– oparty o odwzorowanie obiektoworelacyjne
– definiuje standardowe API

mgr inż. Michał Paluch
Elementy standardu JPA
Interfejs programistyczny Java
Persistence API
 Język zapytań Java Persistence Query
Language
 Metadane o odwzorowaniu obiektoworelacyjnym

mgr inż. Michał Paluch
Encje
Encja (ang. entity) to lekki obiekt służący do
reprezentacji trwałych danych
 Typowo reprezentuje tabelę z relacyjnej bazy
danych
 Definiowana w formie klasy encji i ewentualnie
klas pomocniczych
 Wymagania dla klas encji:
– POJO z adnotacją @Entity
– bezargumentowy konstruktor (public lub
protected)
– implementacja Serializable, jeśli obiekty
będą odłączane

mgr inż. Michał Paluch
Przykład klasy encji
@Entity
@Table(name="BLEDY")
public class Blad implements Serializable {
@Id
private Long id;
private String code;
private String Desc;
public Blad() { }
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getCode() { return code; }
public void setCode(String code) { this.code = code; }
public String getDesc() { return Desc; }
public void setDesc(String Desc) { this.Desc = Desc; }
}
mgr inż. Michał Paluch
Związki pomiędzy encjami
Liczność
– 1:1 (@OneToOne)
– 1:N (@OneToMany)
– N:1 (@ManyToOne)
– N:M (@ManyToMany)
 Kierunkowość
– dwukierunkowe
– jednokierunkowe
 Kaskada operacji:
– PERSIST, MERGE, REMOVE, REFRESH, ALL

mgr inż. Michał Paluch
Entity Manager
Zarządca encji zarządzany przez kontener (EJB, JSF)
– wstrzykiwany do komponentu aplikacji
@PersistenceContext
EntityManager em;

– kontekst trwałości propagowany między komponentami w
ramach transakcji JTA
 Zarządca encji zarządzany przez aplikację (serwlety,SE)
– tworzony i niszczony przez aplikację
– każdy zarządca encji tworzy odrębny kontekst trwałości
@PersistenceUnit
EntityManagerFactory emf;
EntityManager em = emf.createEntityManager();
mgr inż. Michał Paluch
Persistence Unit
Definiuje zbiór klas encji zarządzanych przez
EntityManager w aplikacji
 Obejmuje klasy encji z jednej bazy danych
 Definiowana w pliku konfiguracyjnym
persistence.xml
 Posiada nazwę unikalną w zasięgu widzialności
 W aplikacjach Java EE wykorzystuje źródło danych
– obsługujące transakcje JTA
– nieobsługujące transakcji JTA
 W aplikacjach Java SE zawiera parametry
połączenia

mgr inż. Michał Paluch
Plik persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" ...>
<persistence-unit name=„Testy" transactiontype="JTA">
<provider>oracle.toplink.essentials.ejb.cmp3.EntityMan
agerFactoryProvider</provider>
<jta-data-source>jdbc/sample</jta-data-source>
<properties>
<property name="toplink.ddl-generation" value="createtables"/>
</properties>
</persistence-unit>
</persistence>
mgr inż. Michał Paluch
Cykl życia encji
Instancje encji są zarządzane przez
instancję
 EntityManager
 Stany instancji encji:
– nowa (ang. new)
– zarządzana (ang. managed)
– odłączona (ang. detached)
– usunięta (ang. removed)

mgr inż. Michał Paluch
Utrwalenie instancji encji
@PersistenceContext
EntityManager em;
Blad b = new Blad();
b.setKod("b001");
b.setOpis("Niedozwolona operacja w
module X");
em.persist(b);
mgr inż. Michał Paluch
Operacje na encjach
Metoda find()
Metoda refresh()
Metoda merge()
Moment zapisu danych do bazy:
– automatycznie: gdy transakcja jest
zatwierdzana
– jawnie: w wyniku wywołania metody flush()
 Strategia blokowania danych
– domyślnie blokowanie optymistyczne
– Metoda lock()




mgr inż. Michał Paluch
Rodzaje zapytań do bazy
Rodzaje zapytań
– dynamiczne w JPQL - createQuery()
– dynamiczne natywne - createNativeQuery()
– nazwane
 Parametryzacja zapytań
– nazwane
– pozycyjne
 Wykonanie zapytania (metody obiektu Query)
– getResultList(), getSingleResult()
– executeUpdate()

mgr inż. Michał Paluch
Zapytanie dynamiczne

EntityManager em;
List<X> zn = null;
 Query q = em.createQuery(
 "SELECT x FROM X x WHERE x.opis
LIKE '%cosX%'");
 zn = q.getResultList();

mgr inż. Michał Paluch
Zapytanie nazwane
@Entity
@NamedQuery(name = "findByKeyword",
query = "SELECT x FROM X x WHERE x.opis
LIKE :cosX")
EntityManager em;
List<Blad> zn = null;
zn =
em.createNamedQuery("findByKeyword")
.setParameter("keyword", "%oneofX%")
.getResultList();
mgr inż. Michał Paluch
JPQL
Umożliwia formułowanie przenaszalnych zapytań,
niezależnych od specyfiki poszczególnych systemów
 Zapytania operują na abstrakcyjnym schemacie
obejmującym encje i związki między nimi
 Składnia podobna do SQL:
– zapytania SELECT-FROM-WHERE-GROUP
BYHAVING-ORDER BY
– polecenia UPDATE i DELETE dla masowych operacji
modyfikacji i usuwania: UPDATE-SET-WHERE,
DELETE-FROM-WHERE
 Wyrażenia ścieżkowe do nawigacji do związanych
encji

mgr inż. Michał Paluch
Przykłady JPQL
SELECT DISTINCT * FROM
Wykonawca w, IN(w.albumy)
 SELECT DISTINCT * FROM
Wykonawca w JOIN w.albumy a
 SELECT * FROM Album a
WHERE a.autor.nazwa = ‘Kukiz

mgr inż. Michał Paluch
MATERIAŁY
http://docs.oracle.com/javaee/6/tutorial/d
oc/bnafd.html
 http://www.oracle.com/technetwork/java/
javaee/jsp/index.html
 http://www.tutorialspoint.com/spring/inde
x.htm
 http://www.tutorialspoint.com/hibernate/h
ibernate_pdf_version.htm

mgr inż. Michał Paluch
Dziękuję za uwagę
mgr inż. Michał Paluch

Podobne dokumenty