db4o 库是最近才出现在 OODBMS 领域的,它使 “纯对象存储” 的概念在新一代对象开发人员中重获新生。(他们笑称,现在不是很流行怀旧么。)为了让您对如何使用 db4o 有一个概念,特给出如下代表单个人的一个基本类:
注意:如果还尚未下载,请现在就 下载 db4o。为了更好地进行讨论(或至少编译代码),db4o 是必需的,本系列的后续文章也会用到它。
清单 1. Person 类package com.tedneward.model; public class Person { public Person() { } public Person(String firstName, String lastName, int age) { this.firstName = firstName; this.lastName = lastName; this.age = age; } public String getFirstName() { return firstName; } public void setFirstName(String value) { firstName = value; } public String getLastName() { return lastName; } public void setLastName(String value) { lastName = value; } public int getAge() { return age; } public void setAge(int value) { age = value; } public String toString() { return "[Person: " + "firstName = " + firstName + " " + "lastName = " + lastName + " " + "age = " + age + "]"; } public boolean equals(Object rhs) { if (rhs == this) return true; if (!(rhs instanceof Person)) return false; Person other = (Person)rhs; return (this.firstName.equals(other.firstName) && this.lastName.equals(other.lastName) && this.age == other.age); } private String firstName; private String lastName; private int age; }
在众多的类中,Person 类显得极为寻常;还很简单。但若深入探究,就不难看出这个类会呈现出非常类似于对象的有趣属性和功能,例如它可以有配偶类,也可以有子类,等等。(我在后续的专栏中会历数这些属性和功能;现在,我只侧重于进行概括介绍。)
在基于 Hibernate 的系统中,将这个 Person 类的一个实例放入,需要如下几个步骤:
上述操作在 db4o 中出奇地简单,如清单 2 所示:
清单 2. 在 db4o 内运行 INSERTimport com.db4o.*; import com.tedneward.model.*; public class Hellodb4o { public static void main(String[] args) throws Exception { ObjectContainer db = null; try { db = db4o.openFile("persons.data"); Person brian = new Person("Brian", "Goetz", 39); db.set(brian); db.commit(); } finally { if (db != null) db.close(); } } }
这样就行了。无需生成模式文件,无需创建映射配置,需要做的只是运行客户机程序,当运行结束时,为存储在 persons.data 中的新 “” 检查本地目录。
检索所存储的 Person 在某些方面非常类似于某些对象关系型映射库的操作方式,原因是对象检索最简单的形式就是按例查询(query-by-example)。只需为 db4o 提供相同类型的一个原型对象,该对象的字段设置为想要按其查询的值,这样一来,就会返回匹配该条件的一组对象,如清单 3 所示:
清单 3. 在 db4o 内运行 INSERT(版本 1)import com.db4o.*; import com.tedneward.model.*; public class Hellodb4o { public static void main(String[] args) throws Exception { ObjectContainer db = null; try { db = db4o.openFile("persons.data"); Person brian = new Person("Brian", "Goetz", 39); Person jason = new Person("Jason", "Hunter", 35); Person clinton = new Person("Brian", "Sletten", 38); Person david = new Person("David", "Geary", 55); Person glenn = new Person("Glenn", "Vanderberg", 40); Person neal = new Person("Neal", "Ford", 39); db.set(brian); db.set(jason); db.set(clinton); db.set(david); db.set(glenn); db.set(neal); db.commit(); // Find all the Brians ObjectSet brians = db.get(new Person("Brian", null, 0)); while (brians.hasNext()) System.out.println(brians.next()); } finally { if (db != null) db.close(); } } }
运行上述代码,会看到检索出两个对象。
在您将我定义为狂热的推崇者之前,请允许我先列举几条反对 db4o 的言论。
db4o 几乎无法对应于现有的 Oracle、SQLServer 或 DB2!完全正确。相比之下,db4o 更适合于 MySQL 或 HSQL,这使其对于大量项目来说已经足够。更为重要的是,开销一直是 db4o 开发人员特别关注的事情,这又让它特别适于小型的嵌入式环境。(我这里给出的示例只是一个简单的演示,和其他任何小型的演示一样,请务必清楚一点,即姑且不论它相比其他工具具有多少潜力,db4o 都会比您在这里所看到的要强大许多。)我不能用 JDBC 在 db4o 上进行查询!确实如此,尽管 db4o 团队曾想过创建 JDBC 驱动程序以让对象能接受 SQL 语法,即一种所谓的 “关系对象映射”。(开发团队之所以没有这么做,据说是因为没有这个必要,而且性能会因此大受影响。)问题的关键是,您在实现中使用的是对象(POJO),除此之外别无他物。若不存储关系,为何还要使用 SQL 呢?但是我的其他程序如何获得数据呢?这要看具体情况。如果您这里所谓的 “其他程序” 指的是其他 Java 代码,那么只需在这些程序内使用 Person 类的定义并将其传递进 ObjectContainer,正如我这里所做的一样。在 OODBMS 内,类定义本身就充当模式,所以无需其他的工具来获取 Person 对象。但是如果您这里所谓的 “其他程序” 指的是其他语言的代码,那么问题就会复杂一些。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shenmilingyu/article-6299-2.html
越南就是这种人
唯一错的是这个社会已经形成的这个风气
再一个咱们国家的大型舰艇应该继续建造