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的普通单元拿来即用就可以..

posted @ 2020-11-26 11:01  dqi1999  阅读(324)  评论(0)    收藏  举报