• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Паттерны проектирования источников данных
 

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

on

  • 2,213 views

KeremetResearch.

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

Statistics

Views

Total Views
2,213
Views on SlideShare
1,858
Embed Views
355

Actions

Likes
1
Downloads
12
Comments
0

3 Embeds 355

http://it-club.kz 291
http://www.it-club.kz 63
http://a0.twimg.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

    • www.keremet.com Паттерны проектирования источников данных Источник: работы Мартина Фаулера докладчик Тренкеншу Виталий
    • www.keremet.com • Table Data Gateway • Row Data Gateway • Active Record • Data Mapper
    • www.keremet.comTable Data Gateway Шлюз таблицы данных Содержит в себе все команды SQL, необходимые для извлечения, вставки, обновления и удаления данных из таблицы
    • www.keremet.com Table Data GatewayМетоды Шлюза таблицы данных используютсядругими компонентами для взаимодействия с БД
    • www.keremet.com Table Data Gateway ОбычноДля каждой таблицы БД создаетсясобственный шлюз таблицы данныхШлюз не имеет состояний, всего лишьпередает данные в таблицу и из неѐ
    • www.keremet.com Table Data Gateway Хорошо сочетаетсяс типовым решением Модуль таблицы(Table Module)с паттерном Сценарий транзакции(Transaction Script) Типовые решения для представления бизнес-логики
    • www.keremet.com Table Data Gateway ПримерыProfileDataManager.csХранимые процедуры
    • www.keremet.comRow Data Gateway Шлюз записи данных Каждой строке таблицы базы данных соответствует свой экземпляр шлюза записи данных
    • www.keremet.com Row Data GatewayШлюз выступает в ролиинтерфейса к строкеданныхпрекрасно подходит дляприменения всценариях транзакции(Transaction Script)Типовое решение для представления бизнес-логики
    • www.keremet.com Row Data Gateway Пример create table people ( ID int primary key, lastname varchar, firstname varchar, number_of_dependents int)
    • 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; }
    • 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); }}
    • 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); } }
    • 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)); }
    • В сценарии транзакции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();
    • www.keremet.comActive Record Активная запись Объект, выполняющий роль оболочки для строки таблицы. Он инкапсулирует доступ к базе данных и добавляет к данным логику домена.
    • www.keremet.com Active RecordСтруктура Активной записи должна вточности соответствовать записи втаблице БД:каждое поле должно соответствоватьодному столбцу таблицы
    • www.keremet.com Active Record ОбычноАктивная запись включает в себя методы: • создание экземпляра активной записи на основе строки, полученной в результате выполнения SQL-запроса; • создание и обновление записи в таблице из значений активной записи; • статические методы поиска, выполняющие стандартные SQL-запросы и возвращающие активные записи; • извлечение и установка значений полей (get- и set-методы); • реализация некоторых фрагментов бизнес-логики.
    • 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Кратко говоря, объекты в шаблоне DataMapper никак не связаны со схемой БД, в товремя как Active Record на этой связипостроена.Вся работа с БД осуществляется черездополнительный слой.
    • www.keremet.com Спасибо за внимание Вопросы? докладчик Тренкеншу Виталий