Продолжение статьи Object-relational mapping класс для работы с базой данных – общие сведения. Подробно рассматривается базовый для всех остальных классов TCommonObject , который реализует основные общие методы и свойства объектов.
Как уже было сказано TCommonObject реализует базовые функции, которые должны быть присущи объектам, реализующим и единичные записи, и списки единичных записей, и сложным объединениям. Рассмотрим подробнее их.
Подключение FConnection ( TADOConnection ) – указатель на экземпляк класса подключения к базе данных.
Свойство ID ( integer )– идентификатор первичного ключа в единичных записях содержит значение первичного ключа, в списках содержит значение первичного ключа для отбора нескольких единичных записей.
Свойство SID – второй идентификатор первичного ключа, применени аналогично свойству ID.
Свойство isDeleted ( Boolean ) – признак того что экземпляр класса удален и при выполнении процедуры Save будет вызвана процедура Delete.
Свойство AfterOnRefresh ( TOnRefresh ) – содержит указатель на метод который будет вызван после выполнения процедуры Refresh экземпляра единичной записи.
Свойство OnSetKayValue ( TOnSetKeyValue ) – содержит указатель на метод который выполняется при установке значений ключевых полей.
constructor Create; virtual – конструктор который в наследниках перегружается для задания начальных значений ( FisDeleted:= False; FID:= -1; FSID:= -1;).
function Save(ASaveItems: Boolean = True): Boolean; virtual; – общий метод сохранения, в данном классе реализует только проверку свойства isDeleted и вызов метода Delete в случае если свойство true. В наследниках переопределяется, в частности в TCommonEngine реализуется общий метод сохранения единичной записи, а в TCommonListEngine он реализует сохранение каждой единичной записи путем сохранения каждого элемента списка, а в случае установленного свойства isDeleted устанавливает элементам списка isDeleted после чего каждый элемент списка сохраняется.
function Delete: Boolean; virtual; – общий метод удаления перегружается в наследниках, в частности в TCommonEngine реализуется общий метод сохранения единичной записи, а в TCommonListEngine он реализует присвоение каждому элементу списка свойства isDeleted и очистку списка единичных записей.
function GetByID: Boolean; virtual; – общий метод получения значений полей из базы данных по ключевым полям, в наследниках перегружается, для реализации доступа к единичной записи, или получения списка единичных записей.
function Refresh:Boolean; virtual; – общий метод обновления экземпляра класса из базы, реализует вызов метода, ссылка на который находиться в свойстве AfterOnRefresh.
function GetAdditionalInfo: Boolean; virtual; – общий метод получения дополнительной информации для экземпляра класса, которая не реализуется общими методами или в перегруженных методах в наследниках.
function FillForeignKey(AForeignCodeValues: Pointer): Boolean; virtual; – функция заполнения значений внешнего ключа, перегружается в наследниках с целью заполнения конкретных свойств значениями внешнего ключа.
Код который реализует данный класс. Скачать его можно здесь uCommonEngine.
{Базовый класс для всех объектов базы данных} TCommonObject = class private FisDeleted: Boolean; FSID: Integer; FID: Integer; FAfterOnRefresh: TOnRefresh; FOnSetKayValue: TOnSetKeyValue; procedure SetID(const Value: Integer); procedure SetisDeleted(const Value: Boolean); procedure SetSID(const Value: Integer); procedure SetAfterOnRefresh(const Value: TOnRefresh); procedure SetOnSetKayValue(const Value: TOnSetKeyValue); public FConnection: TADOConnection; {Идентификатор записи } property ID: Integer read FID write SetID; {Идентификатор станции записи } property SID: Integer read FSID Write SetSID; {Признак того что экземпляр класса удален и при выполнении процедуры Save будет вызвана процедура Delete} property isDeleted: Boolean read FisDeleted write SetisDeleted; {свойоство вызываемое после обновления объекта} property AfterOnRefresh: TOnRefresh read FAfterOnRefresh write SetAfterOnRefresh; {Метод вызываемый при уставноки значений ключевого поля} property OnSetKayValue: TOnSetKeyValue read FOnSetKayValue write SetOnSetKayValue; {Конструктор при необходимости перегружается в наследуеміх классах } constructor Create;virtual; {Общий метод сохранения, вставляет обновляет и удаляет записи в зависимости от состояния isDeleted и ID} function Save(ASaveItems: Boolean = True): Boolean;virtual; {Общий метод удаления} function Delete: Boolean;virtual; {общий метод выбора из базы данных } function GetByID: Boolean;virtual; {Обновление элементов из базы данных} function Refresh:Boolean;virtual; {Общий метод заполнения дополнительной иорфмации объекта} function GetAdditionalInfo: Boolean; virtual; {Функция для заполнения значений внешнего ключа} function FillForeignKey(AForeignCodeValues: Pointer): Boolean;virtual; end; { TCommonObject } constructor TCommonObject.Create; begin FisDeleted:= False; FID:= -1; FSID:= -1; end; function TCommonObject.Delete: Boolean; begin Result:= True; end; function TCommonObject.FillForeignKey(AForeignCodeValues: Pointer): Boolean; begin Result:= True; end; function TCommonObject.GetAdditionalInfo: Boolean; begin Result:= True; end; function TCommonObject.GetByID: Boolean; begin Result:= True; end; function TCommonObject.Refresh: Boolean; begin Result:= True; if Assigned(FAfterOnRefresh) then Result:= AfterOnRefresh; end; function TCommonObject.Save(ASaveItems: Boolean = True): Boolean; begin Result:= True; if isDeleted then Result:= Delete; end; procedure TCommonObject.SetAfterOnRefresh(const Value: TOnRefresh); begin FAfterOnRefresh := Value; end; procedure TCommonObject.SetID(const Value: Integer); begin FID:= Value; end; procedure TCommonObject.SetisDeleted(const Value: Boolean); begin FisDeleted := Value; end; procedure TCommonObject.SetOnSetKayValue(const Value: TOnSetKeyValue); begin FOnSetKayValue := Value; end; procedure TCommonObject.SetSID(const Value: Integer); begin FSID := Value; end; { TCommonDocument } function TCommonDocument.ClearObjectItemList: Boolean; var lCommonObject: TCommonObject; i: Integer; begin for i:= 0 to FObjectItemList.Count - 1 do begin lCommonObject:= FObjectItemList[i]; if Assigned(lCommonObject) then lCommonObject.Free; end; FObjectList.Clear; FreeAndNil(FObjectList); inherited; end; function TCommonDocument.ClearObjectList: Boolean; var lCommonObject: TCommonObject; i: Integer; begin for i:= 0 to FObjectList.Count - 1 do begin lCommonObject:= FObjectList[i]; if Assigned(lCommonObject) then lCommonObject.Free; end; FObjectList.Clear; FreeAndNil(FObjectList); inherited; end; constructor TCommonDocument.Create; begin inherited Create; FObjectList:= TList.Create; FObjectItemList:= TList.Create; end; function TCommonDocument.Delete: Boolean; var i: Integer; lCommonObject: TCommonObject; begin Result:= inherited Delete; for I:= 0 to FObjectItemList.Count - 1 do begin lCommonObject:= FObjectItemList[i]; if Assigned(lCommonObject) then lCommonObject.Delete; end; for I:= 0 to FObjectList.Count - 1 do begin lCommonObject:= FObjectList[i]; if Assigned(lCommonObject) then lCommonObject.Delete; end; end; destructor TCommonDocument.Destroy; begin ClearObjectList; ClearObjectItemList; inherited; end; function TCommonDocument.GetAdditionalInfo: Boolean; begin Result:= inherited GetAdditionalInfo; end; function TCommonDocument.GetByID: Boolean; var lCommonObject: TCommonObject; i: Integer; begin Result:= inherited GetByID; SetAllConnection; if Assigned(OnSetKayValue) then OnSetKayValue; for i:= 0 to FObjectList.Count - 1 do begin lCommonObject:= FObjectList[i]; if Assigned(lCommonObject) then begin lCommonObject.GetByID; if Assigned(lCommonObject.OnSetKayValue) then lCommonObject.OnSetKayValue end; end; for i:= 0 to FObjectItemList.Count - 1 do begin lCommonObject:= FObjectItemList[i]; if Assigned(lCommonObject) then lCommonObject.GetByID; if Assigned(lCommonObject.OnSetKayValue) then lCommonObject.OnSetKayValue end; end; function TCommonDocument.Refresh: Boolean; var lCommonObject: TCommonObject; i: Integer; begin Result:= inherited Refresh; SetAllConnection; for i:= 0 to FObjectList.Count - 1 do begin lCommonObject:= FObjectList[i]; lCommonObject.GetByID; lCommonObject.GetAdditionalInfo; end; for i:= 0 to FObjectItemList.Count - 1 do begin lCommonObject:= FObjectItemList[i]; lCommonObject.GetByID; lCommonObject.GetAdditionalInfo; end; end; function TCommonDocument.Save(ASaveItems: Boolean = True): Boolean; var i: Integer; lCommonObject: TCommonObject; begin if not isDeleted then begin for i:= 0 to FObjectList.Count - 1 do begin lCommonObject:= FObjectList[i]; if Assigned(lCommonObject) then begin lCommonObject.Save(ASaveItems); if Assigned(lCommonObject.OnSetKayValue) then lCommonObject.OnSetKayValue; end; end; lCommonObject:= FObjectList[0]; if Assigned(lCommonObject) then begin ID:= lCommonObject.ID; SID:= lCommonObject.SID; end; if ASaveItems then for i:= 0 to FObjectItemList.Count - 1 do begin lCommonObject:= FObjectItemList[i]; if Assigned(lCommonObject) then begin lCommonObject.Save(ASaveItems); if Assigned(lCommonObject.OnSetKayValue) then lCommonObject.OnSetKayValue; end; end; end else begin if ASaveItems then for i:= 0 to FObjectItemList.Count - 1 do begin lCommonObject:= FObjectItemList[i]; if Assigned(lCommonObject) then begin lCommonObject.Save(ASaveItems); if Assigned(lCommonObject.OnSetKayValue) then lCommonObject.OnSetKayValue; end; end; for i:= 0 to FObjectList.Count - 1 do begin lCommonObject:= FObjectList[i]; if Assigned(lCommonObject) then begin lCommonObject.Save(ASaveItems); if Assigned(lCommonObject.OnSetKayValue) then lCommonObject.OnSetKayValue; end; end; end; Result:= inherited Save(ASaveItems); end; function TCommonDocument.SetAllConnection: Boolean; var i: Integer; lCommonObject: TCommonObject; begin Result:= True; for i:= 0 to FObjectList.Count - 1 do begin lCommonObject:= FObjectList[i]; if Assigned(lCommonObject) then begin lCommonObject.FConnection:= FConnection; if lCommonObject is TCommonDocument then TCommonDocument(lCommonObject).SetAllConnection; end; end; for i:= 0 to FObjectItemList.Count - 1 do begin lCommonObject:= FObjectItemList[i]; if Assigned(lCommonObject) then begin lCommonObject.FConnection:= FConnection; if lCommonObject is TCommonDocument then TCommonDocument(lCommonObject).SetAllConnection; end; end; end; function TCommonDocument.SetKeyValuesAll: Boolean; begin SetKeyValuesInHeaders; Result:= SetKeyValuesInItems; end; function TCommonDocument.SetKeyValuesInHeaders: Boolean; begin if Assigned(OnSetKayValue) then Result:= OnSetKayValue else Result:= True; end; function TCommonDocument.SetKeyValuesInItems: Boolean; var i: Integer; lOnSetKeyValue: TOnSetKeyValue; lCommonObject: TCommonObject; begin Result:= True; // SetKeyValuesInItems; SetAllConnection; for I:= 0 to FObjectList.Count - 1 do begin lCommonObject:= FObjectList[i]; if Assigned(lCommonObject) then begin lCommonObject.FConnection:= FConnection; lOnSetKeyValue:= lCommonObject.FOnSetKayValue; if Assigned(lOnSetKeyValue) then lOnSetKeyValue; end; end; for I:= 0 to FObjectItemList.Count - 1 do begin lCommonObject:= FObjectItemList[i]; if Assigned(lCommonObject) then lCommonObject.FConnection:= FConnection; end; end;
Еще интересные записи по данной теме
Tags: Delphi, Model-view-controller, MVC, Object-relational mappin, ORM
[...] базовые классы: TCommonDocument, TCommonListEngine, TCommonEngine, TCommonObject и рассмотрены общие сведения о [...]