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

来源:互联网 发布:第三方非法软件是什么 编辑:程序博客网 时间:2024/05/14 09:56

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

简介

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

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

 

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

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


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

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



4. 预览将要生成的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?;endrecord CustomerWithStatus    status Status;    data Customer?;endrecord CustomerListWithStatus    status Status;    data Customer?[]?;endrecord 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 = 123first_name = "Forest“last_name = "Liebowitzfunction callAddCustomerService()        cust CUSTOMER{customer_id = 123, first_name = "Forest", last_name = "Liebowitz"};         call DataAccessService.addCUSTOMERWithStatus(cust) using new HttpProxy                returning to handleAddOperationRes onException handleException;endfunction handleAddOperationRes(retResult CUSTOMERWithStatus in)        if(retResult.status.succeeded)            syslib.writestderr("Succeeded");        else            syslib.writestderr("Error");        endend

下面的代码将会搜索所有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