java осень 2014 занятие 8

27
Углубленное программирование на Java Лекция 3.2 «ORM» Виталий Чибриков

Upload: technopark

Post on 25-Jun-2015

177 views

Category:

Education


0 download

DESCRIPTION

Java осень 2014 занятие 8

TRANSCRIPT

Page 1: Java осень 2014 занятие 8

Углубленное программирование на

Java Лекция 3.2

«ORM»

Виталий Чибриков

Page 2: Java осень 2014 занятие 8

План лекции

2

1. ORM

2. Hibernate

3. HQL

4. DB Service

Page 3: Java осень 2014 занятие 8

Object-Relational Mapping

3

Связь между объектной моделью программы и реляционной моделью базы

Пример

Методы DAO принимают объекты и сохраняют их в базе

Методы DAO возвращают объекты собирая их на основе запросов

Page 4: Java осень 2014 занятие 8

Java Persistence API

4

Package javax.persistence

Аннотации

@Entity: объект класса можно «переложить» в таблицу

@Table: связывает класс и таблицу

@Id: поле является первичным ключом в таблице

@Column: связывает поле и колонку в таблице

Page 5: Java осень 2014 занятие 8

DataSet

5

DataSet ― объект содержащий данные одной строки таблицы

На каждую таблицу свой DataSet

Извлечение и вставку данных удобно проводить через DataSet-ы

В терминах JPA DataSet это Entity

Page 6: Java осень 2014 занятие 8

DataSet

6

public class UsersDataSet { private long id; private String name;

public UsersDataSet(long id, String name){ this.id = id; this.name = name; } public UsersDataSet(String name){ this.id = -1; this.name = name; }

public String getName() { return name; }

public long getId() { return id; } }

Page 7: Java осень 2014 занятие 8

Data Access Object

DAO

7

Объект доступа к данным

Шаблон проектирования скрывающий детали работы с базой

Обычно один DAO на одну таблицу

Высокоуровневый доступ к данным через DataSet-ы

Варианты операций над базой:

Вставка строки ― добавление DataSet

Поиск строки по ключу ― возврат DataSet-а

Поиск строк по признаку ― возврат List<DataSet>

Удаление строки

Page 8: Java осень 2014 занятие 8

interface UsersDAO

8

public interface UsersDAO {

UsersDataSet get(long id) throws SQLException;

UsersDataSet getByName(String name) throws SQLException;

void add(UsersDataSet dataSet) throws SQLException;

void delete(long id) throws SQLException;

}

Page 9: Java осень 2014 занятие 8

План лекции

9

1. ORM

2. Hibernate

3. HQL

4. DB Service

Page 10: Java осень 2014 занятие 8

<dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.33</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.3.7.Final</version> </dependency> </dependencies>

ORM библиотека для Java

Hibernate

10

Page 11: Java осень 2014 занятие 8

Configuration

11

Configuration configuration = new org.hibernate.cfg.Configuration();

configuration.setProperty(propertyName, propertyValue);

propertyName propertyValue

hibernate.dialect org.hibernate.dialect.MySQLDialect

hibernate.connection.driver_class

com.mysql.jdbc.Driver

hibernate.connection.url jdbc:mysql://localhost:3306/Lecture3

hibernate.connection.username tully

hibernate.connection.password tully

hibernate.show_sql true

hibernate.hbm2ddl.auto update

Page 12: Java осень 2014 занятие 8

hibernate.hbm2ddl.auto

12

hibernate.hbm2ddl.auto

validate: проверяет схему, не внося изменений

update: обновляет схему, если находит различия

create: пересоздает схему

create-drop: уничтожает схему при закрытии SessionFactory

Автоматически создает или проверяет схему базы при создании SessionFactory

Page 13: Java осень 2014 занятие 8

Session Factory

13

Фабрика, которая создает сессии

Одна фабрика на поток

Одна сессия на запрос

Page 14: Java осень 2014 занятие 8

Session Factory

14

StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); builder.applySettings(configuration.getProperties()); ServiceRegistry serviceRegistry = builder.buildServiceRegistry(); SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);

Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction();

System.out.append(transaction.getLocalStatus().toString());

session.close(); sessionFactory.close();

Page 15: Java осень 2014 занятие 8

Аннотации для DataSet-ов

15

configuration.addAnnotatedClass(UserDataSet.class);

Перед созданием SessionFactory:

import javax.persistence.*;

@Entity @Table(name="users") public class UserDataSet { @Id @Column(name="id") @GeneratedValue(strategy = GenerationType.IDENTITY) private long id;

@Column(name="name") private String name; … }

Page 16: Java осень 2014 занятие 8

Session

16

Основной интерфейс между приложением и библиотекой

Время жизни сессии соответствует времени жизни транзакции

Задача сеcсии ― работа с объектами проанотированными как @Entity

public void save(UserDataSet dataSet){ Session session = sessionFactory.openSession(); Transaction trx = session.beginTransaction(); session.save(dataSet); trx.commit(); session.close(); }

public UserDataSet read(long id){ Session session = sessionFactory.openSession(); return (UserDataSet)session.load(UserDataSet.class, id); }

Page 17: Java осень 2014 занятие 8

DAO

17

public class UserDataSetDAO { private SessionFactory sessionFactory; public UserDataSetDAO(SessionFactory sessionFactory){ this.sessionFactory = sessionFactory; } … }

Page 18: Java осень 2014 занятие 8

План лекции

18

1. ORM

2. Hibernate

3. HQL

4. DB Service

Page 19: Java осень 2014 занятие 8

HQL

19

Hibernate Query Language

«Язык» написания запросов «к hibernate»

Вместо написания запросов к базе – описание запроса вызовами методов сессии

https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

http://www.tutorialspoint.com/hibernate/hibernate_query_language.htm

Page 20: Java осень 2014 занятие 8

HQL вставка

20

public void save(UserDataSet dataSet){ Session session = sessionFactory.openSession(); Transaction trx = session.beginTransaction(); session.save(dataSet); trx.commit(); session.close(); }

Page 21: Java осень 2014 занятие 8

HQL чтение

21

public UserDataSet read(long id){ Session session = sessionFactory.openSession(); return (UserDataSet) session.load(UserDataSet.class, id); }

Page 22: Java осень 2014 занятие 8

HQL поиск по ключу

22

public UserDataSet readByName(String name) { Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(UserDataSet.class); return (UserDataSet) criteria.add(Restrictions.eq("name", name)).uniqueResult(); }

Page 23: Java осень 2014 занятие 8

HQL получение всех записей

23

public List<UserDataSet> readAll() { Session session = sessionFactory.openSession(); Criteria criteria = session.createCriteria(UserDataSet.class); return (List<UserDataSet>) criteria.list(); }

Page 24: Java осень 2014 занятие 8

План лекции

24

1. ORM

2. Hibernate

3. HQL

4. DB Service

Page 25: Java осень 2014 занятие 8

Database Service

25

DatabaseService – сервис скрывающий работу с базой При создании соединяется с базой В своих методах создает DAO

JDBC TExecutor ― класс с типизированными методами для работы с запросами

Hibernate Аннотации на все DataSet-ы, автоматическое создание схемы

Page 26: Java осень 2014 занятие 8

Database Service

26

Для каждой таблицы

TableDAO ― объект доступа к данным таблицы с именем Table

TableDataSet ― объект с данными одной строки таблицы с именем Table

Page 27: Java осень 2014 занятие 8

Спасибо за внимание

Виталий Чибриков [email protected]