Бизнес-объект. Object Relational Mapping

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Создана новая страница размером Рассмотрим такой пример. В базе данных Гедымина информация о компании (юрид...)
 
 
(не показаны 7 промежуточных версий 1 участника)
Строка 1: Строка 1:
Рассмотрим такой пример. В базе данных Гедымина информация о компании (юридическом лице) хранится в виде связанных 1-к-1 записей минимум в двух таблицах: [[GD_CONTACT]] и [[GD_COMPANY]]. Третья таблица — [[GD_COMPANYCODE]] — опциональная.
+
Программисты, знакомые с Delphi, знают, что для работы с выборкой из базы данных используется один из наследников компонента TDataSet. С его помощью достаточно легко организовать редактирование, вставку и удаление записей, если они извлекаются из одной таблицы. Но, что, если данные объекта хранятся в нескольких таблицах? Вставку, удаление, либо изменение придется организовывать вручную. Работа эта достаточно кропотливая и неблагодарная, так как в случае изменения структуры базы данных придется вносить коррективы в ранее написанный код. По иному обстоит дело при использовании бизнес-объекта. Все сложности процесса добавления, изменения или удаления записей из нескольких таблиц скрыты от разработчика, «зашиты» в код бизнес-объекта.
 +
 
 +
Рассмотрим такой пример. В базе данных информация о компании (юридическом лице) хранится в виде связанных 1-к-1 записей в двух таблицах: [[GD_CONTACT]] и [[GD_COMPANY]]. Третья таблица — [[GD_COMPANYCODE]] — опциональная.
  
 
http://gsbelarus.com/gs/images/gs/2009/book/Database.Ref.gd_company.png
 
http://gsbelarus.com/gs/images/gs/2009/book/Database.Ref.gd_company.png
Строка 6: Строка 8:
  
 
# Старт транзакции
 
# Старт транзакции
# Добавление записи в GD_CONTACT
+
# Добавление записи в [[GD_CONTACT]]
# Добавление записи в GD_COMPANY
+
# Добавление записи в [[GD_COMPANY]]
# Добавление записи в GD_COMPANYCODE
+
# Добавление записи в [[GD_COMPANYCODE]]
 
# Комит транзакции
 
# Комит транзакции
  
Ниже представлены две функции. Первая — '''AddCompany''' — добавляет компанию "реляционным" способом, выполняя последовательно три операции INSERT в разные таблицы. Функция '''AddCompany2''' использует бизнес-объект типа [[TgdcCompany]] для достижения такого же результата.
+
Ниже представлены две функции. Первая — '''AddCompany''' — добавляет компанию "реляционным" способом, выполняя последовательно три операции INSERT в разные таблицы. Функция '''AddCompany2''' использует бизнес-объект типа [[gdcContacts.TgdcCompany|TgdcCompany]] для достижения такого же результата.
 
+
==== Функция AddCompany ====
+
  
 +
<table>
 +
<tr><td><b>Функция AddCompany</b></td><td><b>Функция AddCompany2</b></td></tr>
 +
<tr valign="top">
 +
<td>
 
<source lang="vbnet">
 
<source lang="vbnet">
 +
Option Explicit
 
Function AddCompany(CompanyName, TaxID)
 
Function AddCompany(CompanyName, TaxID)
  
Строка 31: Строка 36:
 
     "VALUES (:id, :parent, :contacttype, :name) "
 
     "VALUES (:id, :parent, :contacttype, :name) "
 
   q.ParamByName("id").AsInteger = ID
 
   q.ParamByName("id").AsInteger = ID
   q.ParamByName("parent").AsInteger = gdcBaseManager.GetIDByRUIDString("147002208_31587988")  
+
   q.ParamByName("parent").AsInteger = _
 +
    gdcBaseManager.GetIDByRUIDString("147002208_31587988")  
 
   q.ParamByName("contacttype").AsInteger = 3
 
   q.ParamByName("contacttype").AsInteger = 3
 
   q.ParamByName("name").AsString = CompanyName
 
   q.ParamByName("name").AsString = CompanyName
 
   q.ExecQuery
 
   q.ExecQuery
 
    
 
    
   q.SQL.Text = "INSERT INTO gd_company (contactkey, fullname) VALUES (:contactkey, :fullname)"
+
   q.SQL.Text = _
 +
    "INSERT INTO gd_company (contactkey, fullname) VALUES (:contactkey, :fullname)"
 
   q.ParamByName("contactkey").AsInteger = ID
 
   q.ParamByName("contactkey").AsInteger = ID
 
   q.ParamByName("fullname").AsString = CompanyName
 
   q.ParamByName("fullname").AsString = CompanyName
 
   q.ExecQuery
 
   q.ExecQuery
  
   q.SQL.Text = "INSERT INTO gd_companycode (companykey, taxid) VALUES (:companykey, :taxid) "
+
   q.SQL.Text = _
 +
    "INSERT INTO gd_companycode (companykey, taxid) VALUES (:companykey, :taxid) "
 
   q.ParamByName("companykey").AsInteger = ID
 
   q.ParamByName("companykey").AsInteger = ID
 
   q.ParamByName("taxid").AsString = TaxID
 
   q.ParamByName("taxid").AsString = TaxID
Строка 51: Строка 59:
 
End Function
 
End Function
 
</source>
 
</source>
 
+
</td>
==== Функция AddCompany2 ====
+
<td>
 
+
 
<source lang="vbnet">
 
<source lang="vbnet">
 
Option Explicit
 
Option Explicit
Строка 64: Строка 71:
 
   Obj.Open
 
   Obj.Open
 
   Obj.Insert
 
   Obj.Insert
   Obj.FieldByName("parent").AsInteger = gdcBaseManager.GetIDByRUIDString("147002208_31587988")
