您的位置:首页 > 数据库

使用 kbmmw 的ORM开发纯REST数据库访问服务

2018-02-22 20:46 549 查看
运行环境: 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 来显示图像



实在是太方便了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