DB4O学习笔记,结合一个小Demo(2)
本篇介绍DB4O的查询功能,DB4O最基本的查询方法是QBE,即query by example,请先查看第一篇博文创建好一个项目,然后部署好前面几个类,然后进行接下来的工作。
5. DBQuery.java
本例使用QBE查询方式:
package com.lsw.tool; import java.util.List; import com.db4o.Db4oEmbedded; import com.db4o.ObjectContainer; import com.db4o.ObjectSet; import com.lsw.bean.People; import com.lsw.util.Constants; public class DBQuery { /** * 检索全部结果 * * @param db */ public static void queryAll(ObjectContainer db) { People people = new People(); ObjectSet<?> result = db.queryByExample(people); listResult(result); } /** * 输出结果 * * @param result */ public static void listResult(List<?> result) { System.out.println("共检索结果数:" + result.size()); for (int i = 0; i < result.size(); i++) { System.out.println((People) result.get(i)); } } public static void main(String[] args) { ObjectContainer db = Db4oEmbedded.openFile(Constants.DB4O_FILENAME); ObjectSet<People> set = db.queryByExample(new People(1)); listResult(set); db.close(); } }
6.DBNQQuery.java
NQ(Native Query) 查询方式是最直观的一种查询方式了,这个示例中把他和另外一种查询方式(SODA)进行比较,说明NQ的强大和方便,SODA就是我们最常用的一种构造Query的方法,就是通过各种类进行构造(如Lucene采取的构造方法)。
package com.lsw.tool; import java.util.List; import com.db4o.Db4oEmbedded; import com.db4o.ObjectContainer; import com.db4o.ObjectSet; import com.db4o.query.Predicate; import com.db4o.query.Query; import com.lsw.bean.People; import com.lsw.util.Constants; public class DBNQQuery { /** * 使用SODA方式进行查询 * * @param db */ public static void testSODAQuery(ObjectContainer db) { Query query = db.query(); query.constrain(People.class); Query idQuery = query.descend("id"); query.descend("name").constrain("杜甫").or(idQuery.constrain(2).greater().and(idQuery.constrain(4).smaller())); ObjectSet<People> result = query.execute(); DBQuery.listResult(result); } /** * 使用NQ方式进行查询 * * @param db */ public static void testNQQuery(ObjectContainer db) { List<People> result = db.query(new Predicate<People>() { public boolean match(People people) { return people.getId() > 2 && people.getId() < 4 || people.getName().equals("杜甫"); } }); DBQuery.listResult(result); } /** * 使用NQ方式进行查询 * * @param db */ public static void testNQQuery2(ObjectContainer db) { final int[] points = { 1, 2, 5, 6 }; List<People> result = db.query(new Predicate<People>() { public boolean match(People people) { for (int point : points) { if (people.getId() == point) { return true; } } return people.getName().startsWith("王"); } }); DBQuery.listResult(result); } public static void main(String[] args) { ObjectContainer db = Db4oEmbedded.openFile(Constants.DB4O_FILENAME); // People p1 = new People(4, "王五", "上海"); // People p2 = new People(5, "杜甫", "苏州"); // People p3 = new People(6, "赵六", "南京"); // db.store(p1); // db.store(p2); // db.store(p3); System.out.println("数据库中的全部实例:"); DBQuery.queryAll(db); System.out.println("查询出来的实例:"); testNQQuery(db); db.close(); } }
我用的DB4O版本如下:db4o-8.0.249.16098-core-java5.jar
我用的是Eclipse,项目的目录层次如图:
完整的项目请到我的金山快盘进行下载:
http://www.kuaipan.cn/file/id_1605896862205516.htm
这里在给一个比较简单的DB4ODemo版本: