使用 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 ...
随机推荐
- cetnos 7 增加新的硬盘
fdisk -l 查看新的硬盘是否挂载 如没有挂载 ls /sys/class/scsi_host/ 查看设备列表 echo "- - - " > /sys/class/sc ...
- 第十章 优先级队列 (xa3)左式堆:插入与删除
- Wannafly挑战赛13 C:zzf的好矩阵(思维)
题目描述 一个8 * 8的棋盘,第一个格子放1个麦穗,第二个格子放2个麦穗,第三个格子放4个麦穗……那么最后,共要放几个麦穗呢? zzf表示这个问题实在太简单,于是重新规定了游戏的规则. 初始的棋盘为 ...
- [Java学习]面向对象-多态
多态 多态发生条件 发生在有继承关系的类型中. 向上转型(自动类型转换)与向下转型(强制类型转换) //向上转型 //编译阶段a1被编译器看作是Animal类型,所以a1引用绑定的是Animal类中的 ...
- cmd乱码问题
1.进入 cmd 窗口 2.字符编码切换回中文:chcp 936 MS-DOS为以下国家和语言提供字符集: 代码页描述 1258 越南语 1257 波罗的语 1256 阿拉伯语 1255 希 ...
- spring+quartz报错:Table 'XXXX.QRTZ_TRIGGERS' doesn't exist
Spring4.3.4 + quartz2.2.1配置到application.xml中 <properties> <spring.version>4.3.4.RELEASE& ...
- android显示通知栏Notification以及自定义Notification的View
遇到的最大的问题是监听不到用户清除通知栏的广播.所以是不能监听到的. 自定义通知栏的View,然后service运行时更改notification的信息. /** * Show a notificat ...
- SQL Server 数据库备份还原常用SQL语句及注意
1.备份数据库 backup database db_name to disk='d:\db_name.bak' with format --通过使用with format可以做到覆盖任何现有的备份和 ...
- 集合 day8
一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- c# 线程启动while(true) 死循环,里边的return导致线程退出情况,查错
写了一个线程 线程下启动了一个循环 while(true) { 里边有个判断 如果为空不操作, 有余这个线程是后加的,老程序里边因为有个return没关注,导致线程退出而不能不听的监控 } 线程启动一 ...