本文将介绍如何使用Sun公司的最新《Java Data Objects 》规范来进行基于数据库的简单应用程序的开发,从而使读者对JDO有一个直接的感性的认识,为更深入的开发作铺垫,同时也希望抛砖引玉,让更多的富有经验的高手也参与到推广JDO的进程中来,为读者提供更多更精彩的文章!
1. JDO是何方神圣,难道是ADO的翻版?
本节对稍熟悉JDO一点的读者来说,可能算是老生常谈,一堆垃圾,不如回收掉算了。不过我却认为这些是实话实说,有感而发,不吐不快,对新手可能也有一定的帮助,至少应该有一点共鸣吧。所以,老手请直接跳过本节。
1.1. Java的优点
自从Java语言面世以来,它那几乎完全面向对象的特性和解放我们程序员的自动垃圾回收机制给我们展现了一个全新的开发天地:原来程序还可以这样写!我用过几年C++,里面的指针简直折寿!我还记得有些功能里面不得不使用类似“***lpszInfoMapOfMap”之类的变量,它是指针的指针的指针,要在编码过程中准确地把握这一点已属不易,何况还要记得释放每一处占用的内存,并且还不能释放多次(严格地说,应该是将自己申请的内存进行且只进行一次释放)!我至今都还很佩服当年清晰的头脑,然而在调试过程层出不穷的“AccessViolation”和“NullPointer”错误竟使我一夜白头!(有一次熬夜调试一个问题,第二天憔悴了很多。)C++之后,我也用过三年以上的Delphi,程序代码好理解、易维护了很多,不过指针仍是胸中永远的痛!直到Java,才使我脱离苦海,进入“按思维的速度进行开发”的时代……
当Java的速度得到很大改善后,我们开始用它来写数据库应用,但说实话,Java的数据库方面还很原始,图形界面编程中的数据库组件很不好用,再加上主要写的是Web应用,只有JDBC接口可供选择。提起JDBC,我相信很多读者都会有这样的印象:概念太多,严密但麻烦,尤其是资源的释放也是一大问题。比起微软的ADO来,简直是一团乱麻,容错性尤其差劲。
1.2. 对象包装技术,百家争鸣?群魔乱舞?
于是,从规范化开发的原则出发,我们开始写自己的JavaBean来包装数据对象,使数据对象化,避免太多的地方涉及JDBC操作。但一些问题也随之而来:灵活性不够,接口死板,性能低下,这使我一阵苦恼。于是,“君子性非异也,善假于物也”,咱也上网去找点“技术支持”!很快,竟然被我发现了“Castor JDO”,一个专用于数据包装的撞阕榧???峁┝讼DMG标准的OQL作为查询语言,方便且容易理解,比SQL好多了。这让我享受了一段时间的“面向对象的数据库开发”的好处,一句话,“效果不错,还实惠!”。
然而,好景不长,Castor一些内在的BUG影响了稳定性,而这个免费产品的更新又太慢,一直未能解决。只好放弃。“执手相看泪眼,竟无语凝噎”!怎么办?要知道,由俭入奢易,由奢入俭难,吃过肉的人,怎能忍受只能吃菜的生活!象《甲方乙方》里面那个一心想吃素的大款还是不多见的。对我们来说,再使用JDBC原始调用似乎难以下咽,再用JavaBean包装又有点返古,于是我又开始了网上的搜寻历程。余秋雨先生有《文化苦旅》,咱这也算是《编程苦旅》了,呵呵,苦笑。
从网上的资料来看,我的这些经历也是很多Java开发同仁的共同经历,无论是国内还是国外,不过从实际情况来看,国外的研究更深入更广泛一些,至少从网上所能找到的资料来说是这样。美国从八十年代起就开始研究面向对象的数据库ODBMS,目前已有一些成形的产品,比如Versant公司的Versant数据库,FastObjects公司的FastObjects t7数据库,以及其它一些相对市场份额小一些的诸如ObjectStore等公司的产品,当然,也不乏一些免费的产品,如Orient等等。总的来说,ODBMS尽管拥有面向对象的优点,但由于历史原因,在与关系数据库RDBMS的竞争中始终处于下风,基于RDBMS的应用还是占绝大多数,因此,出现了Object-Relational映射的一些工具,前面提到的Castor就是近年来出现的一个工具,实际上更早的时候,已经有一些成熟、稳定的商业化产品出现,比如前一阵被Oracle收购的TopLink,被BEA收购的WebGain等等,比较有名气的CocoBase等等。
象TopLink这样的产品我也了解了一下,功能确实强大,性能、稳定性都有优势,然而,其同样强大的价格和古怪的API令我却步。我很担心被锁定在某个产品上面,无法脱身,众所周知,Java给我们的就是一种自由的感觉,自由,永远是那么地吸引人。
出路在哪里?JDO浮现在我眼前。
1.3. JDO浮出水面,可别以为是ADO
JDO自1999年起就由一些经常写数据库对象映射层的富有经验的开发人员提出大纲,他们在长期的面向对象开发中进行了大量的数据库方面的处理和对象化包装,终于,多种多样的包装方式引起很多兼容性方面的问题。于是,一些主要的开发团队就联合起来,以SUN为领头羊,制定了JDO规范。它的目标不是取代JDBC或EJB,而是在JDBC的基础上进行包装,同时又可以做EJB的底层(CMP),简化J2EE服务器提供商的工作。JDO主要面向中小型规模的项目,不过随着产品提供商(Vendors)给出越来越多的功能(Feature),比如分布式的同步控制等等,JDO的作用也越来越大。
JDO规范在Sun的富有经验的Craig Russel的带领下,经过三年的讨论,终于在2002年四月形成了第一版。目前最新版是1.0.1版,在 http://access1.sun.com/jdo/ 可以看到。
(大家应该知道,Java的规范形成时间一般都比较长,因为它太开放了,任何人都可以发表意见,参与制定规范的人都要考虑这些意见)
ADO是微软的数据访问组件集合,相信很多写过基于ASP页面的数据库应用的朋友都印象深刻,快速、容错性强是它的特点,不过扩展性就不敢恭维,写多少年都是那几个东东,无法超越。一些刚接触JDO的读者可能会将JDO与ADO搞混起来,以为是Java版的ADO,那就大错特错了,两者风马牛不相及,可以说不是一个档次上的东西。庆幸的是,微软没有将“xDO”这类缩写注册成商标或专利,否则两个大块头又要打官司了,嘿嘿,我倒是喜欢看热闹,打起来同样精彩!
1.4. JDO产品介绍
JDO规范自从2002年4月推出以来,出现了很多种各有特色的产品,当然,这些产品都遵循JDO规范,不会影响你写的JDO应用的可移植性。下面列举一下我对各个产品的印象:(参见第6节的参考文章:《JDO资源介绍》)
教父:LiDO(法国LibeLis公司)
我对JDO的认识主要是通过LiDO这个产品,它在2002年3月的一份图文并茂的教程中简要解说了JDO的使用和优点。这个教程可以在这里下载:http://www.objectweb.org/conference/JDO.pdf。LiDO的特色是大而全,支持文件型数据库、RDBMS、ODBMS,甚至是XML数据库。不过配置较麻烦。最新版本是2.0RC。
霸主:KodoJDO(美国SolarMetrics公司)
Kodo是JDO的中流砥柱之一,在JDO1.0还未最后通过的时候,它就是一个比较成熟的产品了,其特点是注重性能和稳定性,目前最新版本是2.5.0,是客户最多的产品。
最佳传教士:JDOGenie(南非HemSphere公司)
这是目前我最推荐的产品,最新版本是1.4.7,性能也不错,稳定性还有待验证,但它有一个最大的特点:集成性好,最易学,其公司的CTO David Tinker也是一个善解人意的年轻人,采纳了很多网友的意见对产品进行改进,主要是在配置上非常方便,有一个专门的图形界面工具,可以进行配置、数据库生成、对象查询等等很实用的功能。强烈推荐!
大家闰秀:JRelay(德国ObjectIndustries公司)
这也是一个出现得比较早的产品,也有一个GUI工具用于配置,曾几何时,这个工具还是相对很方便的,但一年多过去了,好象没什么进展,最新版本是2.0,我试过一段时间,后来就没有再跟进了。
两面派:FrontierSuite for JDO (美国ObjectFrontier)
这个产品与JRelay、Kodo一起,可算是早期的JDO三剑客,称它为两面派是因为它正向开发和反向开发都还可以。它的特色是反向工程(从表结构生成数据类)比较方便,与UML的结合也很强,不过真正运行起来的时候,配置复杂。当初该公司曾许诺我以10%的价格买一份,可惜我当时没在意。如果上天再给我一次机会……
免费午餐:TJDO(一群跨国界的有志之士)
这是一个在Sun提供的参考产品(Reference Implementation)的基础上加入一些扩展功能而形成的一个免费产品,目前最新版本是2.0beta3,不过进展也缓慢,这个版本已经出现好几个月了没有进一步的更新。
以上这些是我用过的比较有代表性的产品,还有很多商业产品,以及其它一些或规范或不完全规范的免费JDO产品(如XORM、OJB等),这里不再一一列举,有兴趣的读者可以到 http://www.jdocentral.com/ 去进一步了解。
2. JDOGenie是哪路英雄
前面已经提过,JDOGenie是南非的一个商业化产品,可别小看南非人,他们的收入可不少!当然技术也不错。如果读者做过UML的建模和设计,可能会知道Together Control Center这个产品,也就是最近被Borland收购的一个UML设计工具。JDOGenie的出品公司HemSphere就是Together的南非总代理和合作伙伴。
说到这里,插句题外话,IBM收购了Rational,Borland收购了Together,Sun收购了DescribeUML,一场IDE+UML的大战又将上演。
好,书归正传,JDOGenie是我目前最推荐的产品,原因是易学易用,简单上手,对于想学习JDO的朋友是最适合不过的了!它有一个图形界面的配置工具,可在里面进行数据表映射、SQL操作、JDOQL查询等等功能,非常方便。对采用JDOGenie的Web服务器也可以通过这个图形工具进行监控,可以了解哪些查询费时,哪些查询执行次数多等等,有助于数据库优化调节。
俗话说,百闻不如一见,下面先给几张图片,过把瘾先: