Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
www.keremet.com      Паттерны проектирования      источников данных      Источник: работы Мартина Фаулера                 ...
www.keremet.com        •    Table Data Gateway        •    Row Data Gateway        •    Active Record        •    Data Map...
www.keremet.comTable Data Gateway            Шлюз таблицы данных            Содержит в себе все команды SQL,            не...
www.keremet.com                              Table Data GatewayМетоды Шлюза таблицы данных используютсядругими компонентам...
www.keremet.com                          Table Data Gateway                  ОбычноДля каждой таблицы БД создаетсясобствен...
www.keremet.com                               Table Data Gateway                  Хорошо сочетаетсяс типовым решением Моду...
www.keremet.com                         Table Data Gateway                    ПримерыProfileDataManager.csХранимые процедуры
www.keremet.comRow Data Gateway            Шлюз записи данных            Каждой строке таблицы базы данных            соот...
www.keremet.com                                                  Row Data GatewayШлюз выступает в ролиинтерфейса к строкед...
www.keremet.com                            Row Data Gateway                   Пример  create table people (       ID int p...
class PersonGateway...private String lastName;private String firstName;private int numberOfDependents;public String getLas...
class PersonGateway...private static final String updateStatementString = "UPDATEpeople " + " set lastname = ?, firstname ...
private static final String insertStatementString =         "INSERT INTO people VALUES (?, ?, ?, ?)";  public Long insert(...
class PersonFinder...  private final static String findStatementString =        "SELECT id, lastname, firstname, number_of...
В сценарии транзакцииPersonFinder finder = new PersonFinder();Iterator people = finder.findResponsibles().iterator();Strin...
www.keremet.comActive Record            Активная запись            Объект, выполняющий роль оболочки            для строки...
www.keremet.com                                     Active RecordСтруктура Активной записи должна вточности соответствоват...
www.keremet.com                                                             Active Record                                 ...
www.keremet.com                       Table Data Gateway                  ПримерPerson.java
www.keremet.comData Mapper            Преобразователь данных            Слой преобразователей (Mapper),            который...
www.keremet.com                                  Data Mapper                    ПроблемаКак Вы можете уменьшить взаимосвяз...
www.keremet.com                               Data Mapper                  РешениеВ большинстве случаев преобразовательдан...
www.keremet.com                                         Data MapperИзменение модели предметной области не требуетизменения...
www.keremet.com                                  Data Mapper                   ПрименениеЕс­ли бизнес-логика довольно прос...
www.keremet.com                                Data Mapper                  ПрименениеВ свою очередь, реализация более сло...
www.keremet.com                                 Data Mapper                   ПреимуществоОсновным преимуществомпреобразов...
www.keremet.com                  Data Mapper                  Пример
www.keremet.com                                  Data Mapper                  Отличия от Active RecordКратко говоря, объек...
www.keremet.com      Спасибо за внимание      Вопросы?                              докладчик                      Тренкен...
Upcoming SlideShare
Loading in …5
×

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

3,670 views

Published on

KeremetResearch.
г.Астана (Казахстан).
3 лекция из цикла "Паттерны проектирования".

Published in: Education

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

  1. 1. www.keremet.com Паттерны проектирования источников данных Источник: работы Мартина Фаулера докладчик Тренкеншу Виталий
  2. 2. www.keremet.com • Table Data Gateway • Row Data Gateway • Active Record • Data Mapper
  3. 3. www.keremet.comTable Data Gateway Шлюз таблицы данных Содержит в себе все команды SQL, необходимые для извлечения, вставки, обновления и удаления данных из таблицы
  4. 4. www.keremet.com Table Data GatewayМетоды Шлюза таблицы данных используютсядругими компонентами для взаимодействия с БД
  5. 5. www.keremet.com Table Data Gateway ОбычноДля каждой таблицы БД создаетсясобственный шлюз таблицы данныхШлюз не имеет состояний, всего лишьпередает данные в таблицу и из неѐ
  6. 6. www.keremet.com Table Data Gateway Хорошо сочетаетсяс типовым решением Модуль таблицы(Table Module)с паттерном Сценарий транзакции(Transaction Script) Типовые решения для представления бизнес-логики
  7. 7. www.keremet.com Table Data Gateway ПримерыProfileDataManager.csХранимые процедуры
  8. 8. www.keremet.comRow Data Gateway Шлюз записи данных Каждой строке таблицы базы данных соответствует свой экземпляр шлюза записи данных
  9. 9. www.keremet.com Row Data GatewayШлюз выступает в ролиинтерфейса к строкеданныхпрекрасно подходит дляприменения всценариях транзакции(Transaction Script)Типовое решение для представления бизнес-логики
  10. 10. www.keremet.com Row Data Gateway Пример create table people ( ID int primary key, lastname varchar, firstname varchar, number_of_dependents int)
  11. 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; }
  12. 12. class PersonGateway...private static final String updateStatementString = "UPDATEpeople " + " 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); }}
  13. 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); } }
  14. 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)); }
  15. 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();
  16. 16. www.keremet.comActive Record Активная запись Объект, выполняющий роль оболочки для строки таблицы. Он инкапсулирует доступ к базе данных и добавляет к данным логику домена.
  17. 17. www.keremet.com Active RecordСтруктура Активной записи должна вточности соответствовать записи втаблице БД:каждое поле должно соответствоватьодному столбцу таблицы
  18. 18. www.keremet.com Active Record ОбычноАктивная запись включает в себя методы: • создание экземпляра активной записи на основе строки, полученной в результате выполнения SQL-запроса; • создание и обновление записи в таблице из значений активной записи; • статические методы поиска, выполняющие стандартные SQL-запросы и возвращающие активные записи; • извлечение и установка значений полей (get- и set-методы); • реализация некоторых фрагментов бизнес-логики.
  19. 19. www.keremet.com Table Data Gateway ПримерPerson.java
  20. 20. www.keremet.comData Mapper Преобразователь данных Слой преобразователей (Mapper), который осуществляет передачу данных между объектами и базой данных, сохраняя последние независимыми друг от друга и от самого преобразователя
  21. 21. www.keremet.com Data Mapper ПроблемаКак Вы можете уменьшить взаимосвязь междуклассами вашего приложения и базой данных?Например, как вы можете уменьшитьпереписывание кода, если одно или несколькополей в таблице сменили название?
  22. 22. www.keremet.com Data Mapper РешениеВ большинстве случаев преобразовательданных применяется для того, чтобысхема базы данных и объектная модельмогли изменяться независимо друг отдруга.
  23. 23. www.keremet.com Data MapperИзменение модели предметной области не требуетизменения структуры базы данных и наоборот.Что крайне важно при наличии сложных отображений,особенно при использовании уже существующих базданных
  24. 24. www.keremet.com Data Mapper ПрименениеЕс­ли бизнес-логика довольно проста, ее,скорее всего, можно реализовать и безпримене­ния модели предметнойобласти или преобразователя данных.
  25. 25. www.keremet.com Data Mapper ПрименениеВ свою очередь, реализация более сложнойлогики невозможна без использованиямодели предметной области и, какследствие этого, преобразователя данных.
  26. 26. www.keremet.com Data Mapper ПреимуществоОсновным преимуществомпреобразователя данных являетсявозможность работы с модельюпредметной области без учета структурыбазы данных как в процессе проектирования,так и во время сборки и тестированияпроекта.
  27. 27. www.keremet.com Data Mapper Пример
  28. 28. www.keremet.com Data Mapper Отличия от Active RecordКратко говоря, объекты в шаблоне DataMapper никак не связаны со схемой БД, в товремя как Active Record на этой связипостроена.Вся работа с БД осуществляется черездополнительный слой.
  29. 29. www.keremet.com Спасибо за внимание Вопросы? докладчик Тренкеншу Виталий

×