`
alpha3171
  • 浏览: 6974 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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; }
JAVA天堂


  
  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); JAVA天堂
  }
  }
  连接代理是在名字为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.getAddress());
System.out.println("SSN : " + person.getSsn());
System.out.println("Email : " + person.getEmail());
System.out.println("Home Phone: " + 
person.getHomePhone());
System.out.println("Work Phone: " + 
person.getWorkPhone());
}
pm.close();
}
第四步:改变其中一个人的名字
改变存储在数据库中的一个人的信息的代码也十分简单,它与显示数据库中人的信息的代码非常类似。在这里,我们需要创建一个事务(因为要修改其中的记录),使用定义的setName()方法修改一个人的名字,最终提交该事务,保存所作的修改。这种操作与处理临时对象之间真正的差别是,我们考虑是事务。
public void change() {
Person person;

// 从数据存储库中获取对象
pm = pmf.getPersistenceManager();
transaction = pm.currentTransaction();
// 修改第二个保持记录的DataString字段
person = (Person) pm.getObjectById(id.elementAt(1), 
false);
person.setName("Steve Gerrard");
// 提交事务并关闭可保持性管理器
transaction.commit();
pm.close();
}
第五步:删除一个人的资料
你自己能够想象出从数据库中删除第二个人资料的代码吗?因为我们已经了解了所有编写这一代码所需要的知识。仔细地研究一下下面的代码就会发现,我们使用了第二步中的可保持性管理器方法中提到的deletePersistent()方法。
public void delete() {
// 从数据库中获取对象
pm = pmf.getPersistenceManager();
transaction = pm.currentTransaction();
// 从数据库中删除第二个人的信息,并从ID向量中删除其ID
pm.deletePersistent(pm.getObjectById(id.remove(1), 
false));
// 提交事务并关闭可保持性管理器
transaction.commit();
pm.close();
}
第六步:在main()方法中运行上面的代码
最后,整个代码需要有一个main()串起来,在数据库中输入人的信息、改变其中一个人的名字,然后删除该人的资料。如果运行这一程序,就会看到程序运行到每一步时的地址簿。
public static void main(String[] args) {
System.out.println("Create PersonPersist");
PersonPersist personPersist = new PersonPersist();

System.out.println("Setup and persist a group of people");
personPersist.persistPeople();

System.out.println("Display the persisted people");
personPersist.display(SIZE);

System.out.println("Change a name ");
personPersist.change();
personPersist.display(SIZE);

System.out.println("Delete a person ");
personPersist.delete();
personPersist.display(SIZE - 1);
}
JDOEnhancer:创建JDOEnhancer的JDO描述符

现在,我们已经编写好了整个应用程序的源代码,下一步需要作的就是创建一个JDOEnhancer将要使用的
JDO描述符。读者一定会问,JDOEnhancer是什么?JDO架构是基于下面的理念的:一个JDO实现能够获取类的字节码,对它们进行处理,添加一些必要的功能。例如,JDOEnhancer将使类实现PersistanceCapable接口(因此我们不用自己编程实现这一接口),而且能够实现该接口中的一些方法。因此在对代码编译后我们就会发现,我们必须运行JDOEnhancer对字节码进行适当的处理。我们需要创建一个给出我们需要保持的类的信息的描述符文件,这一文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jdo SYSTEM 
"file:/D:/Apps/OpenFusionJDO/xml/schema/jdo.dtd">
<jdo>
<package name="addressbook">
<class name="Person" identity-type="datastore">
</class>
</package> 
</jdo>
这只是一个最基本的文件,但能够满足我们的要求。当然了,还有许多更复杂的映射。下面是OpenFusion例子中一个稍微复杂一些的映射:
<class name="Department" identity-type="datastore">
<field name="name"/>
<field name="employees">
<collection element-
type="com.prismt.j2ee.jdo.examples.appKeyDepartment.Employee">
</collection>
</field>
<field name="manager"/>
</class>
</package>
</jdo>
现在我们已经编写好了代码和JDO描述符文件,我们将对它们进行整合,并讨论如何建立整个系统。要建立整个系统,我们只需要简单的几步工作即可:
1、编译代码。
2、运行JDOEnhancer。
3、使用JDOEnhancer的输出建立数据库。
4、运行应用程序。
第一步:编译代码
我想广大的读者想必已经知道如何运行javac了吧。在运行javac之前,我们只要保证正确地设置CLASSPATH就可以了。下面是一个在Windows平台上运行javac的例子:
% set OPENFUSION_DIR=D:\Apps\OpenFusionJDO
% set 
CLASSPATH=%OPENFUSION_DIR%\lib\connector.jar;%OPENFUSION_DIR%\
lib\jndi.jar;%OPENFUSION_DIR%\lib\log4j.jar;%OPENFUSION_DIR%\l
ib\xerces.jar;%OPENFUSION_DIR%\lib\classes12.zip;%OPENFUSION_D
IR%\lib\jdo.jar;%OPENFUSION_DIR%\lib\jta-
spec1_0_1.jar;%OPENFUSION_DIR%\lib\ofjdo.jar;.

% javac –d . Person*.java
第二步:运行JDOEnhancer
JDOEnhancer需要使用在上一步编译中得到的字节码和我们先前建立的JDO描述符文件。下面是OpenFusion JDOEnhancer的完整语法:
java com.prismt.j2ee.jdo.enhancer.JDOEnhancer

命令选项:
-cp 开始搜索需要强化的类的基本路径,与CLASSPATH不同,它是编译后的可保持类所在的目录
-oc 存储强化后的类的目录
-pd JDO描述符文件

可选项:
-db 指定目标数据库 [oracle、sybase等] 
-od 生成SQL脚本的目录

下面是为建立我们的应用程序而运行JDOEnhancer的一个例子:
% java com.prismt.j2ee.jdo.enhancer.JDOEnhancer -oc . -pd 
person.jdo -db oracle -od db -cp .
第三步:使用JDOEnhancer的输出建立数据库
,只要使用–db和-od可选项,JDOEnhancer就能够创建建立数据库的数据库脚本。它能够创建许多脚本,但其中有一个的名字叫load_all.sql,打开该文件并将它加载到一个SQL提示符中。(例如sqlplus for Oracle)

CREATE SEQUENCE instid_seq INCREMENT BY 1
;

CREATE TABLE JDO_addressbook_Person_SCO
(
inst_id INTEGER NOT NULL,
class INTEGER NOT NULL,
JDO_address VARCHAR2(255),
JDO_email VARCHAR2(255),
JDO_homePhone VARCHAR2(255),
JDO_name VARCHAR2(255),
JDO_ssn VARCHAR2(255),
JDO_workPhone VARCHAR2(255)
)
;
CREATE TABLE JDO_addressbook_Person
(
inst_id INTEGER NOT NULL,
class INTEGER NOT NULL,
JDO_address VARCHAR2(255),
JDO_email VARCHAR2(255),
JDO_homePhone VARCHAR2(255),
JDO_name VARCHAR2(255),
JDO_ssn VARCHAR2(255),
JDO_workPhone VARCHAR2(255)
)
;
CREATE TABLE prismjdoProp
(
name VARCHAR2(255) PRIMARY KEY,
value VARCHAR2(255)
)
;
CREATE TABLE prismjdoExtents
(
class_id NUMBER(38,0) PRIMARY KEY,
class_name VARCHAR2(255) UNIQUE,
app_key VARCHAR2(255)
)
;
ALTER TABLE JDO_addressbook_Person_SCO ADD PRIMARY KEY 
(inst_id, class)
;
ALTER TABLE JDO_addressbook_Person ADD PRIMARY KEY (inst_id, 
class)
;

INSERT INTO prismjdoExtents VALUES(0, 'addressbook.Person', 
'com.prismt.j2ee.jdo.spi.DBKey')
;
COMMIT WORK
;

INSERT INTO prismjdoProp VALUES('USE.RDBMS.TRIGGERS', 'true')
;
COMMIT WORK
;
第四步:运行应用程序
现在已经建立了数据库,我们就可以运行应用程序了。怎么样,分享一下自己的劳动成果吧!
% java addressbook.PersonPersist
结束语
我们已经讨论了如何使用OpenFusion JDO实现来处理JDO标准。这是一个全新的领域,开发人员可以集中精力处理业务需求和对象,而无需对SQL十分精通。
分享到:
评论

相关推荐

    jdo-java数据对象

    Java数据对象(JDO)是Java编程环境中用来间接访问数据库的一种API,它的出现是为了补充Java数据库连接(JDBC)的功能。JDBC虽然强大,但直接使用SQL语句进行数据库操作可能会增加开发复杂性,而JDO则允许程序员通过...

    2022年Java数据对象技术JDOJava教程.docx

    总结来说,Java 数据对象技术 JDO 是为了简化 Java 应用程序中数据的持久化过程,通过提供统一的 API 和数据模型,减少开发者对底层数据访问技术的理解和使用,从而提高开发效率和代码的可维护性。无论是小型应用...

    Java数据对象(JDO)的应用.rar_JDO

    详细地讨论Sun公司的Java数据对象(JDO)标准。JDO允许我们使用Java对象,支持事务和多用户。与ODBC不同的是,它使我们无需考虑SQL和与数据库有关的其他东西。它与串行化也有所区别,因为它支持多个用户和事务。JDO...

    Java数据对象(JDO)的前世今生

    1Java与数据库应用,JDBCJava发明以来,在短短的几年之间,迅速占领了从桌面应用(J2SE)到服务器(J2EE),再到小型设备嵌入式系统(J2ME)的应用开发市场,其语言吸取了SmallTalk的一切皆对象的理念,摆脱了C++的...

    全面了解JDO数据库编程 多文档打包

    JDO提供了透明的对象存储,因此对开发人员来说,存储数据对象完全不需要额外的代码(如JDBC API的使用)。这些繁琐的例行工作已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。...

    JDO原理及开发实现

    Java 数据对象(JDO,Java Data Objects)是一种用于在Java应用程序中访问关系数据库的标准API。JDO 提供了一种透明的持久化机制,允许开发者直接操作对象,而无需关心底层数据库的操作细节。JDO 的核心理念是将Java...

    JDO上实践

    Java数据对象(JDO,Java Data Objects)是Java平台上的一个标准接口,它提供了一种在应用程序和持久性存储之间进行交互的方式。JDO的主要目标是简化数据持久化,允许开发者将Java对象直接保存到数据库中,而无需...

    Java数据编程指南

    J2EE通信 通信概述 JMS的详细情况 消息驱动EJB 小结 第24章 Java数据对象(JDO) 概述 JDO对象模型 JDO API JDO实例的生命周期 JDO和EJB 开发可持久类 范例应用程序 配置FFJ...

    全面了解JDO第四部分

    Java数据对象(JDO)是Java平台上的一个标准接口,用于访问和管理持久化数据。在本篇全面了解JDO的第四部分中,我们将深入探讨JDO的核心概念、功能以及如何利用它来优化数据库操作。 首先,JDO提供了一种透明的持久...

    JDO原理及案例开发

    Java 数据对象(JDO)是一种Java编程语言中的持久化框架,它允许开发者将Java对象存储到关系型数据库中,而无需直接编写SQL语句。JDO 提供了一种标准的接口,使得Java对象和数据库之间的交互变得更加简单和灵活。...

    JDO持久化技术应用于Struts框架的模型.pdf

    而Java数据对象(JDO)作为一种轻量级的对象持久化解决方案,在数据管理和持久化方面展现出了显著的优势。本文旨在探讨如何将JDO技术整合到Struts框架中,以进一步提升Web应用的开发效率和性能。 #### 二、JDO技术...

    JDO原理及开发.doc

    Java Data Objects(JDO)是Java平台上的一个标准接口,它提供了一种透明持久化对象的机制。JDO允许开发者将对象模型直接存入数据库,而无需关心底层数据存储的细节,大大简化了数据访问层的开发工作。本文档《JDO...

    全面了解JDO第一部分

    通过JDO,开发者可以使用普通的Java对象(POJOs,Plain Old Java Objects)来表示数据库中的记录,JDO会自动处理对象的持久化、查询和事务管理。 ### JDO的基本组件 1. **DataStore**: 这是JDO的后端,通常是一个...

    全面了解JDO数据库编程.rar

    了解何时使用延迟加载(Lazy Loading)、批处理(Batching)和缓存策略是提高JDO应用性能的关键。开发者还应熟悉JDO的持久化缓存机制,以减少数据库交互。 9. **JDO与其他持久化技术的对比** JDO与Hibernate、...

    全面了解jdo数据库编程

    JDO的主要目标是简化Java应用程序与数据库之间的交互,提供一种面向对象的方式来存取数据,从而避免了传统JDBC中的大量SQL代码和数据转换工作。 ### JDO规范 JDO规范定义了一组API,允许开发者以面向对象的方式...

    Addison.Wesley.Java.Data Objects.pdf

    《Java数据对象》是Robin M. Roos撰写的一本关于Java编程领域的专著,主要探讨了如何在Java环境中高效地处理和操作数据对象。这本书由Addison Wesley出版社出版,其内容涵盖了Java数据对象(Java Data Objects,JDO...

    jdo2-api-2.3-ec hive hdfs 所需jar

    二、Hive中的JDO应用 在Hive中,JDO作为元数据存储的主要接口,负责管理Hive的表结构、分区信息等元数据。Hive通过JDO2-API-2.3-EC与Metastore服务进行通信,将SQL语句转换为Hadoop MapReduce任务,从而实现了对大...

    实现Castor数据绑定,第4部分把Java对象绑定到SQL数据库.pdf

    值得注意的是,SQL数据绑定并不完全等同于Java数据对象(JDO)技术,但它们在某些方面有相似之处。JDO是一种标准,旨在提供对象持久化服务,而Castor则是一个实现,提供了包括SQL数据绑定在内的多种数据绑定功能。...

Global site tag (gtag.js) - Google Analytics