使用 kbmmw 的ORM開發純REST數據庫訪問服務


運行環境: WIN 10  X64

delphi 10.2.2

kbmmw 5.05.11

Firefox 58.0.2

今天使用最新的kbmmw 版本做一個基於ORM的純數據庫訪問的REST 服務器。

老規矩,先建一個工程,然后把對應的控件仍上去(控件黨),設置對應的一些屬性,

 

主窗體代碼非常簡單,就是建立ORM,開啟服務器

unit mainp;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, kbmMWServer,
  kbmMWCustomTransport, kbmMWCustomConnectionPool,
   kbmMWORM, // 為了支持 ORM, 此單元需要手工加入
  kbmMWCustomSQLMetaData, kbmMWSQLiteMetaData, kbmMWSQLRewriter, kbmMWSQLite,
  kbmMWFilePool, kbmMWHTTPSysServerTransport;

type
  TForm1 = class(TForm)
    kbmMWServer1: TkbmMWServer;
    Button1: TButton;
    kbmMWHTTPSysServerTransport1: TkbmMWHTTPSysServerTransport;
    kbmMWFilePool1: TkbmMWFilePool;
    kbmMWSQLiteConnectionPool1: TkbmMWSQLiteConnectionPool;
    kbmMWSQLiteSQLRewriter1: TkbmMWSQLiteSQLRewriter;
    kbmMWSQLiteMetaData1: TkbmMWSQLiteMetaData;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
    FxalionORM:TkbmMWORM;    // 定義ORM

  public
    { Public declarations }
     property xalionORM:TkbmMWORM read FxalionORM; // 方便其他單元使用
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 kbmmwserver1.Active:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
     fxalionORM:=TkbmMWORM.Create;        // 創建ORm
     fxalionORM.OpenDatabase(kbmMWSQLiteConnectionPool1); // 與數據庫綁定

    kbmmwserver1.AutoRegisterServices;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
     FxalionORM.CloseDatabase;   // 關閉數據庫
     FxalionORM.Free;   // 釋放
end;

end.

 

新建一個服務單元,定義對應的代碼

unit Unit2;

{$I kbmMW.inc}

interface

uses
  SysUtils,
  Classes,
  Generics.Collections,
  Vcl.Imaging.jpeg,
  Vcl.Graphics,
  DB,
  kbmMWNullable,
  kbmMWSecurity,
  kbmMWServer,
  kbmMWServiceUtils,
  kbmMWGlobal,
  kbmMWCustomHTTPSmartService,
  kbmMWRTTI,
  kbmMWObjectMarshal,
  kbmMWORM,
  kbmMWSmartServiceUtils;

type

  // ORM style access to the biolife table
  // We could have used traditional kbmMW query components
  // too if we wanted.
  [kbmMW_Table('name:animals')]           // 定義實體表
  TAnimals = class
  private
     Fname:kbmMWNullable<string>;
     Fsize:kbmMWNullable<integer>;
     Fweight:kbmMWNullable<integer>;
     Farea:kbmMWNullable<string>;
     Fbmp:kbmMWNullable<TkbmMWMemoryStream>;
  public

     [kbmMW_Field('name:"name"',ftString,10)]
     property name:kbmMWNullable<string> read Fname write Fname;


     [kbmMW_Field('name:"size"',ftInteger)]
     property size:kbmMWNullable<integer> read Fsize write Fsize;

     [kbmMW_Field('name:"weight"',ftFloat)]
     property weight:kbmMWNullable<integer> read Fweight write Fweight;

     [kbmMW_Field('name:"area"',ftMemo)]
     property area:kbmMWNullable<string> read Farea write Farea;

     [kbmMW_Field('name:"bmp"',ftGraphic)]
     [kbmMW_Element([mwefInline])]
     property bmp:kbmMWNullable<TkbmMWMemoryStream> read Fbmp write Fbmp;
  end;

  [kbmMW_VirtualTable(Tanimals,[mwomtProperty],[mwomvtPublic])]   // 這是基於上面實體表的虛表
  TAnimalsNoImage = class
  private
     Fname:kbmMWNullable<string>;
     Fsize:kbmMWNullable<integer>;
     Fweight:kbmMWNullable<integer>;
     Farea:kbmMWNullable<string>;
  public
     property name:kbmMWNullable<string> read Fname write Fname;



     property size:kbmMWNullable<integer> read Fsize write Fsize;


     property weight:kbmMWNullable<integer> read Fweight write Fweight;

     property area:kbmMWNullable<string> read Farea write Farea;


  end;

  [kbmMW_Service('name:animals')]
  [kbmMW_Rest('path:/animals')]
  TkbmMWCustomSmartService3 = class(TkbmMWCustomHTTPSmartService)
  private
     { Private declarations }
  protected
     { Protected declarations }
  public
     { Public declarations }
     [kbmMW_Rest('method:get, path:helloworld')]
     function HelloWorld:string;

     [kbmMW_Rest('method:get, path:all')]
     function Getall:TObjectList<TAnimalsNoImage>;

     [kbmMW_Rest('method:get, path:"name/{no}"')]
     function Getname([kbmMW_Rest('value:"{no}"')] const Aname:string):TAnimalsNoImage;

    [kbmMW_Rest('method:get, path:"image/{no}", responseMimeType:"image/jpeg"')]
     function GetImage([kbmMW_Rest('value:"{no}"')] const Aname:string):TkbmMWBytes;
  end;

