使用 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 服务器。
老规矩,先建一个工程,然后把对应的控件仍上去(控件党),设置对应的一些属性,
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222181946151-2095572303.png)
主窗体代码非常简单,就是建立ORM,开启服务器
新建一个服务单元,定义对应的代码
运行。
在浏览器里面输入
http://localhost/animals/all
运行结果为
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222203837299-538430292.png)
数据库实际内容为:
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222203931764-710950701.png)
也可以根据name 单独显示一条数据
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222204030709-268251962.png)
最后通过name 来显示图像
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222204302870-1719142754.png)
实在是太方便了。
delphi 10.2.2
kbmmw 5.05.11
Firefox 58.0.2
今天使用最新的kbmmw 版本做一个基于ORM的纯数据库访问的REST 服务器。
老规矩,先建一个工程,然后把对应的控件仍上去(控件党),设置对应的一些属性,
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222181946151-2095572303.png)
主窗体代码非常简单,就是建立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
运行结果为
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222203837299-538430292.png)
数据库实际内容为:
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222203931764-710950701.png)
也可以根据name 单独显示一条数据
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222204030709-268251962.png)
最后通过name 来显示图像
![](https://images2018.cnblogs.com/blog/365737/201802/365737-20180222204302870-1719142754.png)
实在是太方便了。
相关文章推荐
- 使用delphi 开发多层应用(二十一)使用XE5 RESTClient 直接访问kbmmw 数据库
- 使用EGL服务向导快速开发数据库访问服务
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【二】——使用Repository模式构建数据库访问层
- 为什么FleaPHP使用Table Data Gateway代替Active Record提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 关于使用Silverlight通过IP地址访问本地ArcGIS Server发布的Rest服务无法出图的问题
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 使用 sqlRest 将数据库转换为 REST 风格的 Web 服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
- Spring+Hibernate DAO 持久层开发, Spring 用 Hibernate 访问数据库的三种方法.推荐使用回调
- 为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务