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