在本篇文章中,我们将详细地讨论Sun公司的Java数据对象(JDO)标准。JDO允许我们使用Java对象,支持事务和多用户。与ODBC不同的是,它使我们无需考虑SQL和与数据库有关的其他东西。它与串行化也有所区别,因为它支持多个用户和事务。JDO允许Java开发人员将他们的数据模型用作数据模型,无需在“数据端”、“对象端”之间的转移方面花费大量的时间。 
  包括CocoBase、WebGain TOPLink和Castor JDO在内的多种产品都可以实现了JDO标准。既然有一种标准的方法,我们就可以只学习其中的一种,就象有了ODBC,我们就可以使用任何提供了驱动程序的数据库那样。 
  在本篇文章中,我们将使用Prism技术公司的OpenFusion JDO。读者在后面会发现,只有很小一部分代码使用了PrismTech API,其他部分都使用了标准的JDO标准。 
  创建Person对象 
  我们将首先创建一个Person对象,该对象遵循了JavaBean的惯例,可以对其属性执行get和set操作。需要注意的是,尽管我们是在创建这个类,但它并没有什么特别的,它没有继承或实现任何基本类。对一个可保持类的要求是: 
  1、所有域必须能够被JDO类访问(public或set*方法) 
  2、域的数据类型必须符合JDO规格。 
  3、不能支持一些类型的字段(例如Thread、File、Socket等不能串行化的字段)。 
  下面是符合上述要求的Person.java:   
  public class Person { 
  private String name; 
  private String address; 
  private String ssn; 
  private String email; 
  private String homePhone; 
  private String workPhone;   
  // 允许我们使用构造器创建Person对象 
  public Person(String name, String address, String ssn, 
  String email, String homePhone, String workPhone) { 
  this.name = name; 
  this.address = address; 
  this.ssn = ssn; 
  this.email = email; 
  this.homePhone = homePhone; 
  this.workPhone = workPhone; 
  }     
  // 方法 
  public String getName() { return name; }   
  public String getAddress() { return address; }   
  public String getSsn() { return ssn; }   
  public String getEmail() { return email; }   
  public String getHomePhone() { return homePhone; }   
  public String getWorkPhone() { return workPhone; }   
  public void setName(String name) { this.name = name; }   
  public void setAddress(String address) { 
  this.address = address; 
  }   
  public void setSsn(String ssn) { this.ssn = ssn; }   
  public void setEmail(String email) { this.email = email; }   
  public void setHomePhone(String homePhone) { 
  this.homePhone = homePhone; 
  } 
  public void setWorkPhone(String workPhone) { 
  this.workPhone = workPhone; 
  } 
  } 
  创建PersonPersist对象管理可保持性 
  现在已经有了Person对象,我们需要创建一些代码来管理这种可保持性。下面我们将详细讨论这些代码,并学习如何: 
  1、初始化JDO可保持性管理器。 
  2、向数据库中输入三个人的资料。 
  3、从数据库中显示人的资料。 
  4、修改其中一个人的名字。 
  5、从数据库中删除一个人的资料。 
  6、在main()方法中进行相关的处理。 
  第一步:初始化JDO可保持性管理器 
  我们从OpenFusion实现中导入了标准的JDO类和ManagedConnectionFactory,当然了我们也可以将它们抽象成一个独立的类。构造器使用javax.jdo.PersistenceManagerFactoryClass属性设置连接代理,这一点与在JDBC中设置数据库驱动程序的属性很相似。 
  package addressbook;   
  import java.util.*; 
  import javax.jdo.*;   
  import 
  com.prismt.j2ee.connector.jdbc.ManagedConnectionFactoryImpl;   
  public class PersonPersist 
  { 
  private final static int SIZE = 3; 
  private PersistenceManagerFactory pmf = null; 
  private PersistenceManager pm = null; 
  private Transaction transaction = null;   
  // 需要保持的人的数组 
  private Person[] people; 
  // 现有对象标识符的向量 
  private Vector id = new Vector(SIZE);   
  public PersonPersist() { 
  try { 
  Properties props = new Properties();   
  props.setProperty("javax.jdo.PersistenceManagerFactoryClass", 
  "com.prismt.j2ee.jdo.PersistenceManagerFactoryImpl"); 
  pmf = JDOHelper.getPersistenceManagerFactory(props); 
  pmf.setConnectionFactory( createConnectionFactory() ); 
  } catch(Exception ex) { 
  ex.printStackTrace(); 
  System.exit(1); 
  } 
  } 
  连接代理是在名字为createConnectionFactory()的静态方法中创建的,该代理需要JDBC URL、JDBC驱动程序、用户名和口令。 
  public static Object createConnectionFactory() { 
  ManagedConnectionFactoryImpl mcfi = new 
  ManagedConnectionFactoryImpl(); 
  Object connectionFactory = null;   
  try { 
  mcfi.setUserName("scott"); 
  mcfi.setPassword("tiger"); 
  mcfi.setConnectionURL( 
  "jdbc:oracle:thin:@localhost:1521:thedb");   
  mcfi.setDBDriver("oracle.jdbc.driver.OracleDriver");   
  connectionFactory = mcfi.createConnectionFactory(); 
  } catch(Exception e) { 
  e.printStackTrace(); 
  System.exit(1); 
  } 
  return connectionFactory; 
  }     
  第二步:在数据库中输入三个人的资料   
  PersistPeople()使用Person.java文件中的构造器创建了3个人的资料。。我们要作的第一件事是通过 
  getPersistenceManager()获得一个可保持性管理器,然后创建一个执行我们的任务的事务。为了保持这一对象结构图,我们简单地调用makePersistentAll( Object[] )方法即可。代码底部的for()循环获得每个保持对象的唯一的ID,并保存起来供以后使用。 
  public void persistPeople() { 
  // 创建人的资料的数组 
  people = new Person[SIZE];   
  // 创建3个人的资料 
  people[0] = new Person("Gary Segal", "123 Foobar Lane", 
  "123-123-1234", "gary@segal.com", 
  "(608) 294-0192", "(608) 029-4059"); 
  people[1] = new Person("Michael Owen", 
  "222 Bazza Lane, Liverpool, MN", 
  "111-222-3333", "michael@owen.com", 
  "(720) 111-2222", "(303) 222-3333"); 
  people[2] = new Person("Roy Keane", 
  "222 Trafford Ave, Manchester, MN", 
  "234-235-3830", "roy@keane.com", 
  "(720) 940-9049", "(303) 309-7599)");   
  // 保持这3个人的资料 
  pm = pmf.getPersistenceManager(); 
  transaction = pm.currentTransaction(); 
  pm.makePersistentAll(people); 
  transaction.commit();   
  // 获取被保持对象的对象ID 
  for(int i = 0; i < people.length; i++) { 
  id.add(pm.getObjectId(people[i])); 
  }   
  // 关闭现有的保持性管理器,保证对象是从数据库而不是从保持性管理器的缓存中读取的 
  pm.close(); 
  } 
  下面是一些可以针对保持性管理器的其他方法: 
  使实例成为可保持的:获得一个临时对象,并保持它。 
  删除可保持实例:从数据存储库中删除信息。 
  使实例临时化:使实例与可保持性管理器分离,而不删除在数据存储库中的信息。 
  使实例处于保持状态 删除保持的实例 使实例处于临时状态 
  makePersistent(Object o) deletePersistent(Object o) makeTransient(Object o) 
  makePersistentAll(Object[] os) deletePersistentAll(Object[] os) makeTransientAll(Object[] os) 
  makePersistentAll(Collection os) deletePersistentAll(Collection os) makeTransientAll(Collection os) 
  (这里是一个4X3的表格,可以参阅原稿中的英文表格)   
  第三步:显示数据库中人的信息 
  显示信息代码以获得可保持性管理器开始。我们使用上面代码中用persistPeople()方法保存的对象ID获得对象,调用对象的方法━━在本例中是gets,来得到我们输入的信息。我们可以发现,要保持我们的对象,并不需要编写大量的代码。 
  public void display(int end) { 
  Person person; 
  int max = end < = SIZE ? end : SIZE;   
  // 获得一个新的可保持性管理器 
  pm = pmf.getPersistenceManager(); 
  // 从数据库中获取对象并进行显示 
  for(int i = 0; i < max; i++) { 
  person = (Person) pm.getObjectById(id.elementAt(i), 
  false); 
  System.out.println("Name : " + person.getName()); 
  System.out.println("Address : " + 
  person.getAddr 
查看本文来源