Your SlideShare is downloading. ×
Паттерны проектирования источников данных
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

2,408
views

Published on

KeremetResearch. …

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

Published in: Education

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,408
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
19
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×