《Java数据对象技术JDO三电子教案》由会员分享,可在线阅读,更多相关《Java数据对象技术JDO三电子教案(23页珍藏版)》请在金锄头文库上搜索。
1、Java数据对象技术JDO三,项目目录结构 对于Media Mania应用开发环境来说,你需要采用下面的目录结构,这个项目必须有一个根目录,存在于系统的文件体系的某个地方。下面这些目录都是以这个根目录为基准的: src 这个目录包括应用的所有源码。在src目录下,有一个按照com/mediamania/prototype结构的子目录体系(与Java中的com.mediamania.prototype包相对应)。这也是Movie.java、Actor.java和Role.java源文件所在的目录。 classes 当Java源码被编译时,生成的.class文件置于这个目录中 enhanced 这
2、个目录存放增强后的.class类代码文件(由增强器所产生) database 这个目录存放JDO参考产品用于存储数据的文件。,尽管这样的目录结构并不是JDO规范所要求的,但你得理解它,这样才能跟随我们对Media Mania应用的描述。 当你执行你的JDO应用时,Java运行环境必须调入增强版本的类文件,也就是处于enhanced目录中的类文件。因此,在你的CLASSPATH中这个目录必须处于classes目录之前。作为一种可选方案,你也可以采用就地增强,用你的增强后的类文件直接替换未增强的文件。 增强类代码以便存储 类在其实例被JDO环境处理之前必须先被增强。JDO增强器在你的类中加入额外的
3、数据和方法,使其实例可以被JDO产品处理。增强器先从由javac编译器所产生的类文件中读取信息,再根据元数据来生成新的增强过的包含必要功能的类文件。JDO规范化了增强器所做的改变,使得增强后的类文件具有二进制兼容性,可以在其它的JDO产品中使用。这些增强后的文件也独立于任何具体的数据库。,前面已经提到,Sun公司提供的JDO参考产品中的增强器称作参考增强器。而JDO产品厂商一般可能会提供自己的增强器;在命令行调用增强器的语法可能会与这里提到的有所不同。每个产品都会向你提供文档以阐释如果在该产品上对你的类进行增强。 例1-5给出了使用参考增强器对我们的Media Mania应用的类进行增强的命令
4、行。-d参数指明将要存放增强后的类文件的目录,我们已经计划放到enhanced目录下。增强器接收一系列JDO元数据文件和一系列需要增强的类文件作参数。目录之间的分隔符和续行符(line-continuation)可能会不一样,这依赖于你进行编译的操作系统。 例1-5 对类进行增强 java com.sun.jdori.enhancer.Main -d enhanced classes/com/mediamania/prototype/package.jdo classes/com/mediamania/prototype/Movie.class classes/com/mediamania/p
5、rototype/Actor.class classes/com/mediamania/prototype/Role.class,现在既然我们的类已经被增强了,它们的实例也就可以被储存到数据库中了。我们现在来看看应用中如果创建一个与数据库的连接并在一个事务(Transaction)中执行一些操作。我们开始写直接使用JDO接口的软件代码,所有的在应用中用到的JDO接口都定义在javax.jdo包中。 JDO中有一个接口叫做PersistenceManager(存储管理器,见术语表),它具有一个到数据库的连接。一个PersistenceManager还有一个JDO中的Transaction(事务)
6、接口的实例,用于控制一个事务的开始和结束。这个Transaction实例的获取方式是调用PersistenceManager实例的currentTransaction()方法。 获取一个PersistenceManager PersistenceManagerFactory(存储管理器工厂,见术语表)用来配置和获取PersistenceManager。PersistenceManagerFactory中的方法用来设置一些配置属性,这些配置属性控制了从中获得的PersistenceManager实例的行为。于是,一个JDO应用的第一步便是获取一个PersistenceManagerFactory
7、实例。要取得这个实例,需要调用下面的JDOHelper类的静态方法:,static PersistenceManagerFactory getPersistenceManagerFactory(Properties props) 这个Properties实例可以通过程序设置,也可以从文件中读取。例1-6列出了我们将在Media Mania应用中用到的配置文件的内容。其中,第行中的PersistenceManagerFactoryClass属性通过提供具体JDO产品的PersistenceManagerFactory接口实现类来指明采用哪个JDO产品。在本例中,我们指明Sun公司的JDO参考产品
8、所定义的类。例1-6中列出的其它的属性包括用于连接到特定的数据库的连接URL和用户名/密码,这些一般都是连接到具体的数据库所需要的。 例1-6 jdo.properties文件内容 javax.jdo.PersistenceManagerFactoryClass=com.sun.jdori.fostore.FOStorePMF javax.jdo.option.ConnectionURL=fostore:database/fostoredb javax.jdo.option.ConnectionUserName=dave javax.jdo.option.ConnectionPassword=
9、jdo4me javax.jdo.option.Optimistic=false,这个连接URL的格式依赖于采用的具体的数据库。在JDO参考产品中包括它自己的存储机制,称作文件对象数据库File Object Store(FOStore)。例1-6中的ConnectionURL属性标明了实际使用的数据库位于database目录中,在我们的项目的根目录下。在本例中,我们提供了一个相对路径;但提供绝对路径也是可以的。这个URL同时指明了FOStore数据库文件名称将以fostoredb开头。 如果你使用了别的JDO产品,你需要对以上这些属性提供另外的值,可能你还得提供一些额外的属性。请参阅该产品的
10、文档以获取需要配置的必要的属性的说明。 创建一个FOStore数据库 要使用FOStore我们必须先创建一个数据库。例1-7中的程序利用jdo.properties文件创建一个数据库;所有的应用都使用这个配置文件。第行将这些配置属性从jdo.properties文件中调入到一个Properties实例中。该程序的第行加入了一个com.sun.jdori.option.ConnectionCreate属性以指明数据库需要创建。将其设为true,就能引导参考产品创建该数据库。我们在第行调用getPersistenceManagerFactory()来获取PersistenceManagerFact
11、ory。第行生成一个PersistenceManager。,为完成数据库的创建,我们还需要开始并结束一个事务。第行中调用了PersistenceManager的currentTransaction()方法来访问与该PersistenceManager相关联的Transaction实例。第行和第行调用这个Transaction实例的begin()和commit()方法来开始和结束一个事务。当你执行这个程序时,在database目录下就会生成一个FOStore数据库,包括两个文件:fostore.btd和fostore.btx. 例1-7 创建一个FOStore数据库 package com.me
12、diamania; import java.io.FileInputStream; import java.io.InputStream; import java.util.Properties; import javax.jdo.JDOHelper; import javax.jdo.PersistenceManagerFactory; import javax.jdo.PersistenceManager; import javax.jdo.Transaction;,public class CreateDatabase public static void main(String arg
13、s) create(); public static void create() try InputStream propertyStream = new FileInputStream(jdo.properties); Properties jdoproperties = new Properties(); jdoproperties.load(propertyStream); jdoproperties.put(com.sun.jdori.option.ConnectionCreate, true); PersistenceManagerFactory pmf = JDOHelper.ge
14、tPersistenceManagerFactory(jdoproperties); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction();, tx.begin(); mit(); catch (Exception e) System.err.println(Exception creating the database); e.printStackTrace(); System.exit( -1); JDO参考产品提供了这种程序化创建FODatastore数据
15、库的方式,而大多数数据库都提供一个独立于JDO的工具来创建数据库。JDO并不规定一个与厂商无关的接口来创建数据库。数据库的创建一般都与具体使用的数据库相关。本程序中显示了在FOStore数据库中是如何完成这一步的。,另外,如果你在关系数据库上使用JDO,某些情况下可以有一个额外的步骤:根据对象模型创建或者将对象模型映射到一个现存的数据库模式(shema,即某数据库用户及其所拥有的数据表体系的合称)。创建一个数据库模式的过程与你采用的具体JDO产品的有关,你需要查看该产品的文档来决定采取必要的步骤。 对实例的操作 至此我们已经有了一个可以存放数据类的实例的数据库,每个程序需要获得一个Persis
16、tenceManager来访问或更新该数据库。例1-8给出了MediaManiaApp类的源码,这个类是本书中的每个应用程序的基础类,每个程序是在execute()方法中实现了具体的业务逻辑的一个具体的子类(Concrete子类,相对于抽象Abstract而言)。,MediaManiaApp有一个构造器用来从jdo.properties中读取配置信息(行)。从该文件调入配置信息后,它调用getPropertyOverrides()方法并且合并成最终的属性集(properties)到jdoproperties对象中。一个程序子类可以重载getPropertyOverrides()来提供额外的配置信息或者更改jdo.properties文件中给出的配置。这个构造器获取一个PersistenceManagerFactory(行),然后获取一个PersistenceManager(行)。我们还提供一个getPersistenceManager()方法以便在MediaManiaApp类之外获取PersistenceManager。与PersistenceManager关联