連載 役に立つXMLツール集(6)
RelaxerでオブジェクトをRDBにマッピング Page 3
www.netpotlet.com
原田洋子
2004/5/14
ここまでのところで、準備が終わったので、今度はアプリケーションを作ります。アプリケーションでは図6に示す一連の操作を行います。このアプリケーションは前回のCastor JDOのサンプルとほぼ同様に動くようにしました。比較しやすいように、メソッド名もできるだけ同じにしてあります。前回記事の図10と比較すると2つ目の操作が違うだけというのがよく分かるでしょう。
図6 サンプルアプリケーションの操作 |
サンプルアプリケーションはリスト5のRelaxerJDBCTestクラスのようになりました。各操作について見てみましょう。
1)アンマーシャル
53 private ElfGoodsList unmarshal(String
xmlfile) |
Relaxerが生成するクラスにアンマーシャルというメソッドはありませんが、XML文書を読み込んでインスタンスを生成する部分を切り出してunmarshalメソッドを定義しました。Relaxerを使うと、XML文書へのパスを指定して、ツリー構造のルートに当たる要素に対応するクラスのインスタンスを生成するだけで、XMLモデルからオブジェクトモデルへマッピングされます。
2)データベースとの接続作成
40 ConnectionManager
connectionManager = |
このサンプルプログラムはJakarta Commons DBCPを使ってデータベースとの接続を管理しています。接続を管理しているのがリスト6のConnectionManagerクラスです。DBCPを使うと簡単にコネクションプーリング機能のある接続を作れます。
3)アンマーシャルしたオブジェクトをデータベースへ
64 Connection
connection = manager.getConnection(); |
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"; |
アンマーシャルにより生成されたオブジェクトばかりではなく、このようにして新規に作ったオブジェクトもデータベースに入れられます。RelaxerはsetIdByString()やsetXmlDateByString()のようなsetXXXByString()メソッドを生成するので、データ型に合わせたオブジェクトやタイプを用意する必要はありません。また、Javaでは月を表す数字は0〜11なので、2004年12月12日をセットしたい場合、「2004, 11, 12」という数字にしなければなりませんが、setXXXByString()メソッドを使うと「2004-12-12」のようにそのまま指定できます。
5)データベースの情報をオブジェクトへ
101 Connection
connection = manager.getConnection(); |
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 = |
のようにSELECT節を指定し、102、103行目で行っているようにxxxTableView型のインスタンスを取得するときに引数で渡しています。
Relaxer JDBCのSELECT文を作る仕組みはシンプルですが、実行後に多様な型でデータを取得できるのがほかのO/Rマッピングツールと違うところです。SELECT文実行後にwhile文で1つ1つデータを取り出しながら、オブジェクトにセットしていく方式のO/Rマッピングツールが多い中、スキーマで定義されたドキュメントの要素やその配列、DOMツリーなどのすぐ次の操作に使える型で取得できるようになっています。このサンプルでは104行目で実行しているように配列で取得しました。
6)マーシャル
111 private String getMarshalledString(ElfGoodsList
elfGoodsList) { |
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 (データベース名を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になっていますので、あらかじめ文字コードを変えてから利用されるといいでしょう。(次回に続く)
- Relaxerメモ
http://terai.s55.xrea.com/Relaxer.html
- Relaxerドキュメント
http://www.relaxer.org/doc/index_ja.html
Page 2 | 3/3 |
Index | |
連載 役に立つXMLツール集(7) RelaxerでオブジェクトをRDBにマッピング |
|
O/RマッピングツールとしてのRelaxer Relaxer JDBCとは Relaxerの入手とサンプル実行環境のセットアップ |
|
サンプルアプリケーションの設計 | |
サンプルアプリケーションの実装 まとめ&サンプルダウンロード 参考サイト |
■関連記事
・SEのためのXML
Schema入門
・XMLテクニック集
・Javaで実現するDOM/SAXプログラミング
「連載 役に立つXMLツール集」 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|