Object-relational mapping (aka O/RM, ORM, and O/R mapping)
Spis treści Co to jest ORM Co to jest ORM Istota ORM Istota ORM Problemy Problemy Rozwiązania Rozwiązania NDO NDO Hibernate Hibernate
ORM ORM to technika łącząca ze sobą relacyjne bazy danych i obiektowe języki programowana ORM to technika łącząca ze sobą relacyjne bazy danych i obiektowe języki programowana W efekcie otrzymujemy wirtualne bazy danych obiektów W efekcie otrzymujemy wirtualne bazy danych obiektów ORM: darmowe, komercyjne, własne ORM: darmowe, komercyjne, własne
Istota ORM Istota ORM polega na przełożeniu obiektów na formę mogącą być przechowywaną w bazie danych, a następnie w łatwy sposób odzyskaną z zachowaniem właściwości obiektów i ich relacjami Istota ORM polega na przełożeniu obiektów na formę mogącą być przechowywaną w bazie danych, a następnie w łatwy sposób odzyskaną z zachowaniem właściwości obiektów i ich relacjami
Problemy Praca na obiektach, a zapis i odczyt z relacyjnej bazy danych Praca na obiektach, a zapis i odczyt z relacyjnej bazy danych W relacyjnych BD używamy wielu tabel reprezentujących proste dane W relacyjnych BD używamy wielu tabel reprezentujących proste dane Tworzenie złożonych zapytań, w celu uzyskania interesujących nas informacji Tworzenie złożonych zapytań, w celu uzyskania interesujących nas informacji
Rozwiązania Wielu programistów stara się na własną rękę programować rozwiązania (ORM), bez zapoznania się z już gotowymi Wielu programistów stara się na własną rękę programować rozwiązania (ORM), bez zapoznania się z już gotowymi „ Aż trudno w to uwierzyć, kiedy utarło się twierdzić, że czas potrzebny na realizację projektu jest zazwyczaj niewystarczający. ” „ Aż trudno w to uwierzyć, kiedy utarło się twierdzić, że czas potrzebny na realizację projektu jest zazwyczaj niewystarczający. ” Jacek Laskowski
Rozwiązania Podejście obiektowe jest bardziej wydajne jeśli operuje na małej ilości danych (w pełni zachowana zgodność miedzy obiektami a bazą) Podejście obiektowe jest bardziej wydajne jeśli operuje na małej ilości danych (w pełni zachowana zgodność miedzy obiektami a bazą) Operując na zapytaniach, które odnoszą się do dużej części bazy dostęp obiektowy nie jest wydajny Operując na zapytaniach, które odnoszą się do dużej części bazy dostęp obiektowy nie jest wydajny
NDO (.NET Data Objects) NDO Standard Edition V. 1.2 (100 EUR) NDO Standard Edition V. 1.2 (100 EUR) ORM dla Microsoft.NET ORM dla Microsoft.NET
NDO: Zalety 40-70% mniej kodu niż w przypadku programowania w ADO.NET 40-70% mniej kodu niż w przypadku programowania w ADO.NET Obiekty pochodne dostarczane są automatycznie Obiekty pochodne dostarczane są automatycznie Własny język zapytań (możesz zapomnieć o skomplikowanych SELECT-ach) Własny język zapytań (możesz zapomnieć o skomplikowanych SELECT-ach) Rezultaty zapytań dostarczane są w listach obiektów Rezultaty zapytań dostarczane są w listach obiektów Automatyczne zapisywanie do bazy danych (SQL Server2000/2005, Access, Oracle, MySql, Firebird) Automatyczne zapisywanie do bazy danych (SQL Server2000/2005, Access, Oracle, MySql, Firebird)
Hibernate – szkielet aplikacji 1. Budowa klas do przechowywania danych (reprezentujących encje): public class Event { private Long id; private String title; private Date date; public Event() { } public Long getId() { return id; } private void setId(Long id) { this.id = id; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } public String getTitle() { return title; } public void setTitle(String title) {this.title = title;} }
Hibernate – szkielet aplikacji cd. Są te proste Java Beany: Getery i setery dla atrybutów klas, Getery i setery dla atrybutów klas, Konstruktor bezparametrowy. Konstruktor bezparametrowy. 2. Pliki mapowań (konwencja nazewnictwa – NazwaKlasy.hbm.xml):
Hibernate – szkielet aplikacji cd. Każdy plik z mapowaniem musi zaczynać się od: 3. Konfiguracja Hibernate’a (hibernate.properties lub hibernate.cfg.xml): Zaczynamy od: <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "
Hibernate – szkielet aplikacji cd. Następnie np.: org.hsqldb.jdbcDriver jdbc:hsqldb:hsql://localhost sa 1 org.hibernate.dialect.HSQLDialect thread org.hibernate.cache.NoCacheProvider true create
Hibernate – szkielet aplikacji cd. 4. Przykład zastosowania: import org.hibernate.*; import org.hibernate.cfg.*; public class HibernateUtils { private static final SessionFactory sessionFactory; static { try { sessionFactory = new Configuration().configure().buildSessionFactory(); } catch (Throwable ex) { System.err.println("Initial SessionFactory creation failed." + ex); throw new ExceptionInInitializerError(ex); } public static SessionFactory getSessionFactory() { return sessionFactory; }
Hibernate – szkielet aplikacji cd. public class Main { public static void main(String[] args) { Session session = HibernateUtils.getSessionFactory().getCurrentSession(); session.beginTransaction(); Event event = new Event(); event.setDate(new Date()); event.setTitle("Hibernate course"); session.save(event); session.getTransaction().commit(); session = HibernateUtils.getSessionFactory().getCurrentSession(); session.beginTransaction(); Criteria criteria = session.createCriteria(Event.class); List events = criteria.list(); for (Iterator it = events.iterator(); it.hasNext();) { Event ev = (Event) it.next(); System.out.println(ev); } session.getTransaction().commit(); }
Hibernate – szkielet aplikacji cd. 5. Mapowanie relacji między encjami: Chcemy zmapować taką strukturę: Tworzymy klasę Person: Tworzymy klasę Person:
Hibernate – szkielet aplikacji cd. Plik mapowania: Plik mapowania: public class Person { private Long id; private int age; private String firstname; private String lastname; public Person() {} // getery i setery dla powyższych atrybutów private Set events = new HashSet(); public Set getEvents() { return events; } public void setEvents(Set events) { this.events = events; } }
Hibernate – szkielet aplikacji cd. Dodanie pliku mapowania do pliku konfiguracyjnego Hibernate’a: Dodanie pliku mapowania do pliku konfiguracyjnego Hibernate’a: Przykładowe użycie: session = HibernateUtils.getSessionFactory().getCurrentSession(); session.beginTransaction(); Person aPerson = (Person) session.load(Person.class, 1L); Event anEvent = (Event) session.load(Event.class, 1L); aPerson.getEvents().add(anEvent); session.getTransaction().commit();
Hibernate – zaawansowane zagadnienia Zapytania Zapytania Kryteria Kryteria HQL (Hibernate Query Language) - l/queryhql.html HQL (Hibernate Query Language) - l/queryhql.html Adnotacje Hibernate - e/en/html_single/ Adnotacje Hibernate - e/en/html_single/
Linki erence/en/html/index.html erence/en/html/index.html NHibernate NHibernate to O/R map or not To O/R map to O/R map or not To O/R map
Podsumowanie Dziękujemy za uwagę ;)