本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。プロフィールで選択した情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Simple Persistence for Java を使用した、構成不要なオブジェクト・パーシスタンス

難しい設定などが一切ない、Java アプリケーションのオブジェクト・パーシスタンス

Sami Salkosuo (sami.salkosuo@fi.ibm.com), Software Architect, IBM 
Sami Salkosuo は、1999 年から IBM に勤めています。主な関心分野は Java プログラミングで、Sun Certified Java Programmer、IBM Certified Solution Developer for XML and Related Technologies、および IBM Certified Solution Developer for IBM WebSphere Portal です。Java テクノロジーの他に、Python、Fortran、LabVIEW、Visual Basic、LISP、Perl、および PHP の経験もあります。

概要: Simple Persistence for Java は、オープン・ソースのオブジェクト・リレーショナル・パーシスタンス・ライブラリーです。このライブラリーでは、カスタムの問い合わせ言語と組み込みデータベースのサポートにより、Java アプリケーションでのオブジェクト・パーシスタンスが単純化されます。この記事では、ソフトウェア・アーキテクト Sami Salkosuo がこのライブラリーを紹介し、管理も構成も不要な、オブジェクト・パーシスタンスへのアプローチを説明します。

日付:  2007年 2月 13日
レベル:  初級 この記事の原文:  英語
アクティビティー: 2216 ビュー
お気軽にご意見・ご感想をお寄せください: 


オブジェクト・パーシスタンスは、デスクトップからエンタープライズにいたるまで、ほとんどすべての Java™ アプリケーションで必須です。パーシスタンスの弱点は、とりわけ単純ではなかったことでした。しかし、この弱点も、最新版の Simple Persistence for Java (オブジェクト・リレーショナル・パーシスタンスのオープン・ソース・ライブラリー) を使用することで克服されました。

Simple Persistence for Java version 2.1.0 からは、HSQLDB (100% Pure Java データベース) のサポートが追加されました。アプリケーション・ユーザーは、Simple Persistence for Java と HSQLDB のいずれにおいても管理や構成を行う必要がなく、これらのツールを一緒に使用すれば、非常にわずかな作業でパーシスタンスをアプリケーションに導入できます。

この記事では、Simple Persistence for Java v2.1.0 を紹介します。さらに、Simple Persistence for Java v2.1.0 により、ほとんど手間の掛からないオブジェクト・パーシスタンスを Java アプリケーションで実現する方法を説明します。

Simple Persistence for Java

Simple Persistence for Java は、LGPL の下で使用許諾されるオープン・ソースのライブラリーです。Simple Persistence for Java は、ハンガリーの会社 NetMind Consulting によって社内で開発され、オープン・ソース・コミュニティーに公開されています。

Java 開発者は、多くのオブジェクト・リレーショナル・ライブラリーを入手できます。構成を行わずに使用できるという点で、Simple Persistence for Java は他のライブラリーと異なります。このライブラリーの主な設計理念の 1 つに、構成ファイル不要、XML マッピング・ファイル不要、構成すべきプロパティー不要というものがあります。(当然のことながら、適切なデータベースは必要です。)

Simple Persistence for Java ライブラリーには、次の重要機能も備わっています。

  • 小さいサイズ (135KB)
  • 単純な API
  • 複数のデータベースのサポート
  • 単純な問い合わせ言語
  • ポリモーフィズム
  • 単純な結果リスト

Simple Persistence for Java バージョン 2.1.0 のライブラリーには、HSQLDB データベースのサポートが追加されました。HSQLDB は、BSD 形式のライセンスで使用が許諾されているオープン・ソースで、軽量な Pure Java の SQL データベース・エンジンです。HSQLDB では、機能豊富な ANSI-92 SQL のサブセットや、SQL 99 および SQL 2003 の拡張機能がサポートされています。また、HSQLDB では、メモリー・ベースおよびディスク・ベースのテーブルが提供され、組み込みモードやサーバー操作モードがサポートされています。


StockData アプリケーション

Simple Persistence for Java ライブラリーと HSQLDB を使用することでオブジェクト・パーシスタンスをどれほど単純にすることができるのかを、サンプル・プログラム StockData を使って示します。StockData では、在庫履歴データがユーザーからのクエリーに基づいて (CSV ファイルで) フィルタリングされます。このプログラムは組み込みデータベースと連携して動作します。このプログラムは、コマンド・ラインから実行します。

