Download presentation
Presentation is loading. Please wait.
1
Современные технологии баз данных
Лекция 6
2
Объектно-реляционное отображение (ORM)
Технология отображения объектов какого-либо объектно-ориентированного языка на структуры реляционных баз данных. Поля Отношения
3
Традиционный подход Получение коллекции объектов: Недостатки:
Формирование select запроса Выполнение запроса В цикле по курсору заполнение полей объектов Недостатки: Смешивание логики получения информации из б.д. и логики обработки полученной информации. У строки SQL-запроса отсуствует семантика. Проблема рассогласования схемы данных б.д. и структуры классов приложения.
4
Объектно-реляционное отображение (ORM)
Основные аспекты: Сохранение Загрузка объектов Выборка объектов
5
ORM. Библиотеки Java: EJB, Hibernate .Net: NHibernate, LINQ Python: SQLAlchemy
6
Hibernate. Пример Схема данных
7
Hibernate. Класс автобус
package logic; import java.util.Set; import java.util.HashSet; public class Bus { private Long id; private String number; private Set drivers = new HashSet(); private Long route_id; public Bus() { } public void setId(Long id) { this.id = id; } public void setNumber(String number) { this.number = number; } public void setDrivers(Set drivers) { this.drivers = drivers; } public void setRoute_id(Long route_id) { this.route_id = route_id; } public Long getId() { return id; } public String getNumber() { return number; } public Set getDrivers() { return drivers; } public Long getRoute_id() { return route_id; } }
8
Hibernate. Класс водитель
package logic; import java.util.Set; import java.util.HashSet; public class Driver { private Long id; private String name; private String surname; private int age; private Set busses = new HashSet(); public Driver() { } public void setBusses(Set busses) { this.busses = busses; } public Set getBusses() { return busses; } public void setId(Long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setSurname(String surname) { this.surname = surname; } public void setAge(int age) { this.age = age; } public Long getId() { return id; } public String getName() { return name; } public String getSurname() { return surname; } public int getAge() { return age; } }
9
Hibernate. Класс маршрут
package logic; import java.util.Set; import java.util.HashSet; public class Route { private Long id; private String name; private int number; private Set busses = new HashSet(); public Route(){ } public void setId(Long id) { this.id = id; } public void setName(String name) { this.name = name; } public void setNumber(int number) { this.number = number; } public void setBusses(Set busses) { this.busses = busses; } public Long getId() { return id; } public String getName() { return name; } public int getNumber() { return number; } public Set getBusses() { return busses; } }
10
Hibernate. На классы отображаются таблицы-сущности. Таблицы отношения отображаются на атрибуты коллекции соответствующих классов.
11
Hibernate. Настройка отображения
<hibernate-mapping> <class name=«logic.Bus» table=«buses»> <id column=«bus_id» name=«id» type=«java.lang.Long»> <generator class=«increment»/> </id> <property column=«number» name=«number» type=«java.lang.String»/> <set name=«drivers» table=«busDriver» lazy=«false»> <key column=«bus_id»/> <many-to-many column=«driver_id» class=«logic.Driver»/> </set> </class> </hibernate-mapping>.
12
Hibernate. Настройка отображения
<hibernate-mapping> <class name=«logic.Driver» table=«drivers»> <id column=«driver_id» name=«id» type=«java.lang.Long»> <generator class=«increment»/> </id> <property column=«name» name=«name» type=«java.lang.String»/> <property column=«surname» name=«surname» type=«java.lang.String»/> <property column=«age» name=«age» type=«java.lang.Integer»/> <set name=«busses» table=«busDriver» lazy=«false»> <key column=«driver_id»/> <many-to-many column=«bus_id» class=«logic.Bus»/> </set> </class> </hibernate-mapping>
13
Hibernate. Настройка отображения
<hibernate-mapping> <class name=«logic.Route» table=«routes»> <id column=«route_id» name=«id» type=«java.lang.Long»> <generator class=«increment»/> </id> <property column=«name» name=«name» type=«java.lang.String»/> <property column=«number» name=«number» type=«java.lang.Integer»/> <set name=«buses» lazy=«false»> <key column=«route_id»/> <one-to-many class=«logic.Bus»/> </set> </class> </hibernate-mapping>
14
Hibernate. Настройка отображения
<hibernate-configuration> <session-factory> <property name=«connection.url»>jdbc:mysql://localhost/autopark</property> <property name=«connection.driver_class»>com.mysql.jdbc.Driver</property> <property name=«connection.username»>root</property> <property name=«connection.password»/> <property name=«connection.pool_size»>1</property> <property name=«current_session_context_class»>thread</property> <property name=«show_sql»>true</property> <property name=«dialect»>org.hibernate.dialect.MySQL5Dialect</property> <mapping resource=«logic/Bus.hbm.xml»/> <mapping resource=«logic/Driver.hbm.xml»/> <mapping resource=«logic/Route.hbm.xml»/> </session-factory> </hibernate-configuration>
15
Hibernate. Интерфейс методов модификации
package DAO; import logic.Bus; import logic.Driver; import logic.Route; import java.util.Collection; import java.sql.SQLException; public interface BusDAO { public void addBus(Bus bus) throws SQLException; public void updateBus(Long bus_id, Bus bus) throws SQLException; public Bus getBusById(Long bus_id) throws SQLException; public Collection getAllBusses() throws SQLException; public void deleteBus(Bus bus) throws SQLException; public Collection getBussesByDriver(Driver driver) throws SQLException; public Collection getBussesByRoute(Route route) throws SQLException; }
16
Hibernate. Реализация модификации данных
public class BusDAOImpl implements BusDAO { public void addBus(Bus bus) throws SQLException { Session session = null; try { session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); session.save(bus); session.getTransaction().commit(); } catch (Exception e) { …… } finally { if (session != null && session.isOpen()) { session.close(); } } } public void updateBus(Long bus_id, Bus bus) throws SQLException { Session session = null; try { session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); session.update(bus); session.getTransaction().commit(); } catch (Exception e) { …. } finally { if (session != null && session.isOpen()) { session.close(); } } }
17
Hibernate. Реализация модификации данных
public Collection getAllBusses() throws SQLException { Session session = null; List busses = new ArrayList<Bus>(); try { session = HibernateUtil.getSessionFactory().openSession(); busses = session.createCriteria(Bus.class).list(); } catch (Exception e) { …. } finally { if (session != null && session.isOpen()) { session.close(); } } return busses; } public void deleteBus(Bus bus) throws SQLException { Session session = null; try { session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); session.delete(bus); session.getTransaction().commit(); } catch (Exception e) { …. } finally { if (session != null && session.isOpen()) { session.close(); } } }
18
Hibernate. Реализация модификации данных
public Collection getBussesByDriver(Driver driver) throws SQLException { Session session = null; List busses = new ArrayList<Bus>(); try { session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Long driver_id = driver.getId(); Query query = session.createQuery( " select b " + " from Bus b INNER JOIN b.drivers driver" + " where driver.id = :driverId " ) .setLong(«driverId», driver_id); busses = (List<Bus>) query.list(); session.getTransaction().commit(); } finally { if (session != null && session.isOpen()) { session.close(); } } return busses; } public Collection getBussesByRoute(Route route){ Session session = null; List busses = new ArrayList<Bus>(); try { session = HibernateUtil.getSessionFactory().getCurrentSession(); session.beginTransaction(); Long route_id = route.getId(); Query query = session.createQuery(«from Bus where route_id = :routeId „).setLong(“routeId», route_id); busses = (List<Bus>) query.list(); session.getTransaction().commit(); } finally { if (session != null && session.isOpen()) { session.close(); } } return busses; } }
19
Hibernate. Наследование
Реализация отображения наследуемых классов на таблицы
20
Hibernate. Наследование
<hibernate-mapping> <class name="eg.hibernate.mapping.dataobject.Person" table="TB_PERSON" polymorphism="implicit"> <id name="id" column="ID"> <generator class="assigned"/> </id> <set name="rights" lazy="false"> <key column="REF_PERSON_ID"/> <one-to-many class="eg.hibernate.mapping.dataobject.Right" /> </set> <joined-subclass name="eg.hibernate.mapping.dataobject.Individual" table="TB_INDIVIDUAL"> <key column="id"/> <property name="firstName" column= "FIRST_NAME" type="java.lang.String" /> <property name="lastName" column= "LAST_NAME" type="java.lang.String" /> </joined-subclass> <joined-subclass name= "eg.hibernate.mapping.dataobject.Corporation" table="TB_CORPORATION"> <property name="name" column="NAME" type="string" /> <property name="registrationNumber" column ="REGISTRATION_NUMBER" type="string" /> </class> </hibernate-mapping>
21
Hibernate. Наследование. Запрос HQL
22
Hibernate. Использование хранимых процедур
23
Language Integrated Query LINQ к SQL LINQ к объектам LINQ к XML
24
LINQ. Выборка данных
25
LINQ
26
LINQ. Определние классов
Класс Customer Свойтво Customer для класса Order
27
LINQ. Модификация данных
Изменение Удаление
28
LINQ. Сравнение запросов на выборку с SQL
29
LINQ. Конструирование запроса
30
LINQ к объектам Подсчет числа строк
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.