面向 Java 开发人员的 db4o 指南: 查询,更新和一致性
2010-04-01 00:00:00 来源:WEB开发网db4o 容器在这里并没有出现一致性问题,这是因为有问题的对象已经被标识为来自数据库的对象,即它的 OID 已经被存储在 db4o bookkeeping 基础设施中。相应地,当调用 set 时,db4o 将会更新现有的对象而不是插入新对象。
一种搜索实用方法
特定于应用程序主键的概念值得经常注意,即使它没有继承 QBE 的概念。您所需要的是使用一种实用方法简化基于标识的搜索。这一节将展示基于 Reflection API 用法的解决方案,我们会将正确的值放在正确的字段,此外,还介绍了针对不同选择和外观对解决方案进行调优的方法。
让我们从一个基本前提开始:我具有一个数据库,其中包含我希望根据一组具有特定值的字段查询的类型(Person)。在这种方法中,我对 Class 使用了 Reflection API,创建了该类型的新实例(调用其默认构造方法)。然后遍历具有这些字段的 String 数组,取回 Class 中的每个 Field 对象。随后,遍历对应于每个字段值的对象数组,然后调用 Field.set() 将该值放入我的模板对象中。
完成这些操作后,对 db4o 数据库调用 get() 并查看返回的 ObjectSet 是否包含任何对象。这给出了一个基本方法的大概轮廓,如清单 6 所示:
清单 6. 执行 QBE 一致性搜索的实用方法
import java.lang.reflect.*;
import com.db4o.*;
public class Util
{
public static boolean identitySearch(ObjectContainer db, Class type,
String[] fields, Object[] values)
throws InstantiationException, IllegalAccessException,
NoSuchFieldException
{
// Create an instance of our type
Object template = type.newInstance();
// Populate its fields with the passed-in template values
for (int i=0; i<fields.length; i++)
{
Field f = type.getDeclaredField(fields[i]);
if (f == null)
throw new IllegalArgumentException("Field " + fields[i] +
" not found on type " + type);
if (Modifier.isStatic(f.getModifiers()))
throw new IllegalArgumentException("Field " + fields[i] +
" is a static field and cannot be used in a QBE query");
f.setAccessible(true);
f.set(template, values[i]);
}
// Do the query
ObjectSet set = db.get(template);
if (set.hasNext())
return true;
else
return false;
}
}
更多精彩
赞助商链接