話を理解するために、私が開発した環境を再現し、同じアプリケーションを自分でセットアップしてもらうとよいかもしれません。StockData の開発環境は Eclipse 3.2.1 で、JDK 1.5.0 以上の Java が必要です。私の環境では、メモリー・ベースのデータベース・オプションを使用して、組み込みモードで HSQLDB データベースを起動しました。ディスク・ベースの組み込みデータベースやサーバー・サイドのデータベースを選択することもできたのですが、デモンストレーションのために、メモリー・ベースの HSQLDB データベースを使用しました。

StockData サンプル・プログラムを実行するには、次のライブラリーが必要です。

  • commons-io-1.2.jar
  • commons-logging-api.jar
  • commons-logging.jar
  • hsqldb.jar
  • java-cup-11-runtime.jar
  • log4j-1.2.8.jar
  • netmind-persistence-2.1.0.jar

StockData プログラムでは、commons-io パッケージと commons-logging パッケージが使用されます。HQSLSB は、いずれの jar にも依存しません。netmind-persistence-2.1.0.jar は、java-cup-11-runtime.jar と log4j-1.2.8.jar に依存します。

サンプル・ソース・コード

リスト 1 に、StockData プログラムのソース・コードを示します。


リスト 1. StockData
                
public class StockData
{
  private static Log log;
  public static void main(String[] args)
  {
    System.setProperty("log4j.configuration", "file:log4j.properties");
    log = LogFactory.getLog(StockData.class);
    try
    {
      String symbol = args[0];
      String csvFile = args[1];
      String query = args[2];
      // open store, uses HSQLDB driver and memory only database
      Store store = new Store("org.hsqldb.jdbcDriver","jdbc:hsqldb:mem:stockdata");
      // read csv and generate beans
      List historicalData = FileUtils.readLines(new File(csvFile), "UTF-8");
      // remove first line (header)
      historicalData.remove(0);
      // store beans to database
      for (Object _data : historicalData)
      {
        String[] data = ((String) _data).split(",");
        StockBean bean = new StockBean(symbol, data[0],
            Double.parseDouble(data[4]), Double.parseDouble(data[5]));
        //save stock bean to database
        store.save(bean);
      }
      // find beans that match query
      List results=store.find(query);
      // print beans that matched
      System.out.println("Total results: "+results.size());
      for (Object object : results)
      {
        StockBean bean=(StockBean)object;
        System.out.println(bean.toString());
      }
    }
    catch (Exception e)
    {
      log.error(e.getMessage(), e);
      System.out
          .println("Usage: java sample.StockData " +
              "<symbol name> <historical prices file> <query>");
    }
  }
}

StockData アプリケーションでは、Apache Commons IO パッケージによって CSV ファイルが List に読み込まれます。次に、for ループで、テキスト行が解析され、StockBean オブジェクトが作成されます。StockBean オブジェクトは、データベースに保管されます。以下に、CSV ファイルのフォーマットを示します。

Date,Open,High,Low,Close,Volume,Adj. Close*
29-Dec-06,97.00,97.88,96.83,97.15,4455900,97.15
28-Dec-06,97.11,97.40,96.87,96.97,4501700,96.97
27-Dec-06,96.30,97.23,96.27,97.20,4571600,97.20

サンプル CSV ファイルは、 ダウンロード可能なデモンストレーション・パッケージに含まれています。

すべてのオブジェクトがデータベースに保管された後、単純な find クエリー (コマンド・ラインで指定) が実行され、一致した結果の List が返されます。結果は、System.out に出力されます。Simple Persistence for Java には、LazyList が実装されています。LazyList では、要求に応じてオブジェクトが取得されます。これにより、何千ものオブジェクトをメモリーに保管せずにすみます。

StockBean オブジェクト

リスト 2 に、StockBean Java オブジェクトのソース・コードを示します。このオブジェクトは、情報を StockData に保管するために使用されます。StockBean には、symbolName、date、price、および volume という 4 つのフィールドがあります。


リスト 2. StockBean オブジェクト
                
