使用EGL服务向导快速开发数据库访问服务
使用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?; 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