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

www.netpotlet.com
原田洋子
2004/5/14

サンプルアプリケーションの実装

 ここまでのところで、準備が終わったので、今度はアプリケーションを作ります。アプリケーションでは図6に示す一連の操作を行います。このアプリケーションは前回のCastor JDOのサンプルとほぼ同様に動くようにしました。比較しやすいように、メソッド名もできるだけ同じにしてあります。前回記事の図10と比較すると2つ目の操作が違うだけというのがよく分かるでしょう。

図6 サンプルアプリケーションの操作
手順2(ピンク色)だけが前回と異なる

 サンプルアプリケーションはリスト5のRelaxerJDBCTestクラスのようになりました。各操作について見てみましょう。

1)アンマーシャル

53      private ElfGoodsList unmarshal(String xmlfile)
54          throws IOException,
55                 SAXException,
56                 ParserConfigurationException {
57          return new ElfGoodsList(new File(xmlfile));
58      }

 Relaxerが生成するクラスにアンマーシャルというメソッドはありませんが、XML文書を読み込んでインスタンスを生成する部分を切り出してunmarshalメソッドを定義しました。Relaxerを使うと、XML文書へのパスを指定して、ツリー構造のルートに当たる要素に対応するクラスのインスタンスを生成するだけで、XMLモデルからオブジェクトモデルへマッピングされます。

2)データベースとの接続作成

40         ConnectionManager connectionManager =
41             ConnectionManager.getInstance(drivername,
42                                           jdbcurl,
43                                           username,
44                                           password);

 このサンプルプログラムはJakarta Commons DBCPを使ってデータベースとの接続を管理しています。接続を管理しているのがリスト6のConnectionManagerクラスです。DBCPを使うと簡単にコネクションプーリング機能のある接続を作れます。

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

64          Connection connection = manager.getConnection();
65          GoodsTable goodsTable =
66              new GoodsTable(connection, tablename);
67          goodsTable.insert(elfGoodsList.getGoods());
68          manager.returnConnection(connection);

 GoodsListTableやGoodsTableのようなxxxTableという名前のクラスには、SQLのINSERT文実行に相当するinsert()メソッドがあります。このメソッドの引数にオブジェクトやXML文書のURLを指定するとデータベースに書き込まれます。insert()メソッドの引数にはDOMツリーや要素、配列など多様な型を指定できるようになっているので、プログラミング時には自動生成されたxxxTableクラスのソースコードを見ておくといいでしょう。

 Relaxer JDBCはトランザクション関連のメソッドやクラスを作りません。デフォルトはJDBC APIのデフォルトの動作である自動コミットが適用されます。コミットのタイミングを制御したい場合はxxxTableクラスのgetConnection()メソッドでjava.sql.Connection型のインスタンスを取得するか、このサンプルのようにコネクションを直接扱えるようにしておきます。これでJDBC APIによるコミットの制御ができるようになります。

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

74          String id = "5";
75          ElfGoods elfGoods = new ElfGoods();
76          elfGoods.setIdByString(id);
            ……
79          elfGoods.setXmlDateByString("2003-12-12");
80          elfGoods.setDescription("浅草橋");
81          ElfDetailPricePrice price = new ElfDetailPricePrice();
82          price.setIdByString(id);
            ……
85          elfGoods.setDetailPricePrice(price);
86          ElfDetailCategoryCategory category =
87              new ElfDetailCategoryCategory();
88          category.setIdByString(id);
            ……
90          elfGoods.setDetailCategoryCategory(category);
91          Connection connection = manager.getConnection();
92          GoodsTable goodsTable =
93              new GoodsTable(connection, tablename);
94          goodsTable.insert(elfGoods);

 アンマーシャルにより生成されたオブジェクトばかりではなく、このようにして新規に作ったオブジェクトもデータベースに入れられます。RelaxerはsetIdByString()やsetXmlDateByString()のようなsetXXXByString()メソッドを生成するので、データ型に合わせたオブジェクトやタイプを用意する必要はありません。また、Javaでは月を表す数字は0〜11なので、2004年12月12日をセットしたい場合、「2004, 11, 12」という数字にしなければなりませんが、setXXXByString()メソッドを使うと「2004-12-12」のようにそのまま指定できます。

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

101          Connection connection = manager.getConnection();
102          GoodsTableView goodsTableView =
103              new GoodsTableView(connection, selectClause);
104          ElfGoods[] elfGoodsArray = goodsTableView.select();
105          ElfGoodsList elfGoodsList = new ElfGoodsList();
106          elfGoodsList.setGoods(elfGoodsArray);
107          manager.returnConnection(connection);
108          return elfGoodsList;

 SQLのSELECT文相当の処理を行うにはxxxTable、xxxTableViewのどちらかのクラスのselect()やselectAsDocument()、selectByExpressionAsDocument()のようなselectXXX()メソッドを使います。xxxTableクラスにはinsert()やupdate()メソッドが含まれますが、xxxTableViewクラスにはありません。参照するのみの場合にxxxTableViewクラスを使います。

 Relaxer JDBCは独自のクエリ言語やOQLなどを使わず、SQLそのものを使います。select()メソッド実行前にSELECT節を文字列で、例えば「SELECT * FROM goods」のように設定しておき、「WHERE id=3」などの条件や式を付けたい場合は、selectXXX()メソッドの引数で渡します。このサンプルの場合、RelaxerJDBCTestのコンストラクタで