+
   Obj.FieldByName("parent").AsInteger = _
 +
    gdcBaseManager.GetIDByRUIDString("147002208_31587988")
 
   Obj.FieldByName("name").AsString = CompanyName
 
   Obj.FieldByName("name").AsString = CompanyName
 
   Obj.FieldByName("taxid").AsString = TaxID
 
   Obj.FieldByName("taxid").AsString = TaxID
Строка 73: Строка 81:
 
End Function
 
End Function
 
</source>
 
</source>
 +
</td>
 +
</tr>
 +
</table>
  
 
Очевидно, что второй вариант требует меньших усилий со стороны программиста. Код получается короче и легче в понимании.
 
Очевидно, что второй вариант требует меньших усилий со стороны программиста. Код получается короче и легче в понимании.
Строка 83: Строка 94:
 
</source>
 
</source>
 
следует прописать RUID некоторой папки из вашего справочника клиентов. Создаваемые функциями компании будут размещены в этой папке.
 
следует прописать RUID некоторой папки из вашего справочника клиентов. Создаваемые функциями компании будут размещены в этой папке.
 +
 +
===См. также===
 +
 +
* [http://ru.wikipedia.org/wiki/ORM ORM]
  
 
[[Category:Учебный курс]]
 
[[Category:Учебный курс]]
 
[[Category:Бизнес-объект]]
 
[[Category:Бизнес-объект]]
 +
[[Category:База данных]]

Текущая версия на 16:01, 10 января 2015

Программисты, знакомые с Delphi, знают, что для работы с выборкой из базы данных используется один из наследников компонента TDataSet. С его помощью достаточно легко организовать редактирование, вставку и удаление записей, если они извлекаются из одной таблицы. Но, что, если данные объекта хранятся в нескольких таблицах? Вставку, удаление, либо изменение придется организовывать вручную. Работа эта достаточно кропотливая и неблагодарная, так как в случае изменения структуры базы данных придется вносить коррективы в ранее написанный код. По иному обстоит дело при использовании бизнес-объекта. Все сложности процесса добавления, изменения или удаления записей из нескольких таблиц скрыты от разработчика, «зашиты» в код бизнес-объекта.

Рассмотрим такой пример. В базе данных информация о компании (юридическом лице) хранится в виде связанных 1-к-1 записей в двух таблицах: GD_CONTACT и GD_COMPANY. Третья таблица — GD_COMPANYCODE — опциональная.

Database.Ref.gd_company.png

Таким образом, операция добавления новой компании с заданным именем и УНП (TaxID) потребует выполнения последовательности следующих действий:

  1. Старт транзакции
  2. Добавление записи в GD_CONTACT
  3. Добавление записи в GD_COMPANY
  4. Добавление записи в GD_COMPANYCODE
  5. Комит транзакции

Ниже представлены две функции. Первая — AddCompany — добавляет компанию "реляционным" способом, выполняя последовательно три операции INSERT в разные таблицы. Функция AddCompany2 использует бизнес-объект типа TgdcCompany для достижения такого же результата.

Функция AddCompanyФункция AddCompany2
Option Explicit
Function AddCompany(CompanyName, TaxID)
 
  Dim q, Tr, Creator, ID
  Set Creator = New TCreator
  Set q = Creator.GetObject(Application, "TIBSQL", "")
  Set Tr = Creator.GetObject(Application, "TIBTransaction", "")
  ID = gdcBaseManager.GetNextID
 
  Tr.DefaultDatabase = gdcBaseManager.Database
  Tr.StartTransaction
 
  q.Transaction = Tr
  q.SQL.Text = "INSERT INTO gd_contact (id, parent, contacttype, name) " &_
    "VALUES (:id, :parent, :contacttype, :name) "
  q.ParamByName("id").AsInteger = ID
  q.ParamByName("parent").AsInteger = _
    gdcBaseManager.GetIDByRUIDString("147002208_31587988") 
  q.ParamByName("contacttype").AsInteger = 3
  q.ParamByName("name").AsString = CompanyName
  q.ExecQuery
 
  q.SQL.Text = _
    "INSERT INTO gd_company (contactkey, fullname) VALUES (:contactkey, :fullname)"
  q.ParamByName("contactkey").AsInteger = ID
  q.ParamByName("fullname").AsString = CompanyName
  q.ExecQuery
 
  q.SQL.Text = _
    "INSERT INTO gd_companycode (companykey, taxid) VALUES (:companykey, :taxid) "
  q.ParamByName("companykey").AsInteger = ID
  q.ParamByName("taxid").AsString = TaxID
  q.ExecQuery
 
  Tr.Commit
  AddCompany = ID
 
End Function
Option Explicit
Function AddCompany2(CompanyName, TaxID)
 
  Dim Creator, Obj
  Set Creator = New TCreator
  Set Obj = Creator.GetObject(Application, "TgdcCompany", "")
 
  Obj.Open
  Obj.Insert
  Obj.FieldByName("parent").AsInteger = _
    gdcBaseManager.GetIDByRUIDString("147002208_31587988")
  Obj.FieldByName("name").AsString = CompanyName
  Obj.FieldByName("taxid").AsString = TaxID
  Obj.Post
 
  AddCompany2 = Obj.ID
 
End Function

Очевидно, что второй вариант требует меньших усилий со стороны программиста. Код получается короче и легче в понимании.

[править] Важное замечание!

Если вы захотите поэксперементировать с этими функциями на своей базе данных, то в вызове:

  gdcBaseManager.GetIDByRUIDString("147002208_31587988")

следует прописать RUID некоторой папки из вашего справочника клиентов. Создаваемые функциями компании будут размещены в этой папке.

[править] См. также

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты