Podejście obiektowe do relacyjnych baz danych Hibernate.
Plan wykładu Czym jest Hibernate? Jakie są zalety pracy z Hibernate? Jak skonfigurować Hibernate? Jak korzystać z Hibernate? Praktyczne przykłady wykorzystania Hibernate(Hibernate Tools) Porównanie wydajności JDBC vs Hibernate
Czym jest Hibernate? Hibernate jest darmową biblioteką, umożliwiającą odwzorowanie relacyjnych baz danych na obiekty Java. Dzięki czemu można napisać aplikacje bazodanową bez znajomości języka SQL.
Jakie są zalety Hibernate? Odwzorowanie danych na obiekty Java Wygodny dostęp do uzyskanych danych Obsługa wielu dialektów SQL Obiektowy język HQL przenoszalny na inne bazy danych obsługiwane przez Hibernate Odseparowanie definicji struktury bazy danych poprzez anotacje lub pliki xml Szybszy czas tworzenia aplikacji
Jak skonfigurować Hibernate? 1) Napisać/wygenerować plik konfiguracyjny hibernate.cfg.xml <hibernate-configuration > <session-factory> <property name="connection.driver_class">org.firebirdsql.jdbc.fbdriver</property> <property name="connection.url">jdbc:firebirdsql:localhost:d:/hibernate.gdb</property> <property name="connection.username">sysdba</property> <property name="connection.password">masterkey</property> <property name="dialect">org.hibernate.dialect.firebirddialect</property> <property name="format_sql">true</property> <property name="show_sql">true</property> <mapping resource="hbm/pracownik.hbm.xml" /> <mapping resource="hbm/dzial.hbm.xml" /> <mapping resource="hbm/stanowisko.hbm.xml" /> </session-factory> </hibernate-configuration>
Jak skonfigurować Hibernate? 2) Napisać wygenerować pliki mapowań tabel bazy danych <hibernate-mapping> <class name="hbm.classes.pracownik" table="pracownik"> <id name="idpracownik" type="int"> <column name="id_pracownik" /> <generator class="increment" /> </id> <property name="imie" type="string"> <column name="imie" length="30" not-null="true" /> </property> <property name="nazwisko" type="string"> <column name="nazwisko" length="50" not-null="true" /> </property> <property name="dataurodzenia" type="date"> <column name="data_urodzenia" length="10" /> </property> <many-to-one name="stanowisko" class="hbm.classes.stanowisko" lazy="false"> <column name="id_stanowisko" not-null="true" /> </many-to-one> <set name="dzials" inverse="false" table="prac_dzial" lazy="true"> <key> <column name="id_pracownik" not-null="true"/> </key> <many-to-many class="hbm.classes.dzial"> <column name="id_dzialu" not-null="true" /> </many-to-many> </set> </class> </hibernate-mapping>
Jak skonfigurować Hibernate? 3) Napisać/wygenerować klasę Java odpowiadającą zdefiniowanemu wcześniej mapowaniu public class Pracownik implements java.io.serializable { private int idpracownik; private String imie; private String nazwisko; private Date dataurodzenia; private Stanowisko stanowisko; private Set dzials; //ponizej settery i gettery wszystkich pól private int getidpracownik() { return idpracownik; } } private void setidpracownik(int idpracownik) { this.idpracownik = idpracownik; }
Jak skonfigurować Hibernate? 4) Utworzenie fabryki sesji SessionFactory sessionfactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); Session session = sessionfactory.opensession(); Na obiekcie sesji będziemy wykonywać wszystkie operacje związane z bazą danych.
Jak korzystać z Hibernate? Utworzenie fabryki sesji i pobranie sesji SessionFactory sessionfactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory(); Session session = sessionfactory.opensession(); Odpowiednik początkowej konfiguracji w JDBC try { Class.forName("org.firebirdsql.jdbc.FBDriver"); Connection con = DriverManager.getConnection( "jdbc:firebirdsql:localhost:d:/hibernate.gdb", "sysdba", "masterkey"); Statement statement = con.createstatement(); } catch(exception e){ e.printstacktrace(); }
Jak korzystać z Hibernate? Pobieranie elementu z bazy danych Pracownik pracownik = (Pracownik)session.load(Pracownik.class, 1); pracownik.getimie(),pracownik.getnazwisko(),... String query = SELECT IMIE, NAZWISKO, DATA_URODZENIA + FROM PRACOWNIK + WHERE ID_PRACOWNIK =? ; PreparedStatement pstatement = con.preparestatement(query); pstatement.setint(1,1); ResultSet result = pstatement.executequery(); result.next(); result.getstring(0),result.getstring(1),
Jak korzystać z Hibernate? Zapisanie elementu do bazy danych Pracownik pracownik = new Pracownik(); pracownik.setimie( Jan ); pracownik.setnazwisko( Kowalski ); pracownik.setdataurodzenia(new Date()); session.save(pracownik); String query = INSERT INTO PRACOWNIK(IMIE, NAZWISKO, + DATA_URODZENIA) + VALUES(?,?,?) ; PreparedStatement pstatement = con.preparestatement(query); pstatement.setstring(1, Jan ); pstatement.setstring(2, Kowalski ); pstatement.setdate(3,new Date()); pstatement.execute();
Jak korzystać z Hibernate? Modyfikowanie elementu bazy danych Pracownik pracownik = (Pracownik)session.load(Pracownik.class, 1); pracownik.setimie(imieparam); session.update(pracownik); String query = SELECT IMIE, NAZWISKO,DATA_URODZENIA + FROM PRACOWNIK + WHERE ID_PRACOWNIK =? ; PreparedStatement pstatement = con.preparestatement(query); pstatement.setint(1,1); ResultSet result = pstatement.executequery(); result.next(); String nazwisko = result.getstring(1); String data = result.getdate(2); query = UPDATE PRACOWNIK SET IMIE =?, NAZWISKO =?, DATA_URODZENIA =? WHERE ID_PRACOWNIK =? ; PreparedStatement pstatement = con.preparestatement(query); pstatement.setstring(1, imieparam); pstatement.setstring(2, nazwisko); pstatement.setdate(3, data); pstatement.setint(4, 1); pstatement.execute();
Jak korzystać z Hibernate? Pobieranie danych z bazy danych Criteria criteria = session.createcriteria(pracownik.class); criteria.add(restrictions.like( imie, J, MatchMode.START)); criteria.addorder(order.desc( nazwisko )); criteria.setfirstresult(5); criteria.setmaxresults(10); List<Pracownik> listapracownikow = criteria.list(); ProjectionList listprojections = Projections.projectionList(); listprojections.add(projections.property( imie )); listprojections.add(projections.property( nazwisko )); criteria.setprojection(listprojections); List<Object[]> listapracownikow = criteria.list();
Jak korzystać z Hibernate? Łączenie tabel Criteria criteria = session.createcriteria(pracownik.class); ProjectionList listprojections = Projections.projectionList(); listprojections.add(projections.property( imie )); listprojections.add(projections.property( nazwisko )); listprojections.add(projections.property( stanowiskopracownika.nazwa )); criteria.setprojection(listprojections); criteria.createalias("stanowisko", "stanowiskopracownika", JoinFragment.LEFT_OUTER_JOIN); List<Object[]> listapracownikow = criteria.list();
Część praktyczna Wygenerowanie pliku konfiguracyjnego Wygenerowanie mapowań Wygenerowanie klas Utworzenie fabryk sesji Przykłady z wykładu Wymagane środowisko Eclipse Hibernate Tools Hibernate Core 3.x Odpowiednie sterowniki do bazy danych
Część praktyczna diagram bazy danych
Porównanie wydajności JDBC vs Hibernate Hibernate Select Hibernate seria(select, update, insert, delete) 5000 180 4500 160 4000 140 3500 120 Czas w milisekundach 3000 2500 2000 1500 JDBC HIBERNATE Czas w milisekundach 100 80 60 JDBC HIBERNATE 1000 40 500 20 0 0 10 100 1000 10000 100000 10 100 1000 10000 100000 Ilość rekordów Ilość rekordów
Pytania???