zoukankan      html  css  js  c++  java
  • 使用 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;
  • 相关阅读:
    修复 Visual Studio Error “No exports were found that match the constraint”
    RabbitMQ Config
    Entity Framework Extended Library
    Navisworks API 简单二次开发 (自定义工具条)
    NavisWorks Api 简单使用与Gantt
    SQL SERVER 竖表变成横表
    SQL SERVER 多数据导入
    Devexpress GridControl.Export
    mongo DB for C#
    Devexress XPO xpPageSelector 使用
  • 原文地址:https://www.cnblogs.com/xalion/p/8459767.html
Copyright © 2011-2022 走看看