オブジェクト・パーシスタンスは、デスクトップからエンタープライズにいたるまで、ほとんどすべての 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 は、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 では、メモリー・ベースおよびディスク・ベースのテーブルが提供され、組み込みモードやサーバー操作モードがサポートされています。
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 では、要求に応じてオブジェクトが取得されます。これにより、何千ものオブジェクトをメモリーに保管せずにすみます。
リスト 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 アプリケーションの照会結果
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 code | j-sp4j.zip | 3KB | HTTP |
学ぶために
-
「Secrets of lightweight development success, Part 6: Persistence strategies」(Bruce Tate, developerWorks, 2005年9月): Java パーシスタンスのフレームワークとストラテジーの概要。現在では内容が古くなっているが、それでも読む価値があります。
-
「Improve persistence with Apache Derby and iBATIS」(Daniel Wintschel, developerWorks, 2006年1月): iBatis および Apache Derby の入門チュートリアルです。iBatis と Apache Derby は、Java アプリケーションにおけるオブジェクト・パーシスタンスのもう 1 つの優れた組み合わせです。
-
「DAOを繰り返すな!」(Per Mellqvist, developerWorks, 2006年5月): Java 5 Generics を使用した、より構成重視でタイプセーフな、オブジェクト・パーシスタンスへのアプローチが説明されています。
-
「EJB 3.0 Java Persistence APIを使用したエンタープライズ・アプリケーションの設計」(Borys Burnayev, developerWorks, 2006年3月): Java Persistence API for EJB 3.0 が紹介されています。
-
LGPL: GNU 劣等一般公衆利用許諾契約書は、Free Software Foundation から発行されるフリー・ソフトウェア・ライセンスです。
-
BSD ライセンス: Berkeley Software Distribution の独自のライセンスです。現在では、さまざまな分派によって改定されています。
製品や技術を入手するために
-
Simple Persistence for Java 2.1.0 のダウンロード: これは、Java アプリケーションのオープン・ソースのオブジェクト関係ライブラリーです。
-
HSQLDB のダウンロード: これは、Java オブジェクトを保管するための軽量なデータベースです。保守はあまり必要ありません。
議論するために
-
developerWorks ディスカッション・フォーラムに参加してください。
-
developerWorks blogs: developerWorks コミュニティーに参加してください。