implementation

uses
  kbmMWExceptions,

 mainp;

{$R *.dfm}


// Service definitions.
//---------------------

function TkbmMWCustomSmartService3.HelloWorld:string;
begin
     Result:='Hello world';
end;

function TkbmMWCustomSmartService3.Getall:TObjectList<TAnimalsNoImage>;
begin
     Result:=form1.xalionORM.QueryList<TAnimalsNoImage>;
end;

function TkbmMWCustomSmartService3.Getname(const Aname:string):TAnimalsNoImage;
begin
     Result:=form1.xalionORM.Query<TAnimalsNoImage>(['name'],[Aname]);
end;


function TkbmMWCustomSmartService3.GetImage(const Aname:string):TkbmMWBytes;
var
   bl:Tanimals;
   jpg:TJPEGImage;
   bmp:TBitmap;
   ms:TkbmMWMemoryStream;
begin
     Result:=nil;
     bl:=form1.xalionORM.Query<Tanimals>(['name'],[Aname]);
     if bl<>nil then
     begin
          try
             // Convert from ftGraphics format to JPG.
             // ftGraphics format includes 8 byte header that must be skipped to
             // get to the BMP data.
             jpg:=TJPEGImage.Create;
             try
                bmp:=Tbitmap.Create;
                try
                   bl.bmp.Value.Position:=8;
                   bmp.LoadFromStream(bl.bmp.Value);
                   jpg.Assign(bmp);
                   ms:=TkbmMWMemoryStream.Create;
                   try
                      jpg.SaveToStream(ms);
                      ms.Position:=0;
                      Result:=TkbmMWPlatformMarshal.Stream2Bytes(ms);
                   finally
                      ms.Free;
                   end;
                finally
                   bmp.Free;
                end;
             finally
                jpg.Free;
             end;
          finally
             bl.Free;
          end;
     end;
end;


initialization
  TkbmMWRTTI.EnableRTTI([TkbmMWCustomSmartService3,
                        Tanimals, TObjectList<Tanimals>,
                        TAnimalsNoImage, TObjectList<TAnimalsNoImage>]);
  kbmMWRegisterKnownClasses([Tanimals, TObjectList<Tanimals>,
                             TAnimalsNoImage, TObjectList<TAnimalsNoImage>]); 
end.

 

運行。

在瀏覽器里面輸入

http://localhost/animals/all

運行結果為

數據庫實際內容為:

 

 也可以根據name 單獨顯示一條數據

最后通過name 來顯示圖像

 

實在是太方便了。

2018年6月17日

5.6 里面也可以使用ON 方式操作

function TkbmMWCustomSmartService3.Getalljson: string;
var
   myon:TkbmMWONCustomObject;
  myjs: TkbmMWJSONStreamer;
begin
    myon:= form1.xalionORM.QueryON<TAnimalsNoImage>;
    myjs:=TkbmMWJSONStreamer.Create;
    try
     result:=myjs.SaveToUTF16String(myon);
    finally
      myjs.Free;
    end;

end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM