运行环境: 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数据库访问服务的更多相关文章

  1. c#数据库访问服务(综合数据库操作)

    前面给大家说封装了常用的数据库,并且整理了使用.最近我再次把项目整合了.做成比较完善的服务. 还是重复的说下数据库操作封装. berkeley db数据库,Redis数据库,sqlite数据库. 每个 ...

  2. Atitit  基于meta的orm,提升加速数据库相关应用的开发

    Atitit  基于meta的orm,提升加速数据库相关应用的开发 1.1. Overview概论1 1.2. Function & Feature功能特性1 1.2.1. meta api2 ...

  3. 第7章 数据库访问与ORM 慕课网微信小程序开发学习笔记

    第7章 数据库访问与ORM https://coding.imooc.com/learn/list/97.html 目录: 7-1 数据库操作三种方式之原生SQL 19:09 7-2 从一个错误了解E ...

  4. [开源].NET数据库访问框架Chloe.ORM

    扯淡 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工 ...

  5. Code First开发系列之数据库迁移

    返回<8天掌握EF的Code First开发>总目录 本篇目录 开启并运行迁移 使用迁移API 应用迁移 给已存在的数据库添加迁移 EF的其他功能 本章小结 自我测试 本系列的源码本人已托 ...

  6. XData -–无需开发、基于配置的数据库RESTful服务,可作为移动App和ExtJS、WPF/Silverlight、Ajax等应用的服务端

    XData -–无需开发.基于配置的数据库RESTful服务,可作为移动App和ExtJS.WPF/Silverlight.Ajax等应用的服务端   源起一个App项目,Web服务器就一台,已经装了 ...

  7. db4o种纯对象数据库引擎

    db4o是一种纯对象数据库,相对于传统的关系数据库+ORM,db4o具有以下好处:1)以存对象的方式存取数据(废话--,不过你考虑一下完全以对象的方式去考虑数据的存取对传统的数据库设计思维来说是多么大 ...

  8. Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题

      (转载)Spring Boot + JPA(hibernate 5) 开发时,数据库表名大小写问题   这几天在用spring boot开发项目, 在开发的过程中遇到一个问题hibernate在执 ...

  9. c++::Mysql::ORM 开发环境搭建

    官网地址:https://www.codesynthesis.com/products/odb/ 环境搭建:ubuntu16.04-64 1.安装mysqlClient sudo apt-get in ...

随机推荐

  1. Linux下安装和使用nginx

    浏览器和服务器的关系 NGINX nginx是什么 nginx是一个开源的,支持高性能,高并发的www服务和代理服务软件. nginx不但是一个优秀的web服务软件,还可以作为反向代理,负载均衡,以及 ...

  2. Sigma Function (平方数与平方数*2的约数和是奇数)

    Sigma Function https://vjudge.net/contest/288520#problem/D Sigma function is an interesting function ...

  3. http://www.rabbitmq.com/documentation.html

    http://www.rabbitmq.com/documentation.html https://www.gitbook.com/book/geewu/rabbitmq-quick/details

  4. AtCoder Regular Contest 092 C - 2D Plane 2N Points(二分图匹配)

    Problem Statement On a two-dimensional plane, there are N red points and N blue points. The coordina ...

  5. 1.尽量以const ,enum,inline替换define

    1.#define为预处理阶段命令 原因:有可能记号名称没有进入记号表,而出现编译错误,即编译器并没看到过该定义. class专属常量const 一般定义为static,保证该常量至多有一份实体. 枚 ...

  6. python使用elasticsearch模块操作elasticsearch

    1.创建索引 命令如下 from elasticsearch import Elasticsearch es = Elasticsearch([{"host":"10.8 ...

  7. for all entries

    1.必须要判断for all entries in后面的内表是否为空,如果为空,where条件中与内表中字段进行比较的结果全部为真,会导致取出非常多的数据,影响系统性能.2.使用for all ent ...

  8. static 构造函数的认识

    最近,看到一道面试题,如下 class Class1 { ; static Class1() { count++; } public Class1() { count++; } } Class1 on ...

  9. Eclipse插件安装常见方法

    Eclipse插件的安装方法大体有以下几种: 第一种:直接复制法 假设Eclipse的安装目录在C:\eclipse,解压下载的eclipse 插件或者安装eclipse 插件到指定目录文件夹,打开安 ...

  10. EF语句拦截器-匹配当前的Controller,Action,User

    示例代码,ps:一切都能实现,关键是你尝试的方向,别把简单问题复杂化导致进入死胡同出不来. using Mobile360.Core.Interfaces; using Mobile360.Core. ...