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;
  • 相关阅读:
    leetcode 673. 最长递增子序列的个数 java
    leetcode 148. 排序链表 java
    leetcode 98. 验证二叉搜索树 java
    leetcode 29. 两数相除 java
    leetcode 234. 回文链表 java
    Valid Palindrome LeetCode Java
    Single Number II LeetCode Java
    Single Number LeetCode java
    Search in Rotated Sorted Array II LeetCode Java
    Search in Rotated Sorted Array leetcode java
  • 原文地址:https://www.cnblogs.com/xalion/p/8459767.html
Copyright © 2011-2022 走看看