快速业务通道

Java开发2.0: NoSQL - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
le.appengine.api.datastore.DatastoreServiceFactory   import com.google.appengine.api.datastore.Entity   abstract class Model {   def entity   static def datastore =  DatastoreServiceFactory.datastoreService   public Model(){   super()   }   public Model(params){   this.@entity = new Entity(this.getClass().simpleName)   params.each{ key, val ->    this.setProperty key, val   }   }   def getProperty(String name) {   if(name.equals("id")){    return entity.key.id   }else{    return entity."${name}"   }   }   void setProperty(String name, value) {   entity."${name}" = value   }   def save(){   this.entity.save()   }   }

注意抽象类如何定义一个构造函数,该函数接收属性的一个 Map —我总是可 以稍后添加更多构造函数,稍后我就会这么做。这个设置对于 Web 框架十分方便 ,这些框架通常采用从表单提交的参数。Gaelyk 和 Grails 将这样的参数巧妙地 封装到一个称为 params的对象中。这个构造函数迭代这个 Map并针对每个 “键 / 值” 对调用 setProperty方法。

检查一下 setProperty方法就会发现 “键” 设置为底层 entity的属性名称 ,而对应的 “值” 是该 entity的值。

Java开发2.0: NoSQL(4)

时间:2011-09-04 IBM Andrew Glover

Groovy 技巧

如前所述,Groovy 的动态特性允许我通过 get和 setProperty方法捕获对不 存在的属性的方法调用。这样,清单 2 中的 Model的子类不必定义它们自己的属 性 —它们只是将对一个属性的所有调用委托给这个底层 entity对象。

清单 2 中的代码执行了一些特定于 Groovy 的操作,值得一提。首先,可以 通过在一个属性前面附加一个 @来绕过该属性的访问器方法。我必须对构造函数 中的 entity对象引用执行上述操作,否则我将调用 setProperty方法。很明显, 在这个关头调用 setProperty将打破这种模式,因为 setProperty方法中的 entity变量将是 null。

其次,构造函数中的调用 this.getClass().simpleName将设置 entity的 “ 种类” — simpleName属性将生成一个不带包前缀的子类名称(注意, simpleName的确是对 getSimpleName的调用,但 Groovy 允许我不通过对应的 JavaBeans 式的方法调用来尝试访问一个属性)。

最后,如果对 id属性(即,对象的键)进行一个调用,getProperty方法很智 能,能够询问底层 key以获取它的 id。在 Google App Engine 中,entities的 key属性将自动生成。

Race 子类

定义 Race子类很简单,如清单 3 所示:

清单 3. 一个 Race 子类

package com.b50.nosql   class Race extends Model {   public Race(params){   super(params)   }   }

当一个子类使用一列参数(即一个包含多个 “键 / 值” 对的 Map)实例化 时,一个对应的 entity将在内存中创建。要持久存储它,只需调用 save方法。

清单 4. 创建一个 Race 实例并将其保存到 GAE 的数据存储

import com.b50.nosql.Runner   def iparams = [:]   def formatter = new SimpleDateFormat("MM/dd/yyyy")   def rdate = formatter.parse("04/17/2010")   iparams["name"] = "Charlottesville Marathon"   iparams["date"] = rdate   iparams["distance"] = 26.2 as double   def race = new Race(iparams)   race.save()

清单 4 是一个 Groovlet,其中,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号