Synopse mORMot框架样例学习01 In Memory ORM
Synopse MORMot框架是一个开源的客户端-服务器框架,目前没有看到汉化的文档说明,其实也可以理解,毕竟面对现在这个时代,还在坚持使用Delphi开发的估计也不是太多,更多开发框架和RAD工具让人眼花缭乱,我们甚至不用"知其然且知其所以然"就能开发出一个应用,出于对delhi的热爱,准备把这个框架撸一下.
按照作者的说明,该框架实现了客户端-服务器的SOA/ORM/MVC,可用于开发适应任何平台的应用,包括跨平台开发,而且框架的文档超过1800页,算是一个比较全面的参考资料,不知道是不是因为作者是法国人的原因,英文文档中个好多名词和说明搞得我晕头转向,于是就想先把源码中的例子学习一遍,然后再结合文档进行理解.
先说Synopse MORMot框架的第一个样例,01-In Memory ORM,从字面意思来看是内存ORM,那这个样例想说明什么呢?
样例文本中已经做了说明:
这个例子旨在展示框架中基本的ORM操作方式:
- 在Unit1.pas中定义了一个TSampleRecord类
- 一个静态服务器(即:内存数据库)被初始化(TSQLRestServerStatic.Create方法);
它以JSON文件的形式在磁盘上存储数据,并且不需要SQLite3数据库引擎
- Unit1.pas单元中的窗口设计意在想数据库中添加一条记录,时间字段按当前的日期和时间进行填充
- '查找之前信息'按钮展示了如何执行一个基本的查询
- 在程序退出时,Database.Destroy过程将会更新JSON文件
- 由于框架采用UTF-8编码,我们在用户接口中使用了一些快速转换操作;在实际应用中,您最好使用我们的SQLite3国际化单元和对应的TLanguageFile.StringToUTF8()以及TLanguageFile.UTF8ToString()方法
- 请注意exe的最小体积(在我们不使用SQLite3的时候),在使用LVCL的情况下一般不会超过80K
操作界面如下:


我们打开01例子下边的Project01.db文件看看是不是以JSON形式存储:

显而易见,事实就是如此,接下来需要学习一下具体的实现方法.
先看看SappleData单元
{ 该单元是一个独立的数据单元,可在客户端和服务端共享 } unit SampleData; interface uses SynCommons, mORMot; type { 声明一个包含数据的类,继承自TSQLRecord,属性为published 这些属性将用于ORM操作(和所有的SQL创建) 类名称的开头必须是'TSQL',后边可以是合适的表名称 } TSQLSampleRecord = class(TSQLRecord) private fQuestion: RawUTF8; fName: RawUTF8; fTime: TModTime; fLog: RawUTF8; { 自己添加一个成员试试 } published property Time: TModTime read fTime write fTime; property Name: RawUTF8 read fName write fName; property Question: RawUTF8 read fQuestion write fQuestion; property Log: RawUTF8 read fLog write fLog; end; { 一个简单的用来创建客户端-服务器数据库模型的函数 } function CreateSampleModel: TSQLModel; implementation function CreateSampleModel: TSQLModel; begin result := TSQLModel.Create([TSQLSampleRecord]); end; end.
注释基本上可以说明该数据单元的用意,接下来看看Unit1.pas单元
unit Unit1; interface uses { 跨平台设置 } {$ifdef MSWINDOWS} Windows, Messages, Graphics, {$endif} Classes, SysUtils, Forms, Controls, Dialogs, StdCtrls, SynCommons, SynTable, mORMot, SampleData; type { TForm1 } TForm1 = class(TForm) AddButton: TButton; Label1: TLabel; Label2: TLabel; QuitButton: TButton; FindButton: TButton; QuestionMemo: TMemo; NameEdit: TEdit; procedure AddButtonClick(Sender: TObject); procedure FindButtonClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure QuitButtonClick(Sender: TObject); private { private declarations } public { public declarations } Database: TSQLRest; Model: TSQLModel; end; var Form1: TForm1; implementation { 跨平台设置 } {$ifdef FPC} {$R *.lfm} {$else} {$R *.dfm} {$endif} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin Model := CreateSampleModel; // 调用SampleData单元的CreateSampleModel函数初始化 end; procedure TForm1.AddButtonClick(Sender: TObject); var Rec: TSQLSampleRecord; begin Rec := TSQLSampleRecord.Create; try // 这里直接使用StringToUTF8()进行如下转换 // 实际应用中应该使用mORMot国际化中的TLanguageFile.StringToUTF8()方法进行转换 Rec.Name := StringToUTF8(NameEdit.Text); Rec.Question := StringToUTF8(QuestionMemo.Text); Rec.Log := StringToUTF8('你添加了' + NameEdit.Text + ' ' + QuestionMemo.Text); { 自己测试一下添加的成员 } if Database.Add(Rec, true) = 0 then ShowMessage('数据添加成功') else begin NameEdit.Text := ''; QuestionMemo.Text := ''; NameEdit.SetFocus; end; { 添加完毕后,看看当前有几条记录 } ShowMessage('当前记录条数:'+IntToStr(Database.TableRowCount(TSQLSampleRecord))); finally Rec.Free; end; end; procedure TForm1.FindButtonClick(Sender: TObject); var Rec: TSQLSampleRecord; begin Rec := TSQLSampleRecord.Create(Database, 'Name=?', [StringToUTF8(NameEdit.Text)]); try if Rec.ID = 0 then QuestionMemo.Text := '无此数据' else QuestionMemo.Text := UTF8ToString(Rec.Question); finally Rec.Free; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin Database.Free; Model.Free; end; procedure TForm1.QuitButtonClick(Sender: TObject); begin Close; end; end.

使用TSQLRest操作很方便,简单的逻辑不用写那么长的SQL语句.总的来说,这个例子让我豁然开朗,对mORMot文档也不再有那么迷糊了,看来还是不能忽略简单的东西,任何一个框架也好,学问也好,都是从简单的一点一滴积累起来的,至少从这样一个简单的例子来看,框架的扩展性还是很强的,非常适合我这种非科班的编程爱好者学习,因为我不用懂太多专业性的东西,只需要把那些功能当成delphi的普通单元拿来即用就可以..

浙公网安备 33010602011771号