?? java數據對象(jdo)的應用.txt
字號:
Java數據對象(JDO)的應用
(加入日期:2002-3-17 點擊數:1846)
【對此文發表評論】 【編程愛好者論壇】 【保存文章至硬盤】 【打印文章】
在本篇文章中,我們將詳細地討論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),
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -