服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java 数据对象(jdo)介绍(四)


  kodo jdo 规范
  kodo jdo包含自己的类来创建数据库模型和增强类。
  
  模型生成工具被用于揣安数据库模型,这个模型将被用于存储jdo对象实例。工具正式支持的数据库包括:
  
  db2
  instantdb
  sqlserver
  mysql
  oracle
  postgresql
  其他数据库的jdbc驱动可以通过扩展代码被加入。详细内容参考kodo jdo的文档。
  
  模型创建工具要依赖于一个package.jdo文件,这个文件被用于定义jdo实例类的一些细节。下面的文件被用于这个例子。可以查看kodo jdo的文档来获得文件格式和概念的详细信息。
  
    
    
      
        
        
        
        
        
          
            
          

        

      

    
  
  
  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 输出内容:
  
  
    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.
  
  限制输出的结果为有四个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 的输出结果为:
  
  
    vehicle = motorvehicle with 2 wheels.
   4 cylinder engine.
    vehicle = motorvehicle with 4 wheels.
   4 cylinder engine.
  
  结论
  jdo提供了一个数据库表示,在面向对象方面它比jdbc有何多好处。具体的对象映射和数据库厂商对于开发人员来讲都是隐藏的(换句话说开发人员根本不用管)。存储和查询的数据库操作非常简单明了。开发人员写的有关数据存储的代码非常少。有理由认为jdo对于java数据存储是非常引人注目的技术。

扫描关注微信公众号