使用 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,)]
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:=;
bmp.LoadFromStream(bl.bmp.Value);
jpg.Assign(bmp);
ms:=TkbmMWMemoryStream.Create;
try
jpg.SaveToStream(ms);
ms.Position:=;
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;
使用 kbmmw 的ORM开发纯REST数据库访问服务的更多相关文章
- c#数据库访问服务(综合数据库操作)
前面给大家说封装了常用的数据库,并且整理了使用.最近我再次把项目整合了.做成比较完善的服务. 还是重复的说下数据库操作封装. berkeley db数据库,Redis数据库,sqlite数据库. 每个 ...
- Atitit 基于meta的orm,提升加速数据库相关应用的开发
Atitit 基于meta的orm,提升加速数据库相关应用的开发 1.1. Overview概论1 1.2. Function & Feature功能特性1 1.2.1. meta api2 ...
- 第7章 数据库访问与ORM 慕课网微信小程序开发学习笔记
第7章 数据库访问与ORM https://coding.imooc.com/learn/list/97.html 目录: 7-1 数据库操作三种方式之原生SQL 19:09 7-2 从一个错误了解E ...
- [开源].NET数据库访问框架Chloe.ORM
扯淡 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工 ...
- Code First开发系列之数据库迁移
返回<8天掌握EF的Code First开发>总目录 本篇目录 开启并运行迁移 使用迁移API 应用迁移 给已存在的数据库添加迁移 EF的其他功能 本章小结 自我测试 本系列的源码本人已托 ...
- XData -–无需开发、基于配置的数据库RESTful服务,可作为移动App和ExtJS、WPF/Silverlight、Ajax等应用的服务端
XData -–无需开发.基于配置的数据库RESTful服务,可作为移动App和ExtJS.WPF/Silverlight.Ajax等应用的服务端 源起一个App项目,Web服务器就一台,已经装了 ...
- db4o种纯对象数据库引擎
db4o是一种纯对象数据库,相对于传统的关系数据库+ORM,db4o具有以下好处:1)以存对象的方式存取数据(废话--,不过你考虑一下完全以对象的方式去考虑数据的存取对传统的数据库设计思维来说是多么大 ...
- Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题
(转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题 这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...
- c++::Mysql::ORM 开发环境搭建
官网地址:https://www.codesynthesis.com/products/odb/ 环境搭建:ubuntu16.04-64 1.安装mysqlClient sudo apt-get in ...
随机推荐
- OpenVPN 2.2.1 之后期维护
一.Openvpn 用户注销 每个公司都会用员工离职,因此注销vpn用户也就成了运维人员日常工作的一部分. 其实Openvpn在设计的时候也想到了这点,我们可以使用 revoke-full shell ...
- 江西财经大学第一届程序设计竞赛 F题 解方程
链接:https://www.nowcoder.com/acm/contest/115/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 安装python3 及virtual与virtualenvwrapper
安装python3 下载python源码包 网址:https://www.python.org/downloads/release/python-362/ 下载地址:https://www.pytho ...
- 一个先进的App框架:使用Ionic创建一个简单的APP
原文 http://www.w3cplus.com/mobile/building-simple-app-using-ionic-advanced-html5-mobile-app-framewor ...
- bbs项目引入富文本编辑器和处理xss攻击和文章预览
一.富文本编辑上传文章和图片 富文本编辑器我们使用kindeditor,我们首先去官网下载,然后解压,放到我们的static的目录中 然后我们在html中这样使用富文本编辑器 <!DOCTYPE ...
- eclipse配置mybatis xml文件自动提示(转)
原文链接 原文如下: 如果使用eclipse中,再写mybatis的xml文件的时候,没有提示,用“Alt+/”,不能把代码用快捷键敲出来,可以试试下面要说的这种方法,反正我试了,我这个可以. 1.下 ...
- load balancer does not have available server for client: provider
Ask Question up vote6down votefavorite 4 I'm trying to use Feign client. Below is my feing client: i ...
- [leetcode]101. Symmetric Tree对称树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- Mysql的随机抽取
方法一 SELECT * FROM SHARE ORDER BY RAND( ) LIMIT 1; 在MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用R ...
- linux命令学习之:cd
cd命令用来切换工作目录至dirname. 其中dirName表示法可为绝对路径或相对路径.若目录名称省略,则变换至使用者的home directory(也就是刚login时所在的目录).另外,~也表 ...