オブジェクト指向データベース db4Object を試す 〜その1〜


db4Object

db4Object はオープンソースのOODBMSでGPLライセンスで利用可能です。本家は以下となります。
http://www.db4o.com/

環境設定

現在は Production Release がバージョン7.12となっており、β版としてバージョン 8.0 があります。ここではバージョン 8.0 を利用します。Production Release についてはユーザ登録なしでダウンロード可能ですが、開発版についてはユーザ登録(メールアドレスのみ)が必要となります。今回は db4o for Java, version 8.0.160.14822 を選びました。
ダウンロードした db4o-8.0-java.zip を解凍し、lib フォルダ中の db4o-8.0.160.14822-all-java5.jar をクラスパスに加えるだけです。

永続化するオブジェクト

永続化するオブジェクトとして以下を用意します(commons.lang 使ってます)。

public class Book {
    private String title;
    private Author author;
    private int price;

    public Book(String title, Author author, int price) {
        this.title = title;
        this.author = author;
        this.price = price;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
    ・・以下 getter/setter
public class Author {
    private String firstName;
    private String lastName;

    public Author(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this);
    }
    ・・以下 getter/setter

db4Object の利用

今回は組み込みモードで利用します。まずは ObjectContainer を作成します。

ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "databaseFile.db4o");

基本的には作成した ObjectContainer に対してstore()、queryXX()、delete()を利用するだけです。

public static void main(String[] args) throws Exception {
    new File("databaseFile.db4o").delete();
    ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "databaseFile.db4o");
    try {
        execute(db);
    } finally {
        db.close();
    }
}
private static void execute(ObjectContainer db) {
    Author author = new Author("Brian", "Kernighan");
    Book book = new Book("The C Programming Language", author, 1000);
    db.store(book);
    
    List<Book> result = db.query(Book.class);
    for (Book b : result) {
        System.out.println("-----");
        System.out.println(b);
        System.out.println(b.getAuthor());
    }
}

実行結果

実行結果は以下のようになります。

-----
etc9.domain.Book@1c282a1[title=The C Programming Language,author=etc9.domain.Author@10f6d3[firstName=Brian,lastName=Kernighan],price=1000]
etc9.domain.Author@10f6d3[firstName=Brian,lastName=Kernighan]

クエリ

前述の例では以下のクエリによりBookオブジェクトをすべて取得しています。

List<Book> result = db.query(Book.class);


条件を指定したオブジェクトの検索は以下のように検索条件としたい項目だけを指定したオブジェクトを使います。

Book query = new Book(null, null, 1000);
List<Book> result = db.queryByExample(query);

上記例では価格が1000のものを条件にオブジェクトを取得しています。


以下のようにすると全件検索となります(intのデフォルト値としてゼロを指定しているため)。

Book query = new Book(null, null, 0);
List<Book> result = db.queryByExample(query);

deleteとupdate

オブジェクトの削除は、検索結果のbookオブジェクトに対して以下のように delete() するだけです。

db.delete(book);


update も同様に、検索結果のbookオブジェクトを更新して store() するだけです。

Book book = db.query(Book.class).get(0);
book.setPrice(1500);
db.store(book);


次回オブジェクト指向データベース db4Object を試す 〜その2〜 - etc9に続く。。