对 WebSphere sMash 中的数据库管理使用零资源模型

本文提供有关用于 IBM® WebSphere® sMash 平台上的数据库管理的零资源模型 (Zero Resource Model) 特性和功能的细节和见解。本文对敏捷数据库管理进行了概述,描述了 WebSphere sMash 内置的数据库操作和处理功能,并提供了可用作应用程序开发人员的起点的代码示例。 本文来自于 IBM WebSphere Developer Technical Journal 中文版

Arun Lobo, 软件开发人员, IBM

Arun Lobo 是一名软件开发人员,是 IBM 印度软件实验室的 Web 2.0 和移动功能包团队的一员。除了设备固件和服务器技术,他还在研究 Web 2.0 和 Java EE 技术。



2012 年 9 月 13 日

简介

数据库管理对于许多情景应用程序都是不可或缺的,IBM WebSphere sMash 平台就是针对此需求量身订造的。WebSphere sMash 始终为数据库提供良好的支持。您可以通过 JDBC 桥从外部连接数据库,也可以使用对嵌入式 Derby 数据库的内置支持。但为了使数据库管理更加轻松和简单,WebSphere sMash 使用了一种称为零资源模型的资源模型。本文将介绍零资源模型,提供一些示例来帮助您开始使用它。

尽管已经存在一些介绍性材料,本文仍然假设您对 IBM WebSphere sMash 平台和相关概念有一定的了解,以便将零资源模型视为现有数据库管理方式的一种多用途、敏捷的替代方案。


WebSphere sMash 中的数据库管理

IBM WebSphere sMash 是一个适用于快速构建敏捷的、基于 Web 的应用程序的开发和执行平台。总体而言,它是:

  • 一个构建和开发应用程序的平台。
  • 一个部署应用程序的目标服务器。
  • 一个运行时环境。

WebSphere sMash 在 Java™ 平台上运行。

WebSphere sMash 中的 Web 应用程序是使用以下两种脚本语言之一开发的:Groovy 或 PHP。Groovy 是一种专为 Java 平台设计的脚本语言。它在语法上类似于 Java 编程语言,但在语义上没那么严格,是该语言的一种更加随意的变体。WebSphere sMash 中的 Web 应用程序依据 REST 原则,通过实现一些 REST 方法来编写。PHP 是一种替代性的脚本语言,但出于本文的目的,这里给出的所有代码示例都使用 Groovy 编写(除非另有说明)。

默认情况下,WebSphere sMash 通过 JDBC 和其他著名的方法来提供对数据库的支持。此外,WebSphere sMash 还随带了一个嵌入式 Derby 数据库。您可以通过常见方式(比如 ODBC/JDBC 桥)连接此数据库,可以使用 SQL 查询执行事务。您也可以使用预定义的富 API 零资源模型。

零资源模型 (ZRM) 提供了一种简化的方式来使用数据存储创建 RESTful 资源处理函数(稍后将解释)。您仅需提供资源的简单 “模型” 定义;ZRM 会使用这些模型定义来创建数据存储,进而支持完整的创建/读取/更新/删除 (CRUD) 语义。此外,ZRM 还支持各种不同的内容格式,包括 JSON 和原子发布协议 (Atom Publishing Protocol)。

ZRM 使用了一种简单的 REST 模型,使您能够将精力集中在应用程序上,而不是集中在持久性细节上。ZRM 没有引入一般用途的对象关系映射 (ORM)。例如,ZRM 数据模型是通过断言基本的持久性假设而针对 REST 定制的,而不是一种随意的 POJO 模型。


将模式声明为 JSON

ZRM 中的模式声明称为资源模型声明并使用 JSON 在资源模型文件中执行。默认情况下,此文件名为 /app/models/<model-name>.json,看起来类似于清单 1。

清单 1
	// Resource Model declaration
	// File: /app/models/citizen.json
	{
	 	"fields" : {
	            		"name": {"type": "string", "max_length":40},
	           		 	"birth-date": {"type": "date"},
	            		"province": {"type": "string", "format":"region"},
	            		"phone-number": {"type": "string", "format":"phone"}
	}}

