連載 役に立つXMLツール集(6)
CastorでオブジェクトをRDBにマッピング

www.netpotlet.com
原田洋子
2004/4/9

アプリケーション作成

 これまでのところで準備は終わったので、アプリケーション作成に取り掛かります。このサンプルでは図10に示す7つの操作を行っています。各操作をどのようにプログラミングするのかをリスト8のCastorJDOTest.javaで見ていきます。

図10 サンプルアプリケーションの操作


1)アンマーシャル

57       GoodsList goodsList =
58         (GoodsList)GoodsList.unmarshal(new FileReader(filename));

 Castorのデータバインディング機能を利用し、リスト3のgoods.xmlをアンマーシャルし、データベースに書き込む情報にする。

2)config.xml、mapping.xmlの読み込み

41       JDO jdo = new JDO();
42       jdo.setConfiguration(
             getClass().getResource(conffile).toString());

 mapping.xmlはconfig.xmlのmapping要素を参照して読み込まれるので明示的に読み込む処理は必要ない。

3)アンマーシャルしたオブジェクトをデータベースへ

75    database.begin();
76    database.create(goods);    //goodsはJdoGoods型のインスタンス
77    database.create(price);    //priceはPrice型のインスタンス
78    database.create(category); //categoryはCategory型のインスタンス
79    database.commit();

 Castor JDOはorg.exolab.castor.jdo.Database#begin()メソッドとorg.exolab.castor.jdo.Database#commit()メソッドの間でデータベースに対する操作を行う。新規登録ではなく修正の場合はorg.exolab.castor.jdo.Database#update()メソッドを使う。


4)プログラム内で作ったオブジェクトをデータベースへ

 85         JdoGoods goods = new JdoGoods();
 86         goods.setId(5);
 87         goods.setSample("river.gif");
             .....
             .....
             .....
 99         goods.setCategory(category);
100         create(database, goods);

 アンマーシャルして生成したオブジェクトだけではなく、このように普通にインスタンス化したオブジェクトもデータベースに格納できる。

5)データベースの情報をオブジェクトへ

106         database.begin();
107         OQLQuery oqlQuery =
108           database.getOQLQuery("SELECT goods FROM com.netpotlet.nymph.JdoGoods goods");
109         QueryResults results = oqlQuery.execute();
110         while (results.hasMoreElements()) {
111             JdoGoods jdoGoods = (JdoGoods)results.next();
112             int id = jdoGoods.getId();
                 .......
                 .......
123         }
             .......
126         database.commit();

 SQL文のSELECT相当の処理を行う場合はOQLクエリを利用する。OQLはオブジェクトに対してクエリを出すのでテーブル名やカラム名ではなく、インスタンス変数名相当の名前を使用する。

 JdoGoods型はCategory型とPrice型への参照を持っている。Castor JDOはクラスはテーブルにマップされるので、このクエリではgoods、category、priceテーブルをJOINしたSQLクエリを発行するのと同等の結果が得られる。Castor JDOではJOINに相当する明示的な操作はできないが、

SELECT ...... WHERE goods.id = category.id;

のような暗黙的な操作が自動的に行われる。

6)マーシャル

134         StringWriter writer = new StringWriter();
135         Marshaller marshaller = new Marshaller(writer);
136         marshaller.setEncoding("euc-jp");
137         marshaller.marshal(goodsList);

 Castorのデータバインディング機能を利用し、データベースから取得したデータをマーシャルする。マーシャル後の処理を考慮して、java.io.StringWriter型のオブジェクトに出力した。

7)XML+XSLTでHTMLへ変換

 JAXP(Java API for XML Processing)を使って変換している。変換の操作はリスト9のDocumentTransformerクラスで行っている。XSLはリスト10のtemplate.xsl。

リスト8 CastorJDOTest.java(別ウインドウで表示します)

リスト9 DocumentTransformer.java(別ウインドウで表示します)

リスト10 template.xsl(別ウインドウで表示します)

アプリケーション実行

 次のようにして実行します。

 ツールバーの実行 → 実行... → Javaアプリケーション選択 →
 新規(画面1) → 引数タブ → プログラム引数 ※注3 画面2) →
 適用 → 実行

※注3
プログラム引数
docs/goods.xml config.xml docs/template.xsl docs/goods.html 

 問題なく実行されれば、図3に示すHTMLファイルdocs/goods.htmlが作られます。

 同じidでは新規のデータをデータベースに書き込めないので、続けて実行する場合はidを変えて試してください。

まとめ

 Castor JDOを使ったシンプルなサンプルを紹介しましたが、いかがだったでしょうか。本記事では基本的なプログラミングに触れたのみですが、さまざまなOQLクエリの作り方については次のドキュメントでいくつか紹介されています。

 世の中にはいくつものO/Rマッピングツールがあるにもかかわらず、ちょうどいいものがないとの声をよく聞きます。今回取り上げたCastor JDOは古参のO/Rマッピングツールで、最近のツールのように自動化されていないところが多々あります。しかし、使いやすさはかえって、多くこのことをやってくれすぎないところにあるのかもしれないので、Castor JDOもお試しください。

サンプル・ダウンロード&参考サイト

 今回使用したプログラムやファイル類は以下からダウンロードできます。

 Windows環境で利用される場合、euc-jpをWindows-31Jなど適当なエンコーディングに変更してください。また、日本語を含むファイルはEUC-JPになっていますので、あらかじめ文字コードを変えてから利用されるといいでしょう。

参考サイト

 次回も引き続きデータバインディングツールによるO/Rマッピングを取り上げる予定です。(次回に続く)

3/3

 Index
連載 役に立つXMLツール集(6)
CastorでオブジェクトをRDBにマッピング
 

O/Rマッピングツール概要
Castor JDOとは
Castorの入手とセットアップ

 

サンプルアプリケーションの設計

アプリケーション作成
まとめ
サンプル・ダウンロード&参考サイト

 

関連記事

 ・SEのためのXML Schema入門
 ・XMLテクニック集
 ・Javaで実現するDOM/SAXプログラミング



「連載 役に立つXMLツール集」


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間