паттерны проектирования источников данных

29
www.keremet.com докладчик Тренкеншу Виталий Паттерны проектирования источников данных Источник: работы Мартина Фаулера

Upload: vitaliy-trenkenshu

Post on 14-Jul-2015

498 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: паттерны проектирования источников данных

www.keremet.com

докладчик

Тренкеншу Виталий

Паттерны проектированияисточников данных

Источник: работы Мартина Фаулера

Page 2: паттерны проектирования источников данных

www.keremet.com

• Table Data Gateway

• Row Data Gateway

• Active Record

• Data Mapper

Page 3: паттерны проектирования источников данных

www.keremet.com

Table Data Gateway

Шлюз таблицы данных

Содержит в себе все команды SQL,

необходимые для извлечения, вставки,

обновления и удаления данных из таблицы

Page 4: паттерны проектирования источников данных

www.keremet.comTable Data Gateway

Методы Шлюза таблицы данных используются

другими компонентами для взаимодействия с БД

Page 5: паттерны проектирования источников данных

www.keremet.comTable Data Gateway

Для каждой таблицы БД создается

собственный шлюз таблицы данных

Обычно

Шлюз не имеет состояний, всего лишь

передает данные в таблицу и из неѐ

Page 6: паттерны проектирования источников данных

www.keremet.comTable Data Gateway

с типовым решением Модуль таблицы

(Table Module)

Хорошо сочетается

с паттерном Сценарий транзакции

(Transaction Script)

Типовые решения для представления бизнес-логики

Page 7: паттерны проектирования источников данных

www.keremet.comTable Data Gateway

ProfileDataManager.cs

Примеры

Хранимые процедуры

Page 8: паттерны проектирования источников данных

www.keremet.com

Row Data Gateway

Шлюз записи данных

Каждой строке таблицы базы данных

соответствует свой

экземпляр шлюза записи данных

Page 9: паттерны проектирования источников данных

www.keremet.comRow Data Gateway

Шлюз выступает в роли

интерфейса к строке

данных

прекрасно подходит для

применения в

сценариях транзакции

(Transaction Script)

Типовое решение для представления бизнес-логики

Page 10: паттерны проектирования источников данных

www.keremet.comRow Data Gateway

Пример

create table people (

ID int primary key,

lastname varchar,

firstname varchar,

number_of_dependents int)

Page 11: паттерны проектирования источников данных

class PersonGateway...

private String lastName;

private String firstName;

private int numberOfDependents;

public String getLastName() { return lastName; }

public void setLastName(String lastName)

{ this.lastName = lastName; }

public String getFirstName() { return firstName; }

public void setFirstName(String firstName)

{ this.firstName = firstName; }

public int getNumberOfDependents()

{ return numberOfDependents; }

public void setNumberOfDependents(int numberOfDependents)

{ this.numberOfDependents = numberOfDependents; }

Page 12: паттерны проектирования источников данных

class PersonGateway...

private static final String updateStatementString = "UPDATE

people " + " set lastname = ?, firstname =

?, number_of_dependents = ? " + " where id = ?";

public void update() {

PreparedStatement updateStatement = null;

try

{

updateStatement = DB.prepare(updateStatementString);

updateStatement.setString(1, lastName);

updateStatement.setString(2, firstName);

updateStatement.setInt(3, numberOfDependents);

updateStatement.setInt(4, getID().intValue());

updateStatement.execute();

} catch (Exception e) { throw new ApplicationException(e);

}

finally {DB.cleanUp(updateStatement); }

}

Page 13: паттерны проектирования источников данных

private static final String insertStatementString =

"INSERT INTO people VALUES (?, ?, ?, ?)";

public Long insert() {

PreparedStatement insertStatement = null;

try {

insertStatement = DB.prepare(insertStatementString);

setID(findNextDatabaseId());

insertStatement.setInt(1, getID().intValue());

insertStatement.setString(2, lastName);

insertStatement.setString(3, firstName);

insertStatement.setInt(4, numberOfDependents);

insertStatement.execute();

Registry.addPerson(this);

return getID();

} catch (SQLException e) {

throw new ApplicationException(e);

} finally {DB.cleanUp(insertStatement);

}

}

Page 14: паттерны проектирования источников данных

class PersonFinder...

private final static String findStatementString =

"SELECT id, lastname, firstname, number_of_dependents " +

" from people " +

" WHERE id = ?";

