Presentation is loading. Please wait.

Presentation is loading. Please wait.

Современные технологии баз данных

Similar presentations


Presentation on theme: "Современные технологии баз данных"— Presentation transcript:

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 к объектам Подсчет числа строк


Download ppt "Современные технологии баз данных"

Similar presentations


Ads by Google