• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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的普通單元拿來即用就可以..

    版權聲明:本文為loloopop原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/loloopop/article/details/102593436

    智能推薦

    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...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    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_...

    精品国产乱码久久久久久蜜桃不卡