public PersonGateway find(Long id) {

PersonGateway result = (PersonGateway) Registry.getPerson(id);

if (result != null) return result;

PreparedStatement findStatement = null;

ResultSet rs = null;

try {

findStatement = DB.prepare(findStatementString);

findStatement.setLong(1, id.longValue());

rs = findStatement.executeQuery();

rs.next();

result = PersonGateway.load(rs);

return result;

} catch (SQLException e) {

throw new ApplicationException(e);

} finally {DB.cleanUp(findStatement, rs);

}

}

public PersonGateway find(long id) {

return find(new Long(id));

}

Page 15: паттерны проектирования источников данных

PersonFinder finder = new PersonFinder();

Iterator people = finder.findResponsibles().iterator();

StringBuffer result = new StringBuffer();

while (people.hasNext()) {

PersonGateway each = (PersonGateway) people.next();

result.append(each.getLastName());

result.append(" ");

result.append(each.getFirstName());

result.append(" ");

result.append(String.valueOf(each.getNumberOfDependents()));

result.append(" ");

}

return result.toString();

В сценарии транзакции

Page 16: паттерны проектирования источников данных

www.keremet.com

Active Record

Активная запись

Объект, выполняющий роль оболочки

для строки таблицы.

Он инкапсулирует доступ к базе данных и

добавляет к данным логику домена.

Page 17: паттерны проектирования источников данных

www.keremet.comActive Record

Структура Активной записи должна в

точности соответствовать записи в

таблице БД:

каждое поле должно соответствовать

одному столбцу таблицы

Page 18: паттерны проектирования источников данных

www.keremet.com

Активная запись включает в себя методы:

Обычно

• создание экземпляра активной записи на основе строки, полученной в

результате выполнения SQL-запроса;

• создание и обновление записи в таблице из значений активной записи;

• статические методы поиска, выполняющие стандартные SQL-запросы и

возвращающие активные записи;

• извлечение и установка значений полей (get- и set-методы);

• реализация некоторых фрагментов бизнес-логики.

Active Record

Page 19: паттерны проектирования источников данных

www.keremet.comTable Data Gateway

Person.java

Пример

Page 20: паттерны проектирования источников данных

www.keremet.com

Data Mapper

Преобразователь данных

Слой преобразователей (Mapper),

который осуществляет передачу данных

между объектами и базой данных,

сохраняя последние независимыми друг от

друга и от самого преобразователя

Page 21: паттерны проектирования источников данных

www.keremet.com

Как Вы можете уменьшить взаимосвязь между

классами вашего приложения и базой данных?

Например, как вы можете уменьшить

переписывание кода, если одно или несколько

полей в таблице сменили название?

Проблема

Data Mapper

Page 22: паттерны проектирования источников данных

www.keremet.com

В большинстве случаев преобразователь

данных применяется для того, чтобы

схема базы данных и объектная модель

могли изменяться независимо друг от

друга.

Решение

Data Mapper

Page 23: паттерны проектирования источников данных

www.keremet.comData Mapper

Изменение модели предметной области не требует

изменения структуры базы данных и наоборот.

Что крайне важно при наличии сложных

отображений, особенно при использовании уже

существующих баз данных

Page 24: паттерны проектирования источников данных

www.keremet.com

Ес­ли бизнес-логика довольно проста, ее,

скорее всего, можно реализовать и без

примене­ния модели предметной

области или преобразователя данных.

Применение

Data Mapper

Page 25: паттерны проектирования источников данных

www.keremet.com

В свою очередь, реализация более сложной

логики невозможна без использования

модели предметной области и, как

следствие этого, преобразователя данных.

Применение

Data Mapper

Page 26: паттерны проектирования источников данных

www.keremet.com

Основным преимуществом

преобразователя данных является

возможность работы с моделью

предметной области без учета структуры

базы данных как в процессе

проектирования, так и во время сборки и

тестирования проекта.

Преимущество

Data Mapper

Page 27: паттерны проектирования источников данных

www.keremet.comData Mapper

Пример

Page 28: паттерны проектирования источников данных

www.keremet.com

Кратко говоря, объекты в шаблоне Data

Mapper никак не связаны со схемой БД, в то

время как Active Record на этой связи

построена.

Вся работа с БД осуществляется через

дополнительный слой.

Отличия от Active Record

Data Mapper

Page 29: паттерны проектирования источников данных

www.keremet.com

докладчик

Тренкеншу Виталий

Спасибо за вниманиеВопросы?