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版本:

http://www.kuaipan.cn/file/id_1605896862205515.htm

posted @ 2012-12-08 18:32  天外的星星  阅读(487)  评论(0编辑  收藏  举报