Java数据对象(Java Data Objects,JDO)是一个应用程序接口(API),它是Java程序员能够间接地访问数据库,也就是说,不需使用直接的结构化查询语言(SQL)语句。JDO是作为Java数据库连接(JDBC)的一个补充来介绍的,而JDBC是一个支持使用SOL语句对流行的数据库程序进行访问的接口。有了JDO,程序员就可以使用类来定义数据对象,然后支撑程序就会根据类的定义来管理对给定数据库的实际的数据访问了。
JDO是以Sun公司为首所制定的Java Community Process(Java标准制定组织,JCP)的一部分。JDBC仍然保留使用是因为它比起JDO允许程序员在数据库访问上有更大的控制权。除JDO和JDBC外的另一个选择是Enterprise JavaBeans (EJB)。 一、为什么要用JDO Java开发人员已经有好几种存取数据库的方法:序列化,JDBC,面向对象映射工具,面向对象数据库,以及实体EJB。那为什么还要介绍其他的存储架构呢?答案是,上面每一种实现存储的方案都存在一定的限制。JDO正在尝试解决这些限制。
但是,这里还是要说一下,世界上没有“万灵丹”。所以,使用JDO并不是对于每一个应用程序都是有好处的。很多应用程序完全可以使用其他更理想的存储机制。 二、JDO架构 下面我开始对JDO的架构作一个简单的介绍。 下图显示了JDO架构主要的几部分:
PersistenceManagerFactory:javax.jdo.PersistenceManagerFactory类可以通过JDOHelper类的助手方法获得,这是一个标准的工厂类,他可以创建PersistenceManager类。 PersistenceManager:javax.jdo.PersistenceManager接口是应用程序经常要使用的一个主要的JDO接口。每 一个PersistenceManager负责控制一组持久化对象而且他还可以创建新的持久化对象或删除现有的持久化对象。Transaction和 PersistenceManager之间存在这一对一的关系,同时PersistenceManager又是Extent和Query的工厂类,也就是 说这两个对象可以通过PersistenceManager创建。 PersistenceCapable:用户定义的持久化类都必须扩展实现PersistenceCapable接口。大多数JDO实现的供应商都提供一 种“增强器”(enhancer)的功能,它可以向你要实现的持久化类中增加PersistenceCapable接口的实现。也就是说,其实你根本不会 自己去实现这个接口。 Transaction:每一个PersistemceManager和javax.jdo.Transaction都是一一对应的。Transactions用来处理事务,它使得持久化数据可以成批的一次性添加到数据表中,如果出现异常就将数据回滚。 Extent:java.jdo.Extent是映射数据库中具体表的类的一个逻辑视图。Extent可以拥有自己的子类,它通过PersistenceManager获得。 Query:java.jdo.Query接口用具体的厂商JDO来实现,它负责处理JDO查询语言(JDOQL),这些JDOQL最终被解释为实际的数据库SQL语言。同样这个接口也是通过PersistenceManager获得的。 下面的例子显示的JDO接口如何操作并执行一个查询并更新持久化对象。
//通过助手类获得PersistenceManagerFactory PersistenceManagerFactory factory= JDOHelper.getPersistenceManagerFactory(System.getProperties()); //通过PersistenceManagerFactory获得PersistenceManager对象 PersistenceManager pm=factory.getPersistenceManager(); //创建并开始一个事务 Transaction tx=pm.currentTransaction(); tx.begin(); //查询employee表中每周工作时间大于40小时的研究人员 Extent ex=pm.getExtent(Employee.class,false); //获得一个Query Query query=pm.newQuery(); //设置这个query作用的范围,即查询的是那个表或记录集 query.setCandidates(ex); query.setFilter(division.name == /Research/ + && avgHours > 40); Collection result=(Collection)query.execute(); Employee emp; for(Iterator itr=result.iterator();itr.hasNext();){ emp=(Employee)itr.next(); emp.setSalary(emp.getSalary()*2); } //提交记录释放资源 tx.commit(); pm.close(); factory.close();
JDO不会抛出通常的运行时异常,比如NullPointerExceptions、 IllegalArgumentException等它只抛出JDOException异常。JDOExcetion的结构如下图所示,这是一个继承的层 次结构,从他们的字面含义就可以看出它们的用途,在这里就不详细说了,要想了解JDO异常的层次结构可以参考它们的JavaDoc。 四、使用JDO的好处 ·简便性(Portability):使用JDO API编写的程序可以在不同开发商的多种可用的实现上运行,不用修改一行代码,甚至不用重新编译。 ·透明地访问数据库(Transparent database access):应用程序开发者编写代码透明地访问底层数据存储,而不需要使用任何数据库特定代码。 ·易用性(Ease of use):JDO API允许开发者只需要关注他们自己范围内的数据模型(Domain Object Model,DOM),而持久化的细节就留给JDO实现。 ·高性能(High Performance):Java应用程序开发者不需要担心数据访问的性能优化,因为这个任务已经委派给了JDO实现,它通过改善数据访问的模式以获得最佳性能。 ·和EJB集成(Integration with EJB):应用程序可以利用EJB的特征,例如远程信息处理、自动分布式事务协调和贯穿整个企业级应用使用同样的DOMs实现安全性。 五、使用JDO,vs. EJB和JDBC JDO并 不意味着要取代JDBC。它们是两种以各自独一无二的能力互相补充的技术,具有不同技术背景和开发目的开发者可以使用二者中的一个。例如。JDBC通过直 接的数据库访问控制和缓存管理,提供给开发者更大的弹性。JDBC是一种在工业界被广泛认可的成熟技术。另一方面,JDO,通过隐藏SQL提供给开发者更 大的简便性。它将Java平台开发者从必须熟悉或学习SQL中解脱出来,而将精力集中在DOM上,同时JDO管理在持久存储中对象存储的字段到字段的细 节。 JDO被 设计成EJB的补充。CMP为容器提供简便的持久化,而JDO可以以两种方式集成到EJB中:(1)通过会话Bean,它含有JDO Persistence-capable类(会话Bean的持久化助手类)用来实现依赖对象;(2)通过实体Bean,它含有被用作BMP和CMP代理的 JDO Persistence-capable类。 你可以学习更多关于JDO和JDBC之间的关系,还有EJB2.0 CMP和JDO之间的关系。 六、POJO之路 JDO和 EJB之间在持久化模型上显著的差别曾经在开发者中间引起了混乱。作为回应,Sun微系统正领导一个社区项目为Java技术社区创建POJO持久化模型。 这个项目在JSR-220的赞助下执行,由Linda DeMichiel领导。JDO2.0(JSR-243)的专家组成员被邀请加入到EJB3.0(JSR-220)专家组中。 创建POJO持久化模型的目的是为所有使用Java SE和Java EE平台的Java应用程序开发者提供一个对象—关系(object-relational)映射工具。值得注意的是Oracle正以co-specification lead的身份加入到Sun EJB3.0。EJB3.0的公众评论草案已经可以得到。 JSR-243(JDO2.0)遵循了那些来自于JSRs220和243规范的领导写给Java技术社区的信件所描述的轮廓。 JDO2.0并不打算作为EJB3.0持久化特定API的集中,而是作为JDO1.0.2的发展。但是JDO的POJO持久化模型和EJB3.0之间的类似处,使得JDO的客户当使用JDO2.0满足立即的需求时,可以很容易的接受EJB3.0持久化模型。另外,JSR-243打算将JDOQL用作一种关于EJB3.0持久化数据的可选查询语言。这种语言了已经被更新从而可以更好地对EJB3.0使用。 要了解更多关于持久化模型的知识,请查看EJB/JDO持久化FAQ。 七、JDO Class类型 在JDO中一共有三种类型的类: ·Persistence-capable:这种类型代表那些实例可以被持久化到一个数据存储中的类。请注意,这些类在JDO环境中被使用之前,需要通过JDO元数据规范进行加强。 ·Persistence-aware:这些类操纵persistence-capable类。JDOHelper类包含了一些方法,它们允许询问一个persistence-capable类的实例的持久化状态。请注意,这些类使用最小化的JDO元数据加强。 ·Normal:这些不可被持久化,并且对持久化一无所知。另外它们不需要JDO元数据。 八、JDO实例的生命周期 JDO管理一个对象从创建到删除的生命周期。在它的生命周期,JDO实例不断地转换它的状态,直到最后被Java虚拟机(JVM)作为垃圾回收。状态的转换使用PersistenceManager类的方法完成,包括TransactionManager——例如makePersistent()、makeTransient()、deletePersistent()——和提交或者回滚更改。 表1显示JDO规范定义的10种状态。前面的七种是必须的,后面的三种是可选的。如果一个实现不支持某些操作,那么就不会获得三种可选的状态。 表1 JDO生命周期
图2显示了JDO实例各状态之间的转换。 本文稍后的代码片断,将示范如何执行我们刚刚讨论的操作。 九、JDO参考实现 JDO参考实现,来自于Sun微系统,已经可用,一同发行的还有一种被称为fstore的基于文件的存储机制。Sun已经把JDO捐献给开源社区。JDO1.0和JDO2.0将会作为Apache JDO项目的一部分进行开发。但是由于时间的限制,JDO2.0的参考实现并不是作为Apache项目建立的,而是作为一个JPOX 发行。一些商业实现也是可用的。 十、JDO编程模型 JDO定义了两种类型的接口:JDO API(在javax.jdo包中)和JDO服务提供者接口(SPI)(在javax.jdo.spi包中)。JDO API面向应用程序开发者,而JDO SPI面向容器提供者,和JDO卖主。 一个应用程序包含两个主要的接口: ·PersistenceManagerFactory代表了应用程序开发者用来获得PersistenceManager实例的访问点。这个接口的实 例可以被配置和序列化以备后来使用。然而,需要注意的是,一旦第一个PersistenceManager实例从 PersistenceManagerFactory中被获得,这个工厂就不再是可配置。你可以使用下面的代码来获得 PersistenceManagerFactory。
|
java学习之JDO
最新推荐文章于 2019-06-13 21:03:00 发布