Kodo JDO 規範
Kodo JDO包含自己的類來創建數據庫模型和增強類。
模型生成工具被用於揣安數據庫模型,這個模型將被用於存儲JDO對象實例。工具正式支持的數據庫包括:
DB2
InstantDB
SQLServer
MySQL
Oracle
PostgreSQL
其他數據庫的JDBC驅動可以通過擴展代碼被加入。詳細內容參考Kodo JDO的文檔。
模型創建工具要依賴於一個package.jdo文件,這個文件被用於定義JDO實例類的一些細節。下面的文件被用於這個例子。可以查看Kodo JDO的文檔來獲得文件格式和概念的詳細信息。
[pre] <?xml version="1.0"?>
<jdo>
<package name="com.ociweb.jdodemo">
<class name="Engine"/>
<class name="Vehicle"/>
<class name="Bicycle" persistence-capable-superclass="Vehicle"/>
<class name="MotorVehicle" persistence-capable-superclass="Vehicle"/>
<class name="Fleet">
<field name="vehicles">
<collection element-type="Vehicle"/>
</field>
</class>
</package>
</jdo> [/pre]
schematool.bat文件被用來運行模型創建工具。.jdo文件必須作爲一個參數放到命令行中。
schematool.bat package.jdo
一旦模型被創建,域對象的類文件必須被增強以實現PersistenceCapable 接口。jdoc.bat文件被用於運行類增強器。jdoc.bat批處理文件也需要package.jdo文件作爲參數方到命令行中。
jdoc.bat package.jdo
上面演示的模型創建和類增強是Kodo JDO實現特有的,它並不是JDO規範的一部分。其他的廠商也許有他們自己的方法來完成以上部分,具體實現要參考廠商的文檔。
向數據庫增加數據
由於數據庫已經配置完成並且我們的域對象也已經設計好了,代碼也通過增強實現了PersistenceCapable接口,現在那些類的可以被實例化並添加到數據庫中了。
下面的類將實例化一個Fleet,給他添加幾條數據然後把它存儲到數據庫中。
- /**
- * SeedDatabase.java
- */
- package com.ociweb.jdodemo;
- // 廠商實現的PersistenceManagerFactory
- import com.solarmetric.kodo.impl.jdbc.JDBCPersistenceManagerFactory;
- import javax.jdo.PersistenceManager;
- import javax.jdo.Transaction;
- public class SeedDatabase {
- public static void main(String[] args) {
- // 創建一個vehicles的fleet...
- Fleet fleet = new Fleet();
- fleet.addVehicle(new Bicycle("Schwinn"));
- fleet.addVehicle(new Bicycle("Giant"));
- fleet.addVehicle(new MotorVehicle(4, new Engine(8)));
- fleet.addVehicle(new MotorVehicle(2, new Engine(4)));
- fleet.addVehicle(new MotorVehicle(4, new Engine(4)));
- // 獲得的一個PersistenceManager...
- PersistenceManager pm =
- new JDBCPersistenceManagerFactory().getPersistenceManager();
- // 開始一個transaction...
- Transaction transaction = pm.currentTransaction();
- transaction.begin();
- // 存儲 fleet...
- pm.makePersistent(fleet);
- // 提交transaction...
- transaction.commit();
- // 關閉 manager...
- pm.close();
- }
- }
從數據庫中獲得數據
下面的代碼從數據庫中獲得類的所有實例(包括子類的)並且把他們打引導控制檯。
- /**
- * ListAll.java
- */
- package com.ociweb.jdodemo;
- // 廠商實現的PersistenceManagerFactory
- import com.solarmetric.kodo.impl.jdbc.JDBCPersistenceManagerFactory;
- import javax.jdo.Extent;
- import javax.jdo.PersistenceManager;
- import javax.jdo.PersistenceManagerFactory;
- import javax.jdo.Query;
- import java.util.Collection;
- import java.util.Iterator;
- public class ListAll {
- public static void main(String[] args) {
- // 廠商特定的工廠實現...
- PersistenceManagerFactory managerFactory =
- new JDBCPersistenceManagerFactory();
- // 獲得一個 manager...
- PersistenceManager manager =
- managerFactory.getPersistenceManager();
- Extent ext = manager.getExtent(Vehicle.class, true);
- Query query = manager.newQuery(Vehicle.class, ext, "");
- Collection vehicles = (Collection) query.execute();
- Iterator iterator = vehicles.iterator();
- while (iterator.hasNext()) {
- Vehicle vehicle = (Vehicle) iterator.next();
- System.out.println("vehicle = " + vehicle);
- }
- manager.close();
- }
- }
ListAll 輸出內容:
[pre] vehicle = Bike: Model Schwinn
vehicle = Bike: Model Giant
vehicle = MotorVehicle With 4 Wheels. 8 Cylinder Engine.
vehicle = MotorVehicle With 2 Wheels. 4 Cylinder Engine.
vehicle = MotorVehicle With 4 Wheels. 4 Cylinder Engine.[/pre]
限制輸出的結果爲有四個cylinders的Vehicle 對象。條件參數必須放到newQuery()中。
注意這個例子中使用MotorVechicle類來實例化Vechicle,因爲只有MotorVehicle 對象有Engines。
- /**
- * ListFourCylinderVehicles
- */
- package com.ociweb.jdodemo;
- // 廠商實現的PersistenceManagerFactory
- import com.solarmetric.kodo.impl.jdbc.JDBCPersistenceManagerFactory;
- import javax.jdo.Extent;
- import javax.jdo.PersistenceManager;
- import javax.jdo.PersistenceManagerFactory;
- import javax.jdo.Query;
- import java.util.Collection;
- import java.util.Iterator;
- public class ListFourCylinderVehicles {
- public static void main(String[] args) {
- // 廠商特定的工廠實現...
- PersistenceManagerFactory managerFactory =
- new JDBCPersistenceManagerFactory();
- // 獲得 a manager...
- PersistenceManager manager =
- managerFactory.getPersistenceManager();
- Extent ext = manager.getExtent(MotorVehicle.class, true);
- // 只返回有4個cylinders的 vehicles...
- Query query = manager.newQuery(MotorVehicle.class, ext,
- "engine.numberOfCylinders == 4");
- Collection vehicles = (Collection) query.execute();
- Iterator iterator = vehicles.iterator();
- while (iterator.hasNext()) {
- Vehicle vehicle = (Vehicle) iterator.next();
- System.out.println("vehicle = " + vehicle);
- }
- manager.close();
- }
- }
ListFourCylinderVehicles 的輸出結果爲:
[pre] vehicle = MotorVehicle With 2 Wheels. 4 Cylinder Engine.
vehicle = MotorVehicle With 4 Wheels. 4 Cylinder Engine.[/pre]
結論
JDO提供了一個數據庫表示,在面向對象方面它比JDBC有何多好處。具體的對象映射和數據庫廠商對於開發人員來講都是隱藏的(換句話說開發人員根本不用管)。存儲和查詢的數據庫操作非常簡單明瞭。開發人員寫的有關數據存儲的代碼非常少。有理由認爲JDO對於Java數據存儲是非常引人注目的技術。