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数据存储是非常引人注目的技术。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值