Simple Persistence for Javaを使ってみた

マイコミジャーナルでも紹介されている"Simple Persistence for Java"を使ってみた。

「Simple Persistence for Javahttp://netmind.hu/persistence/index.php
ちなみに、通称、BeanKeeperと呼ばれているようだ。

設定ファイルが不要で、テーブルの事前準備も不要(利用時にテーブルがなければ、勝手に作成される)。

<手順>
1. 以下から、2007/05/06時点での最新版beankeeper-2.3.0.tar.gzをダウンロードする。
http://netmind.hu/persistence/download.php

解凍して出来た以下のjarファイルにクラスパスを通す

・beeankeeper-2.3.0.jar
・lib/runtime/java-cup-11-runtime.jar
・lib/runtime/log4j-1.2.8.jar

2. 今回は、データベースとしてhsqldb(1.8.0.7)を使う。
http://hsqldb.org/
ダウンロードしたhsqldb_1_8_0_7.zipを解凍して、その中にあるhsqldb/demo/runServer.batをダブルクリックして、サーバモードで起動しておく。また、hsqldb.jarにもクラスパスを通しておく。

3.永続化対象のBeanの準備

sample.Customer

package sample;
public class Customer{
    
    private int id = 0;
    private String name = null;
    private String email = null;
    
    public Customer(){
        super();
    }
    
    public Customer(int id ,String name ,String email){
        super();
        this.id = id;
        this.name = name;
        this.email = email;
    }
    
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public String toString(){
        return  "Customer [id=" + id + ", name=" + name + ", email=" + email +"]";
    }
}

4. "Simple Persistence for Java" を使うソースを作成

sample.BeanKeeperTest

package sample;
import hu.netmind.persistence.Store;
import java.util.Iterator;
import java.util.List;
public class BeanKeeperTest {

    private Store store = null;

    public static void main(String[] args) {

        BeanKeeperTest keeper = new BeanKeeperTest();
        
        //初期処理
        keeper.init();
        
        //一旦、全データを削除
        keeper.deleteAll();
        
        //追加してみる
        keeper.save(new Customer(1,"山田太郎","taro@test"));
        keeper.save(new Customer(2,"山田次郎","jiro@test"));
        keeper.save(new Customer(3,"山田三郎","saburo@test"));
        keeper.output();//内容をコンソールに出力
        
        //山田太郎のメールアドレスを変更する
        Customer customer = keeper.find(1);//id=1で検索し、Customerオブジェクトを取得
        customer.setEmail("yamada_taro@test");//取得したCustomerオブジェクトのメールアドレスを変更
        keeper.save(customer);//保存
        keeper.output();//内容をコンソールに出力
        
        //終了処理
        keeper.destroy();
    }
    
    private void output(){
        List customers = findAll();
        System.out.println("----------------------");
        for (Iterator i = customers.iterator(); i.hasNext();) {
            Customer customer = (Customer) i.next();
            System.out.println(customer);
        }
    }

    private void init(){
        //Storeインスタンスの生成。全ての操作はこのStoreクラスを経由して行う
        store = new Store("org.hsqldb.jdbcDriver","jdbc:hsqldb:hsql://localhost");
    }

    private void destroy(){
        store.close();
    }

    private void save(Customer customer){
        store.save(customer);
    }
    
    private List findAll(){
        //id順で、Customerを全件取得
        return store.find("find Customer order by id");
    }
    
    private void deleteAll(){
        List customers =  store.find("find Customer");
        if(customers!=null){
            for (Iterator i = customers.iterator(); i.hasNext();) {
                Object customer = i.next();
                store.remove(customer);
            }
        }
    }
    
    private Customer find(int id){
        //findSingleの場合は結果を1件のみ返します
        //引数には、「find + クラス名 + 検索条件」の文字列を渡します
        return (Customer) store.findSingle("find Customer where id =" + id );     }
}


5. BeanKeeperTestの実行結果
コンソールの内容

 −−−−−−−−−−−−−−−−−−
 Customer [id=1, name=山田太郎, email=taro@test]
 Customer [id=2, name=山田次郎, email=jiro@test]
 Customer [id=3, name=山田三郎, email=saburo@test]
 −−−−−−−−−−−−−−−−−−
 Customer [id=1, name=山田太郎, email=yamada_taro@test]
 Customer [id=2, name=山田次郎, email=jiro@test]
 Customer [id=3, name=山田三郎, email=saburo@test]

作成されたテーブル

 CLASSES
 CUSTOMER
 IDS
 NODES
 TABLEMAP

<感想>
作成されるテーブルの形式が独特なので、既にテーブルが存在するシステムへの適用は難しそう。でも、ちょっとした自作アプリとかには有用だと思う。O/Rマッピングライブラリというよりは、オブジェクト永続化ライブラリと考えた方がイメージがわきやすいかも...。
以下の画像は、EclipseのDBViewerプラグインで、hsqldbのテーブル一覧を表示させたところ。