47          ElfGoodsList selected =
48              select(connectionManager, "select * from " + tablename + ";");

のようにSELECT節を指定し、102、103行目で行っているようにxxxTableView型のインスタンスを取得するときに引数で渡しています。

 Relaxer JDBCのSELECT文を作る仕組みはシンプルですが、実行後に多様な型でデータを取得できるのがほかのO/Rマッピングツールと違うところです。SELECT文実行後にwhile文で1つ1つデータを取り出しながら、オブジェクトにセットしていく方式のO/Rマッピングツールが多い中、スキーマで定義されたドキュメントの要素やその配列、DOMツリーなどのすぐ次の操作に使える型で取得できるようになっています。このサンプルでは104行目で実行しているように配列で取得しました。

6)マーシャル

111  private String getMarshalledString(ElfGoodsList elfGoodsList) {
112      return elfGoodsList.makeTextDocument();
113  }

 Relaxerはアンマーシャル同様、マーシャルというメソッドは生成しませんが、Castor JDOのサンプルと同じになるように、同じ役目を果たすメソッドをあえて作りました。Relaxerはマーシャル時にストリームに出力できるばかりではなく、112行目で行っているように文字列で取り出すこともできます。このため、このメソッドは名前合わせ程度の短いものになっています。

7)XML+XSLTでHTMLへ変換

 JAXP(Java API for XML Processing)を使って変換しますが、この部分は前回のCastor JDOのサンプルとまったく同じです。テンプレートも同じものを使っているので、前回のリスト8、9や説明を参照してください。

リスト5 RelaxerJDBCTest.java(別ウィンドウで表示します)

リスト6 ConnectionManager.java(別ウィンドウで表示します)

アプリケーション実行

 サンプルアプリケーションを実行してみましょう。このアプリケーションがアンマーシャルするのはリスト7のXML文書goods.xmlです。この内容をデータベースに登録します。リスト7は前回のCastor JDOのリスト3と同じものです。goods.xmlはelfプロジェクトのdocsフォルダーに置きました。

リスト7 goods.xml(別ウィンドウで表示します)

 実行するには次のようにします。

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

※注
プログラム引数
docs/goods.xml org.postgresql.Driver jdbc:postgresql:elf
aqua blue goods docs/template.xsl docs/goods.html

(データベース名をelfにしたのでJDBC URLがjdbc:postgresql:elfになっている)

 問題なく実行されれば、図2に示したHTMLファイルdocs/goods.htmlが作られます。なお、同じidでは新規のデータをデータベースに書き込めないので、続けて実行する場合はidを変えて試してください。

まとめ&サンプルダウンロード

 Castor JDOと比較しやすいように同じ操作を行うサンプルをRelaxer JDBCを使って作ってみましたが、いかがだったでしょうか。最近、人気のあるO/RマッピングツールであるHibernateはCastor JDOに似ているので、HibernateとRelaxer JDBCとの比較にもつながるのではないかと思います。

 RelaxerはJCP(Java Community Process)で決定された何かの仕様を実装しているツールではありませんが、利用者の目線で考えられているツールといえるでしょう。データベース参照方法が1つの例です。Relaxer JDBCはSQLを知らないと使えない半面、SQLを知っているプログラマにはストレスなく使えるようになっています。データベースを扱おうとするプログラマがSQLをまったく知らないまま、アプリケーションを作るという状況は考えにくいので、妥当な選択ではないかと思われます。一方、データベースから取得したデータは多様な型で受け取ることができるので、プログラマが変換しなくてもそのまま次の操作に使えるようになっているので便利です。

 O/Rマッピングツールなど使わずにJDBC APIそのまま、あるいはJakarta Commons DbUtilsなどを利用する程度で済ませているという声が多く聞かれます。前回記事のまとめでも触れましたが、ちょうどいいO/Rマッピングツールが現れないのが現状のようです。いまある中からこれなら使えると思うツールを探すには、いろいろなO/Rマッピングツールを試して、それぞれの考え方や得意分野を調べるしかないのでしょう。この機会にRelaxer JDBCも試してみてください。

 次回はXMLで記述するプレゼンテーションツール、XUL(ずーる)を取り上げる予定です。また、XULを動かすサーバサイドの環境にはJSF(JavaServer Faces)を使ってみます。

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

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


参考サイト

Page 2 3/3

 Index
連載 役に立つXMLツール集(7)
RelaxerでオブジェクトをRDBにマッピング
  O/RマッピングツールとしてのRelaxer
Relaxer JDBCとは
Relaxerの入手とサンプル実行環境のセットアップ
  サンプルアプリケーションの設計
サンプルアプリケーションの実装
まとめ&サンプルダウンロード
参考サイト

 

関連記事

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



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


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間