public class StockBean
{
  private String symbolName = "";
  private String date = null;
  private double price = 0.0;
  private double volume = 0.0;
  public StockBean()
  {
    // no-argument constructor required by Simple Persistence
  }
  public String toString()
  {
    StringBuffer sb=new StringBuffer();
    sb.append(symbolName);
    sb.append(',');
    sb.append(date);
    sb.append(',');
    sb.append(price);
    sb.append(',');
    sb.append(volume);
    return sb.toString();
  }
  public StockBean(String symbolName, String date, double price, double volume)
  {
    this.symbolName = symbolName;
    this.date = date;
    this.price = price;
    this.volume = volume;
  }
  public String getDate()
  {
    return date;
  }
  public void setDate(String date)
  {
    this.date = date;
  }
  public double getPrice()
  {
    return price;
  }
  public void setPrice(double price)
  {
    this.price = price;
  }
  public String getSymbolName()
  {
    return symbolName;
  }
  public void setSymbolName(String symbolName)
  {
    this.symbolName = symbolName;
  }
  public double getVolume()
  {
    return volume;
  }
  public void setVolume(double volume)
  {
    this.volume = volume;
  }
}


単純化の要素

リスト 1 の StockData のソースにあるとおり、Simple Persistence for Java により、オブジェクト・リレーショナル・パーシスタンスは確かに単純化されます。基本的に、パーシスタンスを Java アプリケーションに追加したり、オブジェクトを HSQLDB から取得したりするには、3 行のコードがあれば十分です。

  • Store オブジェクト・コンストラクター
  • オブジェクトをデータベースに保管する save() メソッド
  • オブジェクトの取得に使用される 1 つ以上の find() メソッド

このコンストラクターは、かなり単純です。次のように、最初の引き数として JDBC ドライバーを指定し、2 番目の引き数として JDBC URL を指定するだけです。

Store store = new Store("org.hsqldb.jdbcDriver","jdbc:hsqldb:mem:stockdata");

Store オブジェクトは、後でオブジェクトの保管と取得に使用されます。

オブジェクトをデータベースに保管する作業も次のように簡単に行うことができます。

StockBean bean = new StockBean(symbol, date, price, volume);store.save(bean);

save() を呼び出すだけで、オブジェクトがデータベースに保管され、必要に応じてテーブルが自動的に作成されます。

オブジェクトの取得に使用する問い合わせ言語でオブジェクトを検出する作業も、次のように非常に簡単に行うことができます。

List results=store.find(query);

find() メソッドには、以下の 4 つがあります。

  • find(String statement)
  • find(String statement, Object[] parameters)
  • findSingle(String statement)
  • findSingle(String statement, Object[] parameters)

パラメーター付きの find() メソッドは、SQL で実行されているかのように動作し、"?" はパラメーター・オブジェクトのプレースホルダーです。findSingle() メソッドは、その名のとおりの機能です。


カスタムの問い合わせ言語

これまでに気づいたかもしれませんが、Simple Persistence for Java では、オブジェクトの検索にカスタムの問い合わせ言語が使用されています。クエリーの構文はオブジェクト指向になっていて、テーブルや索引といった通常のリレーショナル・データベースの概念がありません。例えば、次のクエリーでは、List 内のすべての StockBean オブジェクトが返されます。

find stockbean

結果の List は単純であるため、アプリケーション・パフォーマンスまたはメモリー使用量に影響を与えることなく、非常に多くのオブジェクトを照会できます。そのため、例えば、getSize() メソッドでは、実際のオブジェクトが要求に応じて取得される場合でも、合計結果数が戻されます。

クエリーの構文

Simple Persistence for Java のクエリーは "find" で始まります。2 番目の要素は取得したいクラスの名前です。名前が同じでパッケージが異なるクラスが複数ある場合のみ、完全修飾クラス名が必要です。

where 節は SQL の場合と良く似ています。"or"、"and"、"not"、"<"、">"、"="、"like" などの一般的な演算子もサポートされています。

次のクエリーでは、90 米ドルから 92.5 米ドルまでの値を持つすべての StockBean オブジェクトが返されます。

find stockbean where price>90 and price<'92.5' and symbolname='IBM'

整数値の場合は引用符を付けなくてもかまいませんが、倍精度やストリングの値の場合は引用符が必要です。

また、SQL の場合と同様に "order by" 構文を使用すれば、結果を並べ替えることもできます。例えば、次のコマンドを実行すると、降順の価格で結果が並び替えられます。

find stockbean where price>90 and price<'92.5' and symbolname='IBM' order by price desc


サンプルを実行する

