1. 程式人生 > >kbmmw ORM 對象定義語法簡析

kbmmw ORM 對象定義語法簡析

反向 number chm gen cat ascend rtu member which

使用kbmmw 的ORM 一定先要了解ORM 的對象定義語法。

下面簡單說一下

// kbmMW_Table - Define a table.  定義一個表
//   Must be used on classes.
//
//   Define a table named person.
//   [kbmMW_Table(‘name:person‘)] 定義表名
//
//   Define 2 ascending indexes i_fieldname, and i_anotherfieldname on the field fieldname and anotherfieldname. 定義正向索引
// [kbmMW_Table(‘name:person, index:fieldname, index:anotherfieldname... // // Define an ascending index named i1, on the field name 使用索引名為一個字段定義索引 // [kbmMW_Table(‘name:person, index:{name:i1,field:name},... // // Define a descending index named i1, on the field name 定義反向索引 // [kbmMW_Table(‘name:person, index:{name:i1,field:name,descending:true},...
// // Define a compound unique index named i2, on the fields name and age. Name field part is descending. 定義組合唯一索引 // [kbmMW_Table(‘name:person, index:{name:i2,unique:true,fields:[{name:name,descending:true},{name:age}] // // Define method to use when deleting records from a table. Default it will do a regular delete, 定義刪除標誌,是常規刪除還是標誌刪除
// but it can be set to flag the record as deleted (which is then automatically respected by // queries later on) or it can be set to backup the record before deletion, to another table. // [kbmMW_Table(‘name:person, defaultDeleteMethod:delete‘)] 也可以定義為移動到另外一個表裏面 // defaultDeleteMethod can be delete/default, mark or move. // If its mark, then deleteMarkProperty must be set to point to a property or field member of the // class that should mark the deletion state. Futher deleteMarkValue must be set to the (non null) // value indicating a deleted record. // If its move, then deleteMoveToTable must be set to the fully scoped name of another defined // table, which will hold the backups. Make sure to define the table with similarly named field names. // Also add a different main identifier property as primary key. // // // kbmMW_Field - Define fields in a table. 定義表中的字段 // Must be used on properties within a class if they are to be persisted. // // Define a field that will be persisted. Its type will be decided for // from the property type. String type fields will have a size of 50. // Table field name will be the same as the property name. // [kbmMW_Field] 字段標識 // // Define a field that will be persisted. It will accept unicode data of max 50 characters. // It will have the same name as the property. // [kbmMW_Field(ftWideString,50)] 長度為50的字符類型 // // Define a field named id, and make it primary key. It will be automatically populated bu the generator shortGuid. // [kbmMW_Field(‘name:id, primary:true, generator:shortGuid‘,ftString,40)] 定義字段名稱、類型、長度,自動生成屬性 // property ID:kbmMWNullable<string> read FID write FID; // 四種自動生成類型 // These generators exists: // GUID - Returns a GUID formatted as a regular GUID {123e4567-e89b-12d3-a456-426655440000} // SHORTGUID - Returns a short GUID where braces and dashes are missing: 123e4567e89b12d3a456426655440000 // SEQUENCE - Returns next unique number from a sequence. Provide name of sequencer in sequence property // and optional sequencestart property (not supported by all databases!) // DATETIME - Returns a date time value, formatted according to the dateFormat property.

