hp1361
یک شنبه 09 آبان 1395, 15:49 عصر
به نام خدا
آموزش استفاده از TMS Aurelius در دلفی
درباره ORM
یکی از حوزه های دارای اهمیت بین برنامه نویسان، حوزه برنامه های مرتبط با بانک اطلاعاتی می باشد. به واسطه امکانات و ابزارهایی که محیط RAD Studio Delphi ارائه نموده، دلفی کارها در این حوزه بیشتر و موفق تر ظاهر شده اند.
بی شک اقداماتی چون ارتباط با پایگاه داده، واکشی داده ها، ارسال پارامتر ها، نوشتن کوئری ها ووو و از همه مهمتر بهینه سازی و تست صحت عملکرد آن همیشه جزو دغدغه های برنامه نویسان این حوزه بوده و هست.
یکی از ابزارهایی که به نوعی قسمت اعظمی از دغدغه های مورد اشاره را پوشش داده و از مشکلات برنامه نویس میکاهد، ابزار ORM (Object-relational mapping) می باشد.(برای روانی نوشته ها از کلمه "ابزار" استفاده شده است).
یک تعریف ساده (http://pikneek.com/programming/orm-%DA%86%DB%8C%D8%B3%D8%AA/)
وقتی در زبان های برنامه نویسی میخواهید به پایگاه داده وصل شوید و از آن استفاده کنید، باید کدهای SQL را بدانید تا بتوانید با داده ها کار کنید برای مثال برای انتخاب داده ها باید بنویسید:
SELECT * FROM users
که لیست همه کاربران را بگیرید. کارهایی از این دست در دراز مدت خیلی زیاد هستند و اگر شما بخواهید پایگاه داده خودتان را عوض کنید، می بایست خیلی از این کد ها را عوض کرده و متناسب با پایگاه داده جدید بنویسید. حالا ORM ها یک لایه ای برای شما بوجود می اورد که نیازی نباشد کدهای SQL رو خودتان بنویسید. مثلا شما مینویسید:
User.all();
و این خط خودش کد SQL تولید میکند و از جدول کاربران مشخصات تمام کاربران را لیست می کند. حالا اگر بخواهید پایگاه داده تان را هم عوض کنید ORM کدهای مربوط به پایگاه داده جدید را تولید میکند و نیازی نیست خودتان این کار را انجام دهید.
شروع سریع
بدون هیچ مقدمه ای سر اصل مطب می رویم : نحوه استفاده از TMS Aurelius ORM در برنامه:
1- ساخت کلاس مدل
به بیان ساده، آنچه که قرار است بین برنامه و دیتابیس توسط Aurelius ارسال و دریافت شـــــود می بایست در قالبی قرار گیرند که برای Aurelius قابل فهم باشد. این قالب برای برنامه نویس نیز بسیار قابل درک و آشناست. این قالب چیزی نیست جز "کلاس"! بله کلاس.
یک کلاس (که می تواند بصورت مشتق شده از دیگر کلاس ها نیز باشد) همانند یک رکورد از بانک اطلاعاتی خواهد بود که هر یک از پراپرتی ها نقش فیلد ها(یا همان ستون) بانک را خواهند داشت.
پس کلاس(یا بهتر است بگوییم جداول) خود را بسازید :
type
TPerson = class
private
FLastName: string;
FFirstName: string;
FEmail: string;
public
property LastName: string read FLastName write FLastName;
property FirstName: string read FFirstName write FFirstName;
property Email: string read FEmail write FEmail;
end;
2- نگاشت کلاس
بعد از تعریف کلاس مدل، برای اینکه Aurelius بداند چگونه بین کلاس و پروپرتی های آن با جداول و فیلد ها ارتباط برقرار کند، نیاز هست تا نگاشت های مورد نیاز انجام پذیرد. لذا ابتدا دو Attribute( [Entity] و [Automapping]) و سپس فیلد Fid از نوع Integer را به کلاس اضافه می نمائیم.
uses
{...}, Aurelius.Mapping.Attributes;
type
[Entity]
[Automapping]
TPerson = class
private
FId: integer;
FLastName: string;
FFirstName: string;
FEmail: string;
public
property Id: integer read FId;
property LastName: string read FLastName write FLastName;
property FirstName: string read FFirstName write FFirstName;
property Email: string read FEmail write FEmail;
end;
- با افزودن ویژگی [Entity] به هر کلاس، Aurelius آن کلاس را شناسایی کرده و جدولی بنام همان کلاس(البته بدون حرف T) در دیتابیس خواهد ساخت. (امکان تعیین نام دلخواه برای جدول وجود دارد که در آموزش های بعدی ارائه خواهد شد).
- با افزودن ویژگی [Automapping] به هر کلاس، Aurelius تمام نگاشت های مورد نیاز را انجام خواهد داد. به این معنی که با توجه به پروپرتی ها مواردی چون نام فیلد، نوع فیلد، کلیدهای خارجی، ایندکس ها و ... را ایجاد خواهد کرد.)
3- تعریف اینترفیس IDBConnection
همانطور که گفته شد، یکی از ویژگی های اصلی و بارز ORM ها، تسهیل در تولید کدهای SQL جهت دیتابیس های مختلف و ساده سازی فرآیند مربوطه است. شما با استفاده از هر یک از کامپوننت های مورد نظر خود نظیر (FireDAC, UniDAC, ADO, dbExpress, …) میتوانید به دیتابیس متصل شده و باقی کارها را به عهده Aurelis بسپارید. نقطه شروع ایجاد IDBConnection است. برای این منظور با استفاده از Adaptor هایی که توسط Aurelius فراهم شده، کامپوننت اتصال را بعنوان ورودی به آن پاس داده و خروجی تابع نتیجه مورد نظر ما خواهد بود.
uses
{...}, Aurelius.Drivers.Interfaces, Aurelius.Drivers.dbExpress;
var
MyConnection: IDBConnection
begin
// SQLConnection1 is a dbExpress TSQLConnection component
// You can use several different data-access component libraries
MyConnection := TDBExpressConnectionAdapter.Create(SQLConnection1, false);
4- تعیین the SQL dialect
با اضافه کردن یونت های Aurelius.SQL.XXX (که در اینجا XXX نشان دهنده نام SQL Dialect خواهد بود) به Aurelius خواهیم گفت که چه SQL dialect هایی در برنامه استفاده خواهد شد. برای نمونه در مثال زیر به Aurelius خواهیم گفت که Dialect های MySQL و MSSQL Server در برنامه مورد استفاده خواهند بود. Aurelius با توجه به کانکشن تعریف شده در مرحله قبل، Dialect درست را انتخاب خواهد نمود.
uses
{...}, Aurelius.SQL.MySQL, Aurelius.SQL.MSSQL;
5- ساختن دیتابیس
با استفاده از DatabaseManager میتوان جداول و فیلدهای یک دیتابیس را ساخت. تنها کافیست دستور BuildDatabase را فراخوانی کنید!( درحال حاضر امکان ایجاد خودکار فایل دیتابیس توسط اورلیوس وجود نداشته و فایل مربوطه میبایست بصورت دتسی توسط کاربر ایجاد گردد!)
uses
{...}, Aurelius.Engine.DatabaseManager;
DBManager := TDatabaseManager.Create(MyConnection);
DBManager.BuildDatabase;
نکته : در صورتیکه جداول و فیلدهای آن درحال حاضر در دیتابیس وجود دارد، نیازی به انجام این مرحله نیست.
6- نمونه سازی از کلاس ها و ذخیره در دیتابیس
جهت ذخیره کلاس ها در دیتابیس، از ObjectManager استفاده خواهیم نمود. با نمونه سازی از یک کلاس و پاس دادن آن به ObjectManager، اطلاعات کلاس بصورت یک رکورد در دیتابیس ذخیره می گردد.
uses
{...}, Aurelius.Engine.ObjectManager;
Person := TPerson.Create;
Person.LastName := 'Lennon';
Person.FirstName := 'John';
Person.Email := 'lennon@beatles.com';
Manager := TObjectManager.Create(MyConnection);
try
Manager.Save(Person);
PersonId := Person.Id;
finally
Manager.Free;
end;
7- دریافت و یا بروزرسانی رکورد های جدول
فرآیند کار کاملا ساده و مشخص است. اطلاعات از دیتابیس توسط ObjectManager دریافت شده و در قالب کلاس در اختیار ما قرار میگیرد. پس از اعمال تغییرات مدنظر، مجدداً کلاس را به ObjectManager پاس داده تا مقادیر جدید در دیتابیس ذخیره گردد.
Manager := TObjectManager.Create(MyConnection);
Person := Manager.Find<TPerson>(PersonId);
Person.Email := 'john.lennon@beatles.org';
Manager.Flush;
Manager.Free;
8- جستجو در دیتابیس
اگر بخواهیم لیست تمام افرادی که ایمیل با دامنه "beatles.org" دارند را داشته باشیم، بصورت زیر عمل خواهیم کرد:
uses
{...}, Aurelius.Criteria.Base, Aurelius.Criteria.Linq;
Manager := TObjectManager.Create(MyConnection);
Results := Manager.Find<TPerson>
.Where(
TLinq.Like('Email', '%beatles.org%')
or TLinq.Like('Email', '%beatles.com%')
)
.List;
// Iterate through Results here, which is a TList<TPerson> list.
for person in Results do
// use person variable here, it's a TPerson object
Manager.Free;
در ادامه یک برنامه ساده ذخیره و بازیابی اطلاعات دفترچه تلفن را قدم به قدم اجرا خواهیم کرد.
آموزش استفاده از TMS Aurelius در دلفی
درباره ORM
یکی از حوزه های دارای اهمیت بین برنامه نویسان، حوزه برنامه های مرتبط با بانک اطلاعاتی می باشد. به واسطه امکانات و ابزارهایی که محیط RAD Studio Delphi ارائه نموده، دلفی کارها در این حوزه بیشتر و موفق تر ظاهر شده اند.
بی شک اقداماتی چون ارتباط با پایگاه داده، واکشی داده ها، ارسال پارامتر ها، نوشتن کوئری ها ووو و از همه مهمتر بهینه سازی و تست صحت عملکرد آن همیشه جزو دغدغه های برنامه نویسان این حوزه بوده و هست.
یکی از ابزارهایی که به نوعی قسمت اعظمی از دغدغه های مورد اشاره را پوشش داده و از مشکلات برنامه نویس میکاهد، ابزار ORM (Object-relational mapping) می باشد.(برای روانی نوشته ها از کلمه "ابزار" استفاده شده است).
یک تعریف ساده (http://pikneek.com/programming/orm-%DA%86%DB%8C%D8%B3%D8%AA/)
وقتی در زبان های برنامه نویسی میخواهید به پایگاه داده وصل شوید و از آن استفاده کنید، باید کدهای SQL را بدانید تا بتوانید با داده ها کار کنید برای مثال برای انتخاب داده ها باید بنویسید:
SELECT * FROM users
که لیست همه کاربران را بگیرید. کارهایی از این دست در دراز مدت خیلی زیاد هستند و اگر شما بخواهید پایگاه داده خودتان را عوض کنید، می بایست خیلی از این کد ها را عوض کرده و متناسب با پایگاه داده جدید بنویسید. حالا ORM ها یک لایه ای برای شما بوجود می اورد که نیازی نباشد کدهای SQL رو خودتان بنویسید. مثلا شما مینویسید:
User.all();
و این خط خودش کد SQL تولید میکند و از جدول کاربران مشخصات تمام کاربران را لیست می کند. حالا اگر بخواهید پایگاه داده تان را هم عوض کنید ORM کدهای مربوط به پایگاه داده جدید را تولید میکند و نیازی نیست خودتان این کار را انجام دهید.
شروع سریع
بدون هیچ مقدمه ای سر اصل مطب می رویم : نحوه استفاده از TMS Aurelius ORM در برنامه:
1- ساخت کلاس مدل
به بیان ساده، آنچه که قرار است بین برنامه و دیتابیس توسط Aurelius ارسال و دریافت شـــــود می بایست در قالبی قرار گیرند که برای Aurelius قابل فهم باشد. این قالب برای برنامه نویس نیز بسیار قابل درک و آشناست. این قالب چیزی نیست جز "کلاس"! بله کلاس.
یک کلاس (که می تواند بصورت مشتق شده از دیگر کلاس ها نیز باشد) همانند یک رکورد از بانک اطلاعاتی خواهد بود که هر یک از پراپرتی ها نقش فیلد ها(یا همان ستون) بانک را خواهند داشت.
پس کلاس(یا بهتر است بگوییم جداول) خود را بسازید :
type
TPerson = class
private
FLastName: string;
FFirstName: string;
FEmail: string;
public
property LastName: string read FLastName write FLastName;
property FirstName: string read FFirstName write FFirstName;
property Email: string read FEmail write FEmail;
end;
2- نگاشت کلاس
بعد از تعریف کلاس مدل، برای اینکه Aurelius بداند چگونه بین کلاس و پروپرتی های آن با جداول و فیلد ها ارتباط برقرار کند، نیاز هست تا نگاشت های مورد نیاز انجام پذیرد. لذا ابتدا دو Attribute( [Entity] و [Automapping]) و سپس فیلد Fid از نوع Integer را به کلاس اضافه می نمائیم.
uses
{...}, Aurelius.Mapping.Attributes;
type
[Entity]
[Automapping]
TPerson = class
private
FId: integer;
FLastName: string;
FFirstName: string;
FEmail: string;
public
property Id: integer read FId;
property LastName: string read FLastName write FLastName;
property FirstName: string read FFirstName write FFirstName;
property Email: string read FEmail write FEmail;
end;
- با افزودن ویژگی [Entity] به هر کلاس، Aurelius آن کلاس را شناسایی کرده و جدولی بنام همان کلاس(البته بدون حرف T) در دیتابیس خواهد ساخت. (امکان تعیین نام دلخواه برای جدول وجود دارد که در آموزش های بعدی ارائه خواهد شد).
- با افزودن ویژگی [Automapping] به هر کلاس، Aurelius تمام نگاشت های مورد نیاز را انجام خواهد داد. به این معنی که با توجه به پروپرتی ها مواردی چون نام فیلد، نوع فیلد، کلیدهای خارجی، ایندکس ها و ... را ایجاد خواهد کرد.)
3- تعریف اینترفیس IDBConnection
همانطور که گفته شد، یکی از ویژگی های اصلی و بارز ORM ها، تسهیل در تولید کدهای SQL جهت دیتابیس های مختلف و ساده سازی فرآیند مربوطه است. شما با استفاده از هر یک از کامپوننت های مورد نظر خود نظیر (FireDAC, UniDAC, ADO, dbExpress, …) میتوانید به دیتابیس متصل شده و باقی کارها را به عهده Aurelis بسپارید. نقطه شروع ایجاد IDBConnection است. برای این منظور با استفاده از Adaptor هایی که توسط Aurelius فراهم شده، کامپوننت اتصال را بعنوان ورودی به آن پاس داده و خروجی تابع نتیجه مورد نظر ما خواهد بود.
uses
{...}, Aurelius.Drivers.Interfaces, Aurelius.Drivers.dbExpress;
var
MyConnection: IDBConnection
begin
// SQLConnection1 is a dbExpress TSQLConnection component
// You can use several different data-access component libraries
MyConnection := TDBExpressConnectionAdapter.Create(SQLConnection1, false);
4- تعیین the SQL dialect
با اضافه کردن یونت های Aurelius.SQL.XXX (که در اینجا XXX نشان دهنده نام SQL Dialect خواهد بود) به Aurelius خواهیم گفت که چه SQL dialect هایی در برنامه استفاده خواهد شد. برای نمونه در مثال زیر به Aurelius خواهیم گفت که Dialect های MySQL و MSSQL Server در برنامه مورد استفاده خواهند بود. Aurelius با توجه به کانکشن تعریف شده در مرحله قبل، Dialect درست را انتخاب خواهد نمود.
uses
{...}, Aurelius.SQL.MySQL, Aurelius.SQL.MSSQL;
5- ساختن دیتابیس
با استفاده از DatabaseManager میتوان جداول و فیلدهای یک دیتابیس را ساخت. تنها کافیست دستور BuildDatabase را فراخوانی کنید!( درحال حاضر امکان ایجاد خودکار فایل دیتابیس توسط اورلیوس وجود نداشته و فایل مربوطه میبایست بصورت دتسی توسط کاربر ایجاد گردد!)
uses
{...}, Aurelius.Engine.DatabaseManager;
DBManager := TDatabaseManager.Create(MyConnection);
DBManager.BuildDatabase;
نکته : در صورتیکه جداول و فیلدهای آن درحال حاضر در دیتابیس وجود دارد، نیازی به انجام این مرحله نیست.
6- نمونه سازی از کلاس ها و ذخیره در دیتابیس
جهت ذخیره کلاس ها در دیتابیس، از ObjectManager استفاده خواهیم نمود. با نمونه سازی از یک کلاس و پاس دادن آن به ObjectManager، اطلاعات کلاس بصورت یک رکورد در دیتابیس ذخیره می گردد.
uses
{...}, Aurelius.Engine.ObjectManager;
Person := TPerson.Create;
Person.LastName := 'Lennon';
Person.FirstName := 'John';
Person.Email := 'lennon@beatles.com';
Manager := TObjectManager.Create(MyConnection);
try
Manager.Save(Person);
PersonId := Person.Id;
finally
Manager.Free;
end;
7- دریافت و یا بروزرسانی رکورد های جدول
فرآیند کار کاملا ساده و مشخص است. اطلاعات از دیتابیس توسط ObjectManager دریافت شده و در قالب کلاس در اختیار ما قرار میگیرد. پس از اعمال تغییرات مدنظر، مجدداً کلاس را به ObjectManager پاس داده تا مقادیر جدید در دیتابیس ذخیره گردد.
Manager := TObjectManager.Create(MyConnection);
Person := Manager.Find<TPerson>(PersonId);
Person.Email := 'john.lennon@beatles.org';
Manager.Flush;
Manager.Free;
8- جستجو در دیتابیس
اگر بخواهیم لیست تمام افرادی که ایمیل با دامنه "beatles.org" دارند را داشته باشیم، بصورت زیر عمل خواهیم کرد:
uses
{...}, Aurelius.Criteria.Base, Aurelius.Criteria.Linq;
Manager := TObjectManager.Create(MyConnection);
Results := Manager.Find<TPerson>
.Where(
TLinq.Like('Email', '%beatles.org%')
or TLinq.Like('Email', '%beatles.com%')
)
.List;
// Iterate through Results here, which is a TList<TPerson> list.
for person in Results do
// use person variable here, it's a TPerson object
Manager.Free;
در ادامه یک برنامه ساده ذخیره و بازیابی اطلاعات دفترچه تلفن را قدم به قدم اجرا خواهیم کرد.