服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java数据对象(jdo)的应用


  在本篇文章中,我们将详细地讨论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

扫描关注微信公众号