关于开源世界里的面向对象数据库db4o(2)
作者:佚名; 更新时间:2014-12-05

  
  5 加载对象
  
  db4o提供了三种不同的查询数据的方法,(1)QBE:通过实例查询;(2)NQ:db4o原生/本地化查询;(3)SODA:一种通过数据库持久层进行的查询,查询语句被定义在字符串中,并通过持久引擎进行解释执行。其中NQ 是db4o 推荐使用的查询方式。这是因为NQ 方式提供了非常强大的查询功能,支持原生语言,也就意味着你可以使用 Java, .net 来判断该对象是否符合条件,这是其他数据库查询语言无法比拟的。在某些情况下, db4o 核心会将 NQ 翻译成 SODA 以获得更高的性能。
  这下面分别详细介绍一下这三种查询语言。
  5.1 QBE查询
  当使用QBE进行查询时,我们需要为希望加载的数据而创建一个对象原型(prototypical ),db4o将会加载所有与原型相同类型(各成员字段不为默认值)的对象,返回的结果将会存储在ObjectSet对象实例中。
  这如果想要从数据库中加载所有的学生对象,我们要提供了一个初始值为空的Student原型对象。原型对象中车手的积分为0,这是因为对于int型字段的默认值为0。
  Student stu = new Student (null, 0);
  ObjectSet result = db.Get(stu);
  foreach (object item in result)
  { Console.WriteLine("Student {0}", stu.Tostring()); }
  如果我们想要从数据库中加载特定的学生对象,只需要相应提供给数据库你所需要的信息即可。比如想得到姓名为“Liming”,学分值是80的学生对象:
  Student stu = new Student ("Liming", 80);
  ObjectSet result = db.Get(stu);
  foreach (object item in result)
  { Console.WriteLine("Student {0}", stu.Tostring()); }
  通过上面的例子我们不难看出,使用QBE方式进行查询存在着如下几个局限点:
  1)db4o需要反射你提供模板对象的所有成员数据;
  2)不能使用高级查询表达式,如AND、OR、NOT等;
  3)对于数据不能使用强制条件,如int的0,string的空字串或空引用类型,因为它们在查询时都解释为非强制关系;
  需要为类提供非初始化成员数据的构造函数,这意味着在定义数据成员时不能对其进行初始化。
  所以,我们推荐的是另一种查询方式 NQ。
  5.2 NQ查询
  使用NQ为你的查询提供了开发语言内置的支持能力,提供类型安全机制、编译时检查及反射功能,使用面向对象的方法调用来完成查询。NQ是db4o数据库查询的主要接口也是开发者极力推荐的数据查询方式,因为NQ充分运用了开发语言的语义完整性,将会成为将来完美而安全的选择。
  这也有人说使用NQ查询就是用你熟悉的编程语言进行数据库查询。所以这样写出的查询代码将是 100% 的类型安全、100% 的编译时检查以及 100% 的可重构。
  下面我们看看在C#语言中NQ是如何进行使用的。
  C# .NET 2.0
  Ilist stu = db.Query (delegate(Student stu){
  return Stu.points = 80;});
  C# .NET 1.1
  IList list = db.query(new StudentPoints ());
  public class StudentPoints: Predicate {
  { public boolean match(Student stu)
  { return stu.Points = 80;} };
  for(int x = 0; x < list.size(); x++)
  { Console.Writeline(list.get(x)); }
  从上述代码中可以看出,对于不支持泛型的语言来说,都需要提供一个扩展com.db4o.Predicate的类,并提供一个参数为待查询的类,并返回布尔值的函数#.Match()或#.match(),其函数签名为:
  bool Match(Pilot candidate);
  可以看到,在进行 NQ 查询时并没有加入任何条件(无条件返回 true),那么这么做是不是相当于遍历了整个数据库?db4o 的设计者早就想到了这个问题,当 db.query() 执行完毕返回 list 实例的时候,db4o 只是与数据库同步取出内部的 IDs 而已,并没有把所有的 Student对象全部取出,只有在list.get(x) 之后才会去根据 IDs 取出记录。所以我们不必担心性能方面的问题。
  5.3 SODA查询
  SODA是db4o提供的底层查询接口,允许开发人员直接操作查询表达式树中的节点,它采用字符串标识对象数据成员,但是这种方式既不是类型安全也不在编译时进行检查并且写起来十分冗长。
  比如我们想查找成绩在80到90分之间,或者姓名为“Liming”的对象。用NQ查询代码如下:
  IList result = db.Query< Student > (delegate(Student stu) {
  return stu.Points > 80
  && stu.Points < 90
  || stu.Name == "Liming"; });
  而用SODA写起来则较麻烦一些:
  Query query=db.Query();
  query.Constrain(typeof(Student));
  Query pointQuery=query.Descend("_points");
  query.Descend("_name").Constrain("Liming")
  .Or(pointQuery.Constrain(80).Greater()
  .And(pointQuery.Constrain(90).Smaller()));
  ObjectSet result=query.Execute();
核心期刊快速发表
Copyright@2000-2030 论文期刊网 Corporation All Rights Reserved.
《中华人民共和国信息产业部》备案号:ICP备07016076号;《公安部》备案号:33010402003207
本网站专业、正规提供职称论文发表和写作指导服务,并收录了海量免费论文和数百个经国家新闻出版总署审批过的具有国内统一CN刊号与国际标准ISSN刊号的合作期刊,供诸位正确选择和阅读参考,免费论文版权归原作者所有,谨防侵权。联系邮箱:256081@163.com