使用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,)]
property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field('name:name',ftWideString,)]
property FullName:kbmMWNullable<string> read FName write FName; [kbmMW_Field('name:address',ftWideString,)]
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,)]
[kbmMW_NotNull]
property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field('name:personid',ftString,)]
[kbmMW_NotNull]
[kbmMW_Null('')]
property PID:string read FPersonID write FPersonID; [kbmMW_Field('name:name, default:"Unknown"',ftString,)]
[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,)]
[kbmMW_NotNull]
property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field('name:personid',ftString,)]
[kbmMW_NotNull]
[kbmMW_Null('')]
property PID:string read FPersonID write FPersonID; [kbmMW_Field('name:description',ftString,)]
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,)]
[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,)]
property ID:kbmMWNullable<string> read FID write FID; [kbmMW_Field('name:name',ftWideString,)]
property Name:kbmMWNullable<string> read FName write FName; [kbmMW_Field('name:address',ftWideString,)]
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 对象定义语法简析的更多相关文章

  1. windows bat批处理语法简析

    第一节先介绍windows批处理.这个起源于跟旁边同事学习在windows用命令行办公,渐渐地有些批处理功能就需要了,于是专门抽出了几天学习了一下.我认为文档最重要的功能是为了备忘,择取了很多文档的例 ...

  2. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  3. 简析 .NET Core 构成体系

    简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...

  4. Php ORM 对象关系映射

    ORM的全称是Object Relational Mapping,即对象关系映射.它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将 ...

  5. [转载] Thrift原理简析(JAVA)

    转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...

  6. 简析 __init__、__new__、__call__ 方法

    简析 __init__.__new__.__call__ 方法 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使 用.垃圾回收,不同的 ...

  7. 0002 - Spring MVC 拦截器源码简析:拦截器加载与执行

    1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日 ...

  8. Unity5中新的Shader体系简析

    一.Unity5中新的Shader体系简析 Unity5和之前的书写模式有了一定的改变.Unity5时代的Shader Reference官方文档也进一步地变得丰满. 主要需要了解到的是,在原来的Un ...

  9. Linux VFS机制简析(二)

    Linux VFS机制简析(二) 接上一篇Linux VFS机制简析(一),本篇继续介绍有关Address space和address operations.file和file operations. ...

随机推荐

  1. Centos7 下的NTP-server(Chorny) 部署及客户端时间同步配置

    一.介绍 1.本博客以 ceph 集群搭建时的NTP-server 为例. 2.hosts # vim /etc/hosts 10.6.32.20    ceph1     (作为时间服务器) 10. ...

  2. Java字符串String详解

    1.String字符串 实例化String对象: (1)直接赋值,如:String str="hello"; (2)使用关键字 new,如:String str=new Strin ...

  3. 【转】 mysql 数据优化

    数据库优化离不开索引,如何理解索引? ---------------------------------------------------------------------------- 可以参考 ...

  4. HDU-1004.Let the ballon Rise(STL-map)

    2019-02-28-08:56:03 初次做本题是用字符串硬钢,最近校队训练时又遇到才知道用map是真的舒服.需要注意的是map的用法. clear : 清除map中的所有元素,map.clear( ...

  5. TZOJ 3295 括号序列(区间DP)

    描述 给定一串字符串,只由 “[”.“]” .“(”.“)”四个字符构成.现在让你尽量少的添加括号,得到一个规则的序列. 例如:“()”.“[]”.“(())”.“([])”.“()[]”.“()[( ...

  6. Mac 动态库加载不上

    OC xcode can't found xxx.dylib 1 targer- build phase :link binary with library添加动态库 注意不要将后边的选项选成opti ...

  7. 解决在Mac的Vmware Fusion中装win7系统和mac原生系统直接切换win7系统分辨率变化的问题

    虚拟机 - 设置 - 显示屏 - 全屏显示retina (此选项钩去掉)

  8. bbs项目中的零碎点记录

    一.切换django的语言 在settings中修改django默认的语言 # LANGUAGE_CODE = 'en-us' # 切换django的语言,默认是英语的,我们把他修改为中文 LANGU ...

  9. swift - 封装百度地图

    1. #import <BaiduMapAPI_Base/BMKBaseComponent.h>//引入base相关所有的头文件 #import <BaiduMapAPI_Map/B ...

  10. 可变数据类型&不可变数据类型

    不同的变量在内存中有不同的存储空间,每个存储空间都有一个ID >>> a = 32 >>> id(a) # 查看ID 1571185856 >>> ...