运行环境: 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. ucore-lab1-练习1report

    练习1 report 问题1:OS镜像文件ucore.img是如何一步一步生成的(需要比较详细地解释Makefile中的每一条相关命令和命令参数的含义,以及说明命令导致的结果)? GNU make是一 ...

  2. Shell教程 之echo命令

    1.显示普通字符串 这里的双引号完全可以省略,以下命令效果一致: echo "传递参数实例!" echo 传递参数实例! 2.显示转义字符 echo "\"传递 ...

  3. 约束布局 ConstraintLayout

    app:layout_constraintVertical_bias="0.5"app:layout_constraintHorizontal_bias="0.5&quo ...

  4. 非常棒的轨迹插件Better Trails v1.4.6

    点击下载

  5. stm32阅读代码工具source insight

    不知道学stm32有没有这样的烦恼,想看一个项目的代码,但是用keil又发现建立工程太麻烦,单个打开文件又找不到函数和变量之间的依赖关系,变量和函数又不能高亮显示,linux下vim和emacs虽然很 ...

  6. matlab基础绘图知识

    axis([xmin xmax ymin ymax])   %设置坐标轴的最小最大值 xlabel('string')                             %标记横坐标 ylabe ...

  7. 无法打开这些文件internet安全设置

    在安装别人传过来的软件的时候 出现这种情况 解决: 对这个程序,右键“属性”,可以看到属性窗口下方提示:此文件来自其它的电脑,可能不安全,后面有个按钮“解除锁定”

  8. cgi,fast-cgi,php-cgi,php-fpm转载详解

    转载自:https://segmentfault.com/q/1010000000256516 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编 ...

  9. 6-完美解决Error:SSL peer shut down incorrectly

    转载自: 完美解决Error:SSL peer shut down incorrectly 打开gradle文件夹下的gradle-wrapper文件 修改其中的配置文件将红色区域修改为http:// ...

  10. 如何查看Chrome浏览器保存的账号密码

    之前告诉大家如何一键查看所有保存在IE里的所有密码(点击查看原文),现在来告诉大家如何一键查看Chrome浏览器的所有密码.某种意义上上,查看Chrome的密码比查看IE的更简单,因为查看IE密码还需 ...