這一期我們繼續來聊聊jdo,其實我個人覺得在撰寫 jdo的程式之前,有一個觀念很重要,就是jdo的著眼點是 在物件資料上,是把物件的狀態和內容儲存起來,而不是在 討論儲存的媒介。換言之,把jdo和其他有關資料庫的規格 相比其實是不太合適的。也因此,我們使用jdo技術的時候, 我們要想的是怎麼把我們要儲存的資料以類別正確的表示出來, 至於資料要存到哪裡?這是PersistenceManager(概念上來說,稱為 jdo的driver似乎可以理解)的工作。 ok,我們來設計一個簡單的類別(之後的操作都以lido為例): =================================================== package school; public class Course { private String id=""; private String teacher=""; private String name=""; public String getId(){return id;} public void setId(String id){this.id=id;} public String getTeacher(){return teacher;} public void setTeacher(String teacher){this.teacher=teacher;} public String getName(){return name;} public void setName(String name){this.name=name;} } =================================================== 編譯好之後,我們要"enhance"編譯出來的bytecode,在enhance之前, 我們要先寫一個metadata: =================================================== =================================================== 然後我們在這個metadata檔所在的路徑進行enhance的動作: =================================================== java com.libelis.lido.Enhance =================================================== 經過enhance的動作,bytecode才可以被lido所實作的PersistenceManager 使用。接下來,我們假設儲存媒體是lido內附的McKoi SQL Database, 我們要撰寫一個設定檔,讓lido根據這個設定檔對McKoi SQL Database做操作 (舉例來說,lido會根據設定檔和metadata建立database裡面的table),設定檔 如下: =================================================== # lido.properties file # jdo standard properties javax.jdo.option.connectionURL=jdbc:mckoi://localhost/ javax.jdo.option.connectionDriverName=com.mckoi.JDBCDriver javax.jdo.option.connectionUserName=sa javax.jdo.option.connectionPassword= javax.jdo.option.msWait=5 javax.jdo.option.multithreaded=false javax.jdo.option.optimistic=false javax.jdo.option.retainValues=false javax.jdo.option.restoreValues=true javax.jdo.option.nontransactionalRead=true javax.jdo.option.nontransactionalWrite=false javax.jdo.option.ignoreCache=false # set to PM, CACHE, or SQL to have some traces # ex: #lido.trace=SQL,DUMP,CACHE # set the Statement pool size lido.sql.poolsize=10 lido.cache.entry-type=weak # set the max batched statement # 0: no batch # default is 20 lido.sql.maxbatch=30 lido.objectpool=90 # set for PersistenceManagerFactory pool limits lido.minPool=1 lido.maxPool=10 jdo.metadata=metadata.jdo =================================================== 接著,我們只要撰寫應用程式的主體就可以了,撰寫的時候抓住 幾個大原則: 1.透過JDOHelper.getPersistenceManagerFactory(Properties)取得 PersistenceManagerFactory 2.透過PersistenceManagerFactory取得PersistenceManager 3.透過PersistenceManager取得Transaction 4.對persistence物件的操作,要在transaction.begin()和transaction.commit()之間操作 我們來看看範例程式: =================================================== package school; import javax.jdo.Transaction; import javax.jdo.PersistenceManager; import javax.jdo.Query; import javax.jdo.PersistenceManagerFactory; import javax.jdo.*; import java.util.*; public class test { public static void main(String[] args) { Properties prop=new Properties(); prop.put("javax.jdo.PersistenceManagerFactoryClass","com.libelis.lido.PersistenceManagerFactory"); prop.put("javax.jdo.option.ConnectionURL","jdbc:mckoi://localhost/"); prop.put("javax.jdo.option.ConnectionDriverName","com.mckoi.JDBCDriver"); prop.put("javax.jdo.option.ConnectionUserName","sa"); prop.put("javax.jdo.option.ConnectionPassword",""); PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(prop); PersistenceManager pm = pmf.getPersistenceManager(); Transaction tx = pm.currentTransaction(); tx.begin(); //儲存Course { System.out.println("Creating a new Course"); Course course=new Course(); course.setId("id1"); course.setTeacher("teacher1"); course.setName("course1"); pm.makePersistent(course); } tx.commit(); tx.begin(); // Query { System.out.println("Retrieve all Courses"); Query query = pm.newQuery(Course.class); String filter = "name==\"course1\""; query.setFilter(filter); Collection courses = (Collection) query.execute(); Iterator it = courses.iterator(); while (it.hasNext()) { Course course = (Course) it.next(); String name = course.getName(); System.out.println(name); } pm.deletePersistentAll(courses); } tx.commit(); System.exit(0); } } ===================================================