类似于无处不在的关系数据库管理系统 (RDBMS) 中的模式声明,资源模型声明包含字段、约束和过滤集合的定义,以及其他一些可选的配置。

如果您需要在数据库中填入初始数据,可以在一个 JSON 文件中声明数据。该文件应该位于文件夹 app/models/fixtures 中。一个示例如清单 2 所示。

清单 2
[
   	 {
       		 "type": "persons",
       		 "fields": {
           		 "id": 301
           		 "first_name": "Bill",
            		"age": 34,
            		"is_child": false
       	 	}
    	},
   	 {
        		"type": "addresses",
       		 "fields": {
            		"id": 38
            		"street": "100 Maple Ave",
            		"city": "Anytown",
            		"state": "NY"
       		 }
    	},
   	 {
        		"type": "persons",
       		 "fields": {
           		 "first_name": "Frank",
            		"age": 28,
           		 "is_child": true
       		 }
    	}
	]

ZRM 包含在模块 zero.resource 中。此模块需要在 /config/ivy.xml 文件中指定,如下所示:

<dependency name="zero.resource" org="zero" rev="[1.0.0.0, 2.0.0.0["/>

或者,如果使用 PHP:

<dependency name="zero.resource.php" org="zero" rev="[1.0.0.0, 2.0.0.0["/>

仅仅在 initial-data.json 文件中声明模式或填充条目,不会将数据加载到数据库中。数据库同步不可或缺。ZRM 使用简单的一行命令。同步数据(也就是创建和填充数据库)的命令为:

zero model sync

同步之后,数据就会持久化。对于测试用途,您可能需要重置数据库。这可使用以下命令完成:

zero model reset

请参见 参考资料 了解针对数据库访问和配置的类似命令。


配置和连接外部数据库

除了通过上述方式使用默认的嵌入式数据库,ZRM 还可以连接其他具有相同模型和数据访问方式的数据库。支持的数据库包括:

  • IBM DB2® V9.5(System z®、Linux®、UNIX®、Windows®)
  • Derby V10.3.2.1(网络和嵌入式)
  • MySQL 5
  • Oracle 10g

所有数据库配置都需要在熟悉的 zero.config 文件中指定。可使用 my-database 键(参见清单 3)。

清单 3
/config/db/my-database = {
    			"class" : "com.mysql.jdbc.jdbc2.optional.MysqlDataSource",
    			"serverName" : "myserver",
    			"portNumber" : 3306,
    			"databaseName" : "MY1STDB",
    			"user" : "root",
    			"password" : "mypassword"
		}

		/config/resource/dbKey = "my-database"

与嵌入式数据库一样,zero.resource 模块是通过 ivy.xml 文件包含在内的:

<dependency name="zero.resource" org="zero" rev="[1.0.0.0, 2.0.0.0["/>

或者,如果使用 PHP,则使用以下代码:

<dependency name="zero.resource.php" org="zero" rev="[1.0.0.0, 2.0.0.0["/>


模型 API

模型 API 以编程方式使用类似集合的结构来访问资源。除了基本的 CRUD 编程模型,ZRM 还引入了一种列表功能,称为 LCRUD 模型。该列表功能支持使用简单条件列出和过滤集合成员。模型 API 可用在资源处理函数中(groovy 或 PHP),分别使用方法 onList()、onCreate()、onRetrieve()、onUpdate() 和 onDelete() 执行 LCRUD 操作。您可以定义这些方法或使用以下命令调用默认实现:

ZRM.delegate()

此代码可包含在任何资源处理函数方法中,或者它可以是资源处理函数文件中的惟一代码。在后一种情况下,所有资源处理函数方法将采用默认实现。不同于 SQL 查询,模型 API 避免了嵌套和复杂的循环,很容易理解和使用。

示例数据库访问代码

在后面的几个代码段中,请注意使用了双下划线 “__”。

考虑 /app/models/persons.json 中的以下资源模型(模式)声明,如清单 4 所示。

