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

Post on 25-Jun-2015

177 Views

Category:

Education

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

Java Лекция 3.2

«ORM»

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

План лекции

2

1. ORM

2. Hibernate

3. HQL

4. DB Service

Object-Relational Mapping

3

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

Пример

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

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

Java Persistence API

4

Package javax.persistence

Аннотации

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

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

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

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

DataSet

5

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

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

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

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

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; } }

Data Access Object

DAO

7

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

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

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

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

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

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

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

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

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

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;

}

План лекции

9

1. ORM

2. Hibernate

3. HQL

4. DB Service

<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

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

hibernate.hbm2ddl.auto

12

hibernate.hbm2ddl.auto

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

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

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

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

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

Session Factory

13

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

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

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

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();

Аннотации для 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; … }

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); }

DAO

17

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

План лекции

18

1. ORM

2. Hibernate

3. HQL

4. DB Service

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

HQL вставка

20

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

HQL чтение

21

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

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(); }

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

23

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

План лекции

24

1. ORM

2. Hibernate

3. HQL

4. DB Service

Database Service

25

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

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

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

Database Service

26

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

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

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

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

Виталий Чибриков chibrikov@corp.mail.ru

top related