Java 數據對象(JDO)介紹(四)

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,給他添加幾條數據然後把它存儲到數據庫中。 

  1.     /**
  2.      * SeedDatabase.java
  3.      */
  4.     package com.ociweb.jdodemo;
  5.     
  6.     // 廠商實現的PersistenceManagerFactory
  7.     import com.solarmetric.kodo.impl.jdbc.JDBCPersistenceManagerFactory;
  8.     
  9.     import javax.jdo.PersistenceManager;
  10.     import javax.jdo.Transaction;
  11.     
  12.     public class SeedDatabase {
  13.     
  14.         public static void main(String[] args) {
  15.             // 創建一個vehicles的fleet...
  16.             Fleet fleet = new Fleet();
  17.             fleet.addVehicle(new Bicycle("Schwinn"));
  18.             fleet.addVehicle(new Bicycle("Giant"));
  19.             fleet.addVehicle(new MotorVehicle(4, new Engine(8)));
  20.             fleet.addVehicle(new MotorVehicle(2, new Engine(4)));
  21.             fleet.addVehicle(new MotorVehicle(4, new Engine(4)));
  22.     
  23.             // 獲得的一個PersistenceManager...
  24.             PersistenceManager pm =
  25.                     new JDBCPersistenceManagerFactory().getPersistenceManager();
  26.     
  27.             // 開始一個transaction...
  28.             Transaction transaction = pm.currentTransaction();
  29.             transaction.begin();
  30.     
  31.             // 存儲 fleet...
  32.             pm.makePersistent(fleet);
  33.     
  34.             // 提交transaction...
  35.             transaction.commit();
  36.     
  37.             // 關閉 manager...
  38.             pm.close();
  39.         }
  40.     }
  41.     

從數據庫中獲得數據
下面的代碼從數據庫中獲得類的所有實例(包括子類的)並且把他們打引導控制檯。 
  1.     /**
  2.      * ListAll.java
  3.      */
  4.     package com.ociweb.jdodemo;
  5.     
  6.     // 廠商實現的PersistenceManagerFactory
  7.     
  8.     import com.solarmetric.kodo.impl.jdbc.JDBCPersistenceManagerFactory;
  9.     
  10.     import javax.jdo.Extent;
  11.     import javax.jdo.PersistenceManager;
  12.     import javax.jdo.PersistenceManagerFactory;
  13.     import javax.jdo.Query;
  14.     import java.util.Collection;
  15.     import java.util.Iterator;
  16.     
  17.     public class ListAll {
  18.     
  19.         public static void main(String[] args) {
  20.     
  21.             // 廠商特定的工廠實現...
  22.             PersistenceManagerFactory managerFactory =
  23.                     new JDBCPersistenceManagerFactory();
  24.     
  25.             // 獲得一個 manager...
  26.             PersistenceManager manager =
  27.                     managerFactory.getPersistenceManager();
  28.     
  29.             Extent ext = manager.getExtent(Vehicle.classtrue);
  30.             Query query = manager.newQuery(Vehicle.class, ext, "");
  31.             Collection vehicles = (Collection) query.execute();
  32.             Iterator iterator = vehicles.iterator();
  33.             while (iterator.hasNext()) {
  34.                 Vehicle vehicle = (Vehicle) iterator.next();
  35.                 System.out.println("vehicle = " + vehicle);
  36.             }
  37.             manager.close();
  38.         }
  39.     }
  40.     

  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。 

  1.     /**
  2.      * ListFourCylinderVehicles
  3.      */
  4.     package com.ociweb.jdodemo;
  5.     
  6.     // 廠商實現的PersistenceManagerFactory
  7.     import com.solarmetric.kodo.impl.jdbc.JDBCPersistenceManagerFactory;
  8.     
  9.     import javax.jdo.Extent;
  10.     import javax.jdo.PersistenceManager;
  11.     import javax.jdo.PersistenceManagerFactory;
  12.     import javax.jdo.Query;
  13.     import java.util.Collection;
  14.     import java.util.Iterator;
  15.     
  16.     public class ListFourCylinderVehicles {
  17.     
  18.         public static void main(String[] args) {
  19.     
  20.            // 廠商特定的工廠實現...
  21.             PersistenceManagerFactory managerFactory =
  22.                     new JDBCPersistenceManagerFactory();
  23.     
  24.             // 獲得 a manager...
  25.             PersistenceManager manager =
  26.                     managerFactory.getPersistenceManager();
  27.     
  28.             Extent ext = manager.getExtent(MotorVehicle.classtrue);
  29.     
  30.             // 只返回有4個cylinders的 vehicles...
  31.             Query query = manager.newQuery(MotorVehicle.class, ext,
  32.                     "engine.numberOfCylinders == 4");
  33.     
  34.             Collection vehicles = (Collection) query.execute();
  35.             Iterator iterator = vehicles.iterator();
  36.             while (iterator.hasNext()) {
  37.                 Vehicle vehicle = (Vehicle) iterator.next();
  38.                 System.out.println("vehicle = " + vehicle);
  39.             }
  40.             manager.close();
  41.         }
  42.     }
  43.     

  ListFourCylinderVehicles 的輸出結果爲: 

[pre]    vehicle = MotorVehicle With 2 Wheels.  4 Cylinder Engine.
    vehicle = MotorVehicle With 4 Wheels.  4 Cylinder Engine.[/pre]
    

結論


JDO提供了一個數據庫表示,在面向對象方面它比JDBC有何多好處。具體的對象映射和數據庫廠商對於開發人員來講都是隱藏的(換句話說開發人員根本不用管)。存儲和查詢的數據庫操作非常簡單明瞭。開發人員寫的有關數據存儲的代碼非常少。有理由認爲JDO對於Java數據存儲是非常引人注目的技術。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章