kbmmw ORM 对象定义语法简析
使用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 对象定义语法简析的更多相关文章
- windows bat批处理语法简析
第一节先介绍windows批处理.这个起源于跟旁边同事学习在windows用命令行办公,渐渐地有些批处理功能就需要了,于是专门抽出了几天学习了一下.我认为文档最重要的功能是为了备忘,择取了很多文档的例 ...
- Java Annotation 及几个常用开源项目注解原理简析
PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...
- 简析 .NET Core 构成体系
简析 .NET Core 构成体系 Roslyn 编译器 RyuJIT 编译器 CoreCLR & CoreRT CoreFX(.NET Core Libraries) .NET Core 代 ...
- Php ORM 对象关系映射
ORM的全称是Object Relational Mapping,即对象关系映射.它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将 ...
- [转载] Thrift原理简析(JAVA)
转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...
- 简析 __init__、__new__、__call__ 方法
简析 __init__.__new__.__call__ 方法 任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使 用.垃圾回收,不同的 ...
- 0002 - Spring MVC 拦截器源码简析:拦截器加载与执行
1.概述 Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理.例如通过拦截器可以进行权限验证.记录请求信息的日 ...
- Unity5中新的Shader体系简析
一.Unity5中新的Shader体系简析 Unity5和之前的书写模式有了一定的改变.Unity5时代的Shader Reference官方文档也进一步地变得丰满. 主要需要了解到的是,在原来的Un ...
- Linux VFS机制简析(二)
Linux VFS机制简析(二) 接上一篇Linux VFS机制简析(一),本篇继续介绍有关Address space和address operations.file和file operations. ...
随机推荐
- PHP从规定字符中生成固定位数随即串
}
- http://ctf.bugku.com/challenges#%E6%B8%B8%E6%88%8F%E8%BF%87%E5%85%B3--游戏过关
做成功这道逆向题了,哈哈哈哈. 启程. 运行了一下子程序,发现它是要保证所有灯亮着才会给flag.如下图所示. 我聪明滴认为首先可以通过关键字符串找到关键代码位置哦. 1.找到关键代码 ...
- 牛客练习赛17 C 操作数(组合数+逆元)
给定长度为n的数组a,定义一次操作为: 1. 算出长度为n的数组s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007: 2. 执行a = s: 现在 ...
- PAT L3-001 凑零钱(01背包dp记录路径)
韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是 ...
- TZOJ 3663 最长路径(floyd)
描述 网络是由很多交换机与网线组成的,网络中的信息可能会在这些网络中不断转发,给定任意两个交换机,我们需要从中找到最快的路径进行转发,我们定义转发过程中所经过的网线条数为两个交换机之间的路径长度.如果 ...
- 【校招面试 之 C/C++】第33题 C++ 11新特性(四)之STL容器
C++ 11新增array.forward_list(单链表).unordered_set.unordered_map集中容器.
- 项目打包 TestFlight用法
TestFlight用法 包教包会(iOS APP官方测试工具) https://www.jianshu.com/p/4be185e4069c
- ABAP开发需要养成的习惯—处理规范,日期,sort,改结构
sELECT select之后不要急着处理,最多用下sort还有delete adjacent,不用sy-subrc判断之后loop操作,要注意处理逻辑. sort一个好处是为了后面read tabl ...
- java遍历当前会话所有Session
//方法一:通过遍历的方法进行遍历 String FileName=""; HttpSession session=request.getSession();//获取session ...
- idea中lombok安装
项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但 ...