站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题Java 数据对象(JDO)介绍(四)

Java 数据对象(JDO)介绍(四)

摘要: Java 数据对象(JDO)介绍(四)
内容: Kodo JDO 规范

Kodo JDO包含自己的类来创建数据库模型和增强类。

模型生成工具被用于揣安数据库模型,这个模型将被用于存储JDO对象实例。工具正式支持的数据库包括:

DB2
InstantDB
SQLServer
MySQL
Oracle
PostgreSQL
其他数据库的JDBC驱动可以通过扩展代码被加入。详细内容参考Kodo JDO的文档。

模型创建工具要依赖于一个package.jdo文件,这个文件被用于定义JDO实例类的一些细节。下面的文件被用于这个例子。可以查看Kodo JDO的文档来获得文件格式和概念的详细信息。


<?xml version="1.0"?>


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数据存储是非常引人注目的技术。


参考

JCP - http://www.jcp.org/
JDO - http://access1.sun.com/jdo/
JDO规范- http://www.jcp.org/jsr/detail/12.jsp
JSR - http://www.jcp.org/jsr/overview/index.jsp
JDBC - http://java.sun.com/products/jdbc/
JDO Central - http://www.jdocentral.com/
Poet FastObjects JDO - http://www.fastobjects.com/FO_Products_FastObjectsj1_Body.html
PrismTech OpenFusion JDO - http://www.prismtechnologies.com/English/Products/JDO/index.html
Signsoft IntelliBO JDO - http://www.signsoft.com/en/intellibo/jdo.jsp
SolarMetric Kodo JDO - http://www.solarmetric.com/Software/Kodo_JDO/

from javaresearch Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd, scwcd Kodo JD
↑返回目录
前一篇: Java 数据对象(JDO)介绍(三)
后一篇: Java 数据对象(JDO)介绍(一)