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的普通單元拿來即用就可以..
智能推薦
orm框架----Hibernate
文章目錄 Hibernate 定義: Hibernate中Java對象有哪些狀態? Hibernate的優缺點 搭建Hibernate環境 1、導入jar包 2、在src下創建映射配置文件:hibernate.cfg.xml 3、創建持久化類和映射文件 持久化類(實現ava.io.Serializable 接口) Dept.hbm.xml 單元測試 封裝HibernateUtil工具類:返回ses...
ORM框架 Dapper
一,介紹:Dapper是一款輕量級ORM工具。如果你在小的項目中,使用Entity Framework、NHibernate 來處理大數據訪問及關系映射,未免有點殺雞用牛刀。你又覺得ORM省時省力,這時Dapper 將是你不二的選擇。 ---ORM框架的核心思想是對象關系映射,ORM是將表與表之間的操作,映射成對象和對象之間的操作,就是通過操作實體類來達到操作表的目的。從數據庫提取的數據會自動...
MySQL——ORM框架
1、需要下載的包 2、創建與數據庫連接的引擎并生成Base(繼承Base的類,就可以當做數據庫中的一張表) 3、創建兩個類,分別代表數據庫中的兩張表 4、創建一個新建表的方法和刪除表的方法 5、調用creat_db()方法在數據庫中生成一張表 6、增、刪、改、查操作 7、SQL語言的其他操作 8、relationship的用法...
微型ORM框架----FluentData
FluentData簡單介紹和應用 一 介紹 官方介紹 A simple to use Micro ORM with a great fluent API that makes it simple to select, insert, update and delete data in a database. Supported databases: Microsoft SQL Server, M...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...