// // Define a field named id, and make it primary key. It will be populated by a sequence generator. // Since no sequencer was given, one is automatically generated named s_tablename_fieldname // [kbmMW_Field(‘name:id, primary:true, generator:sequence‘,ftInteger)] 定義字段為主鍵,並自動用序列生成 // property ID:kbmMWNullable<integer> read FID write FID; // // Define a field named id, and make it primary key. It will be populated by sequence generator SEQ, starting from value 10. // (not all databases supports sequencers with a defined start!) 從10開始,定義序列 // [kbmMW_Field(‘name:id, primary:true, generator:sequence, seqneuce:SEQ1, sequenceStart:10‘,ftInteger)] // property ID:kbmMWNullable<integer> read FID write FID; 屬性定義,與字段名相同 // // Define a field named id, and make it primary key. It will be populated automatically by the database. // (not all databases support auto increment type fields!) // [kbmMW_Field(‘name:id, primary:true‘,ftAutoInc)] 定位為自增長 // property ID:kbmMWNullable<integer> read FID write FID; // // Define a field named datetime containing date/time values as Delphi local time values. // [kbmMW_Field(‘name:datetime‘,ftDateTime)] 定義為日期字段 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Delphi UTC values. // [kbmMW_Field(‘name:datetime, dateFormat:UTC‘,ftDateTime)] 使用UTC 日期 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Unix local time millisecs since EPOC. // [kbmMW_Field(‘name:datetime, dateFormat:LOCALSINCEEPOCHMS‘,ftInt64)] 使用unix 當地日期,毫秒計時 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Unix UTC time millisecs since EPOC. // [kbmMW_Field(‘name:datetime, dateFormat:UTCSINCEEPOCHMS‘,ftInt64)]使用unix UTC日期,毫秒計時 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Unix local time secs since EPOC. // [kbmMW_Field(‘name:datetime, dateFormat:LOCALSINCEEPOCH‘,ftInt64)]使用unix 當地日期,秒計時 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as Unix UTC time secs since EPOC. // [kbmMW_Field(‘name:datetime, dateFormat:UTCSINCEEPOCH‘,ftInt64)]使用unix TUC日期,秒計時 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as ISO8601 formatted string. // [kbmMW_Field(‘name:datetime, dateFormat:ISO8601‘,ftString,50)] ISO08601 日期 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as RFC1123 formatted string. // [kbmMW_Field(‘name:datetime, dateFormat:RFC1123‘,ftString,50)] RFC1123 日期 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // Define a field named datetime containing date/time values as NCSA formatted string. // [kbmMW_Field(‘name:datetime, dateFormat:NCSA‘,ftString,50)] NCSA 日期 // property DateTime:TkbmMWDateTime read FDateTime write FDateTime; // // kbmMW_Null - Specify NULL conversion. // (This attribute is also used for object marshalling). // // If, for example, a property is of type integer, the property is not directly able to indicate a NULL state since // all values of an integer are considered non NULL values. // However its possible to define a specific value to be interpreted as NULL. // Eg. // [kbmMW_Field(‘name:somefield‘,ftInteger)] // [kbmMW_Null(-1)] 定義-1 為空 // property MyProperty:integer read FMyProperty write FMyProperty; // // This will define that the value -1 must be interpreted as NULL when storing and retrieving data // from the database. // // kbmMW_NotNull - Indicate that the property must never contain the NULL value (either interpreted via the kbmMW_Null attribute or actual). // Eg. // [kbmMW_Field(‘name:somefield‘,ftInteger)] 字段不準為空 // [kbmMW_NotNull] // property MyProperty:kbmMWNullable<integer> read FMyProperty write FMyProperty;
以下為實際的定義,請大家認真理解