清单 4
	{
    		"fields" : {
        		"firstname": {"type": "string", "max_length": 30},
        		"birthdate": {"type": "date"},
        		"ischild": {"type": "boolean"}
    		},

    		"collections" : {
        		"children": {"memberFilters": {"ischild": true}}
   		 }
	}

要使用模型 API,代码应该包含在资源处理函数 /app/resources/persons.groovy 文件中。该集合使用以下代码创建:

import zero.resource.TypeCollection
Type persons = TypeCollection.retrieve('persons');

示例查询处理代码

数据库查询遵循预定义的语义(参见清单 5)。

清单 5
	// retrieve the default collection for model 'persons'
	def collection = TypeCollection.retrieve('persons')

	// retrieve member from collection
	def id = joe.id
	joe = collection.retrieve(id)

	// list all collection results
	def all_people = collection.list()

	// using list() with conditions
	def some_people = collection.list(firstname: 'Joseph')
	people = collection.list(firstname__contains: 'se')
	people = collection.list(firstname__endswith: 'ph')

	// paged results from 11th to 20th items in the overall collection
	def paged_people = collection[10..19].list()

	// paged and filtered results
	def filtered_paged = collection.filter(firstname__endswith: 'ph')[201..300].list()

	// excluding results
	def excluded = collection.exclude(ischild: true).list()

	// get a map of members
	def map = collection.in([1, 3, 5])

Sample code for LCRUD

基本的列出、创建、检索、更新和删除操作可使用清单 6 中所示的代码来执行。

清单 6
#List all members
	List<Member> everybody = persons.list()
	everybody.each { person ->
    		println person.firstname
	}

	#List subset of members
	List<Member> somePersons = persons.list(firstname__startswith: 'Jo')
	somePersons.each { person ->
    		println person.birthdate
	}

	#Create a member
	Member person = persons.create(firstname:'Joe', birthdate:'1978-01-21', 
	ischild: true)

	#Retrieve a member
	Member person = persons.retrieve(1)

	#Update a member
	Member result = persons.update(id: '1', firstname:'Bob', birth_date:'1961-12-05')

	#Delete a member
	boolean result = persons.delete(1)

此外,模型 API 还包含其他许多用于过滤、排除、分页等的方法。请参见 参考资料 了解详细的描述。


对资源模型的基于 REST 的访问

前面已经提到,WebSphere sMash 通过资源处理函数来使用 REST 模型,该模型为每个 LCRUD 调用定义了一个方法。除了模型 API,还有一个 HTTP REST API,它通过一个 URI 对数据库进行基于 Web 的访问。

对于对数据库的基于 Web 的访问,可通过此 URI 读取一个集合:http://<server-name>:<server-port^gt;/resources/persons;例如:

http://localhost:8080/resources/persons

HTTP REST API 也可遵循模型 API 的语义(参见清单 7)。

清单 7
#Filtered collection where member instances' firstname field contains 'Jo'

http://localhost:8080/resources/persons?firstname__contains=Jo
		
#Filtered collection where member instances' firstname field contains
'Jo' and birthdate falls on the 25th of the any month.
http://localhsot:8080/resources/persons?firstname__contains=Jo&birthdate__day=25

LCRUD 可通过 HTTP 方法执行(参见清单 8)。

清单 8
#Create a member
		POST /resources/persons
		Content-Type: application/json
		{
   			"firstname": "Bill",
   			"birthdate": "1976-09-25"
		}
		#Retrieve a member
		GET resources/persons/1
		#Update a member
		PUT /resources/persons/1
		Content-Type: application/json
		{
   			"firstname": "Janie",
   			"birthdate": "1973-12-04"
		}
		#Delete a member
		DELETE /resources/persons/1

结束语

零资源模型是 WebSphere sMash 中一种简单且有效的数据库访问模型。它的富模型 API 可取代 SQL 查询,而 REST 模型提供了统一的 Web 访问。ZRM 为情景应用程序提供了一种易于使用、敏捷的数据库管理方法,通过其内置数据处理机制为您减轻了许多数据库处理职责。

参考资料

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, Web development
ArticleID=834730
ArticleTitle=对 WebSphere sMash 中的数据库管理使用零资源模型
publish-date=09132012