一、SODA查询方式的优势
1、底层——db4o查询对象数据查询时使用的查询方式。
2、最终——QBE、NQ查询最终都要转化为SODA查询执行。
3、代码优美,让人感觉思路比较清晰、易读。
4、动态查询,其他查询方式不能完成的任务。
5、在java和.net中书写方式相同。
二、SODA查询方式的劣势
1、既非类型安全也不是运行时检错。
2、较其他查询方式代码量稍多。
三、体验一下SODA(苏打)的魅力
1、代码优美、容易读懂
// *将Pilot类在数据库中的实例全部查询出来 // 定义一个查询器,通过数据库执行query()方法得到,container是数据库连接 final Query query = container.query(); // 给查询器定义一个查询范围,类的名称 query.constrain(Pilot.class); // ………这里还有故事……… // 查询器执行查询操作,返回一个ObjectSet实例 ObjectSet result = query.execute();
2、查询条件扩展简单
//在上一个查询方法中添加查询条件,就可以完成扩展 //定义查询“字段”和查询“条件” query.descend("name").constrain("John");
3、查询逻辑扩展简单,只需要认识几个单词就行
*估计这些限制查询条件和逻辑的方法都采用了“装饰器模式”编写(同类型引用,同类型继承)
//查询条件涉及的方法equals(),contains(),like(),or(),and(),not() query.descend("name").constrain("oh").contains() // Or like, which is like .contains(), but case insensitive .or(query.descend("name").constrain("AnN").like()) // The .endsWith and .startWith constrains are also there, // the true for case-sensitive, false for case-insensitive .or(query.descend("name").constrain("NY").endsWith(false));
4、级联(嵌套)查询,关系数据库查询的常见操作
//*在类设计的时候存在一对多、多对多等关系因而存在级联查询 Query query = container.query(); //对Car类进行查询 query.constrain(Car.class); //对Car类中的pilot字段查询 //pilot字段属于Pilot类 //对Pilot类的name字段查询 query.descend("pilot").descend("name").constrain("John"); ObjectSet<Object> result = query.execute();
四、小品SODA(苏打)
SODA查询方式底层特性在上面的代码例子中已经完全表现了出来。在面向对象数据库中一个类是通过“字段”来存储的,而SODA通过“字段”来查询数据,因而不是类型安全的。这种查询方式有点像关系数据库通过字段来查询数据。NQ查询是通过类的方法来实现的。
对象数据库存储的是“类的实例”,类字段类型可能是
1、基本数据类型(数字、字符)
2、引用类型(类、集合)
针对类型丰富的字段SODA基本以不变应万变的方式来工作。对于引用类型
//对字段查询,字段本身是一个类的实例FieldClass
//对这个类的字段,目标搜索结束
//设置查询条件
query.descend("fieldClass").descend("field").constrain("queryString");
SODA的高级查询方式叫做SODA Evaluations ,作用:db4o的关键字constrain与SQL语言中的关键字IN相似可以接受一个“条件集合”。与IN不同的是constrain方法内部必须是个类的实例。而这个类必须实现Evaluation接口,重写evaluate(Candidate candidate) 方法。
db4o SODA Evaluations Reference (java) 帮助的参考
SODA的排序有升序(orderAscending())、降序(orderDescending())放在descend()之后就可以了。自定义排序方法异常复杂,先不学了。