[kbmMW_Table(name:person, index:{name:i1,field:name,descending:false}, index:{name:i2,unique:true,fields:[{name:name,descending:true},{name:age}])] TPerson = class private FID:kbmMWNullable<string>; FName:kbmMWNullable<string>; FAddress:kbmMWNullable<string>; FAge:kbmMWNullable<integer>; public [kbmMW_Field(name:id, primary:true, generator:shortGuid,ftString,40)] property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field(name:name,ftWideString,50)] property FullName:kbmMWNullable<string> read FName write FName; [kbmMW_Field(name:address,ftWideString,50)] property Address:kbmMWNullable<string> read FAddress write FAddress; [kbmMW_Field(name:age,ftInteger)] property Age:kbmMWNullable<integer> read FAge write FAge; end; [kbmMW_Table(name:account)] TAccount = class private FID:kbmMWNullable<string>; FPersonID:string; FName:kbmMWNullable<string>; FValue:double; public [kbmMW_Field(name:id, primary:true, generator:shortGuid,ftString,40)] [kbmMW_NotNull] property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field(name:personid,ftString,40)] [kbmMW_NotNull] [kbmMW_Null(‘‘)] property PID:string read FPersonID write FPersonID; [kbmMW_Field(name:name, default:"Unknown",ftString,30)] [kbmMW_NotNull] property Name:kbmMWNullable<string> read FName write FName; [kbmMW_Field] [kbmMW_Null(Math.NaN)] property Value:double read FValue write FValue; end; [kbmMW_VirtualTable(TAccount)] TAccountWithPerson = class(TAccount) private FPerson:TPerson; public destructor Destroy; override; [kbmMW_VirtualField(name:person, source:uData.TPerson, key:PID, sourceKey:ID)] property Person:TPerson read FPerson write FPerson; end; [kbmMW_VirtualTable(TAccount)] TAccountWithPersonName = class(TAccount) private FFullName:kbmMWNullable<string>; public // [kbmMW_VirtualField(‘name:fullName, source:uData.TPerson, key:PID, sourceKey:ID, value:uData.TPerson.FullName‘)] [kbmMW_VirtualField(name:fullName, source:uData.TPerson, key:PID, sourceKey:ID, value:"uData.TPerson.FullName||\" Age:\"||uData.TPerson.Age")] property FullName:kbmMWNullable<string> read FFullName write FFullName; end; [kbmMW_VirtualTable(TPerson)] TPersonWithAccounts = class(TPerson) private FAccounts:TObjectList<TAccount>; public destructor Destroy; override; [kbmMW_VirtualField(name:accounts, source:uData.TAccount, key:ID, sourceKey:PID)] property Accounts:TObjectList<TAccount> read FAccounts write FAccounts; end; // [kbmMW_Table(‘name:image, defaultDeleteMethod:mark, deleteMarkProperty:Deleted, deleteMarkValue:true‘)] [kbmMW_Table(name:image, defaultDeleteMethod:move, deleteMoveToTable:uData.TBackupImage)] TImage = class private FID:kbmMWNullable<string>; FDescription:kbmMWNullable<string>; FPersonID:string; FBlob:TMemoryStream; FDeleted:boolean; protected procedure SetBlob(AValue:TMemoryStream); virtual; public constructor Create; virtual; destructor Destroy; override; [kbmMW_Field(name:id, primary:true, generator:shortGuid,ftString,40)] [kbmMW_NotNull] property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field(name:personid,ftString,40)] [kbmMW_NotNull] [kbmMW_Null(‘‘)] property PID:string read FPersonID write FPersonID; [kbmMW_Field(name:description,ftString,30)] property Description:kbmMWNullable<string> read FDescription write FDescription; [kbmMW_Field(name:blob,ftGraphic)] [kbmMW_NotNull] property Blob:TMemoryStream read FBlob write SetBlob; [kbmMW_Field(name:deleted,ftBoolean)] [kbmMW_NotNull] property Deleted:boolean read FDeleted write FDeleted; end; [kbmMW_Table(name:backupImage)] TBackupImage=class(TImage) private FBackupID:kbmMWNullable<string>; public // [kbmMW_Field(‘name:backupId, primary:true, generator:shortGuid‘,ftString,40)] // [kbmMW_NotNull] // property BackupID:kbmMWNullable<string> read FBackupID write FBackupID; // [kbmMW_Field(name:id, primary:true,ftString,40)] [kbmMW_NotNull] property ID:kbmMWNullable<string> read FID write FID; end; [kbmMW_VirtualTable] TPersonAccount = class private FID:string; FName,FAccountName:kbmMWNullable<string>; FValue:double; public [kbmMW_Field(name:id)] property ID:string read FID write FID; [kbmMW_Field(name:name)] property Name:kbmMWNullable<string> read FName write FName; [kbmMW_Field(name:accountName)] property AccountName:kbmMWNullable<string> read FAccountName write FAccountName; [kbmMW_Field(name:value)] property Value:double read FValue write FValue; end; [kbmMW_Table(name:person2)] TPerson2 = class private FID:kbmMWNullable<string>; FName:kbmMWNullable<string>; FAddress:kbmMWNullable<string>; FAge:kbmMWNullable<integer>; FAccounts:TObjectList<TAccount>; public constructor Create; virtual; destructor Destroy; override; [kbmMW_Field(name:id, primary:true, generator:shortGuid,ftString,40)] property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field(name:name,ftWideString,50)] property Name:kbmMWNullable<string> read FName write FName; [kbmMW_Field(name:address,ftWideString,50)] property Address:kbmMWNullable<string> read FAddress write FAddress; [kbmMW_Field(name:age,ftInteger)] property Age:kbmMWNullable<integer> read FAge write FAge; [kbmMW_Field(join:{source:ID,dest:PersonID})] property Accounts:TObjectList<TAccount> read FAccounts; end;


東西真多,什麽時候可以可視化設計就好了。

kbmmw ORM 對象定義語法簡析