使用EGL服务向导快速开发数据库访问服务

使用EGL服务向导快速开发数据库访问服务

简介

在本文中,我们将介绍如何使用EDT服务向导快速开发一个与后端数据库交互的EGL 服务。其他应用程序可以通过该EGL服务修改和查看数据库中的数据,例如创建,读取,更新和删除,也就是我们通常所讲的CRUD。

您也可以使用EDT库向导快速生成一个与后端数据库交互的EGL库,用于被Batch程序和其他库、服务调用,其操作与服务向导相差不大,本文中不再详细介绍。

根据数据库定义生成EGL服务

1. 在EDT中,选择EGLperspective,然后点击文件à新建à其他,在新建对话框中,选择EGLàService。 如下图所示:

使用EGL服务向导快速开发数据库访问服务

2. 输入希望创建的服务名称,该名称将会作为EGL服务类型名以及定义其的源文件名。然后输入包名称,向导将会在该包中创建子包,然后在子包中创建EGL服务类型,以及供该服务和其调用者使用的记录类型和公共函数库等,在下一节中我们将会详细介绍该包的结构。然后,在模板选择框中选择“Service from a database”,点击下一步。

使用EGL服务向导快速开发数据库访问服务

3. 如下图所示,选择EGL服务需要访问的数据库连接,然后选择一个或者多个需要进行CRUD操作的表。

除非数据库配置了默认的schema,否则必须选中复选框“Qualify table names withschema”,不然生成的EGL程序会由于无法发现数据库表而不能进行数据库操作。

若复选框“CreateSQL database binding in the development deployment descriptor”被选中,则向导将会在该EGL工程的部署描述文件中创建一个指向该数据库连接的SQL绑定。同时EGL服务中的Datasource的URI也会被设置为该绑定。如果已存在指向该数据库连接的SQL绑定,则重用现有绑定,不再创建新的绑定。若不选中该选项,您需要手动配置SQL绑定以保证对数据库的正确访问。

注意:

有关配置数据库连接的详细信息,请参见:Creatinga Database Connection Profile

使用EGL服务向导快速开发数据库访问服务


4. 预览将要生成的EGL源文件,然后点击“完成”。

使用EGL服务向导快速开发数据库访问服务


生成代码介绍

1.包结构

如上节所述,向导将会在EGL工程中创建两个包:

Ø<基包>.<数据库名>

向导将会在该包中创建EGL服务类型,同时,为该包配置Java生成器,用于生成可运行的Java代码。

Ø<基包>.<数据库名>.<common>

在该包中,向导将会生成用于服务调用和数据库访问的Record以及公共函数库。由于该包中的EGL类型不仅需要被EGL服务使用,而且有可能被RUI Handler调用,因此向导为该包同时配置了Java生成器和Javascript生成器

2.EGL服务代码

向导会为所有用户选择的表分别创建四类函数,分别以四个单词为前缀,用于CRUD操作:

Øadd: 用于添加一个或多个记录

Øget:用于查找一个或多个记录

Øupdate:用于更新一个或多个记录

Ødelete:用于删除一个或多个记录

Øexist:用于判断一条记录是否存在

ØisValid:用于判断一个EGL记录是否合法。

3.Records

对于用户选择的每一个数据库表,向导都会为其创建一下四个EGL记录:

Ø用于数据库操作的Entity记录

Ø用于同时返回一条记录和调用结果状态的记录

Ø用于同时返回多条记录和调用结果状态的记录

Ø用于搜索的SearchRecord

上述4个Record 类型会被定义在以该表名为文件名的源文件中。

例如,对于数据库表Customer,向导将会生成下面四个记录类型:

record Customer type Entity{@table{name = "EGL.CUSTOMER"}} customer_id int{@id}; first_name string?; last_name string?; password string?; phone string?; email_address string?; street string?; apartment string?; city string?; state string?; postalcode string?; directions string?; end record CustomerWithStatus status Status; data Customer?; end record CustomerListWithStatus status Status; data Customer?[]?; end record CustomerSearch customer_id int; first_name string?; last_name string?; password string?; phone string?; email_address string?; street string?; apartment string?; city string?; state string?; postalcode string?; directions string?; end

其中,向导在CustomerWithStatus和CustomerListWithStatus中定义了表示返回状态的Status子记录,该Status子记录包含以下三种信息:

ØSucceeded: 调用是否成功

ØCode:状态编码

ØMessage:自定义的成功失败信息

服务向导暂时不支持以下几种SQL数据类型,该类型的列将不会被转换为记录中的属性,同时警告信息将会在预览页面中给出。

Øblob

Øclob

Øgraphic

Øtime

Øvargraphic

Øbinary

4 。 ControlStructure

对于开发一个数据库应用,复杂条件的查询是必不可少的,例如多条记录的分页显示。在EGL源文件ControlStructures.egl中,向导定义了ListSpecification 记录,用于定义复杂条件查询时的控制结构。其属性定义如下:

ØselectClause(String) 用于指定select子句

ØfromTablesWhere (string) 用于指定 FROM, WHERE以及ORDER BY子句

ØblockingFactor (int) 用于指定每页的记录数目

Øposition (int) 当前页起始记录的位置

ØpageCount (int) 符合查询条件的结果集的总页数

ØrowCount (int) 符合查询条件的记录总数

使用示例

下面的代码将会添加一条新纪录,该记录的各个列的值为:

customer_id = 123 first_name = "Forest“ last_name = "Liebowitz function callAddCustomerService() cust CUSTOMER{customer_id = 123, first_name = "Forest", last_name = "Liebowitz"}; call DataAccessService.addCUSTOMERWithStatus(cust) using new HttpProxy returning to handleAddOperationRes onException handleException; end function handleAddOperationRes(retResult CUSTOMERWithStatus in) if(retResult.status.succeeded) syslib.writestderr("Succeeded"); else syslib.writestderr("Error"); end end

下面的代码将会搜索所有Frist_name为“Forest”的记录,并且每次调用最多返回10条记录,用于分页功能。

function searchByFirstName() listSpec ListSpecification{blockingFactor = 10, fromTablesWhere = "FROM EGL.CUSTOMER first_name='Forest'"}; call DataAccessService.getCUSTOMERListWithStatus(listSpec) using new HttpProxy returning to handleSearchRes onException handleException; end