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数据存储是非常引人注目的技术。
闽公网安备 35060202000074号