<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      Java數據對象(JDO)的應用

      [摘要]在本篇文章中,我們將詳細地討論Sun公司的Java數據對象(JDO)標準。JDO允許我們使用Java對象,支持事務和多用戶。與ODBC不同的是,它使我們無需考慮SQL和與數據庫有關的其他東西。它與串行化也有所區別,因為它支持多個用戶和事務。JDO允許Java開發人員將他們的數據模型用作數據模型,無...
      在本篇文章中,我們將詳細地討論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.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十分精通。


      日韩精品一区二区三区高清