StockData プログラムでは、CSV ファイル内の在庫データが検索されます。ダウンロード可能なパッケージには、コンパイルするためのソースと、バッチ・ファイル stockdata.bat が含まれています。プログラムの構文は stockdata.bat <symbol name> <csv file name> <find query> です。この構文を使用して、ユーザー自らサンプル・アプリケーションを照会できます。

次のコマンドを発行したとします。

stockdata.bat IBM ibm_2006.csv "find stockbean where price>90 and price<'92.5' and symbolname='IBM'"

その結果は、図 1 のようになります。


図 1. StockData アプリケーションの照会結果
図 1. StockData アプリケーションの照会結果

追加機能

StockData アプリケーションでは、Simple Persistence for Java の基本機能がデモンストレーションされます。さらに、ライブラリーには、StockData では表されない、より高度な機能がいくつか備わっています。その中には、ポリモーフィズムとユーザー管理トランザクションが含まれます。

ポリモーフィズム

Simple Persistence for Java では、データベースに保管する JavaBean をクラスから拡張できます。例えば、次のようになります。

public class StockBeanExt extends StockBean
{
  private int totalTrades=0;
  public StockBeanExt()
  {
    // no-argument constructor required by Simple Persistence
  }
  public int getTotalTrades()
  {
    return totalTrades;
  }
  public void setTotalTrades(int totalTrades)
  {
    this.totalTrades=totalTrades;
  }
}

StockBean オブジェクトと StockBeanExt オブジェクトを保管した後に、StockBean クラスのフィールドを対象とするクエリーを実行すれば、StockBean オブジェクトと StockBeanExt オブジェクトの両方が返されます。

ユーザー管理トランザクション

Simple Persistence for Java ライブラリーでは、ユーザー管理のトランザクションもサポートされています。これにより、トランザクションを開始したりコミットしたりするタイミングを指定できます。サンプル・トランザクションを次に示します。

Transaction tx = tt.getTransaction(TransactionTracker.TX_REQUIRED);
tx.begin();
try
{
   ...operations...
} catch ( ... ) {
   ... handling code...
   tx.markRollbackOnly();
} finally {
   tx.commit();
}

finally 節に commit がどのように組み込まれているのかに注目してください。これは、例外が発生しても必ず実行されます。catch() 節のメソッド markRollbackOnly() では、commit() が呼び出されると実際はコミットの代わりにロールバックが行われます。

ここで説明した機能など、Simple Persistence for Java ライブラリー v2.1.0 の機能について詳しくは、「参考文献」を参照してください。


まとめ

この記事では、Simple Persistence for Java v2.1.0 ライブラリーを紹介し、その基本機能と基本コンポーネントについて説明しました。このライブラリーのカスタムの問い合わせ言語と HSQLDB データベースを使用して、単純なオブジェクト・パーシスタンスのシナリオをデモンストレーションしました。さらに、このライブラリーの高度な機能についてもいくつか説明しました。

Simple Persistence for Java ライブラリーの単純な API と構成不要の手法により、オブジェクト・リレーショナル・パーシスタンスが著しく単純化されることがわかりました。(特に、小さなユーティリティー・プログラムで) パーシスタンスは必要だが、SQL を作成したり、パーシスタンス・フレームワークを使用したり、自分のコンピューターにスタンドアロンのデータベースをインストールしたりすることは避けたい場合は、Simple Persistence for Java v2.1.0 を HSQLDB データベースと組み合わせて使用してみてください。



ダウンロード

内容ファイル名サイズダウンロード形式
Sample codej-sp4j.zip3KBHTTP

ダウンロード形式について


参考文献

学ぶために

製品や技術を入手するために

議論するために

著者について

Sami Salkosuo

Sami Salkosuo は、1999 年から IBM に勤めています。主な関心分野は Java プログラミングで、Sun Certified Java Programmer、IBM Certified Solution Developer for XML and Related Technologies、および IBM Certified Solution Developer for IBM WebSphere Portal です。Java テクノロジーの他に、Python、Fortran、LabVIEW、Visual Basic、LISP、Perl、および PHP の経験もあります。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Java technology
ArticleID=250255
ArticleTitle=Simple Persistence for Java を使用した、構成不要なオブジェクト・パーシスタンス
publish-date=02132007
author1-email=sami.salkosuo@fi.ibm.com
author1-email-cc=