本連載は、JSP/サーブレット+StrutsのWebアプリケーション開発を通じて、Java言語以外(PHPやASP.NET、Ruby on Railsなど)の開発にも通用するWebアプリケーション全般の広い知識・常識を身に付けるための連載です
前回の「MySQLの常識を知りセットアップしてJSPからDB操作」では、アプリケーション開発におけるデータベースとの連携と、その仕組みを説明しました。
今回は、データベース操作において重要なO/Rマッピングや、長らく連載で触れながら説明できなかった、MVCモデルの「Model」の部分であるBeanについて説明していきます。今回も引き続きMySQLを使用するので、環境作成がまだの読者は前回の記事を参照しておいてください。
Beanとは、簡単にいうと「部品化されたプログラム」のことです。
前回でいえば、「LoginForm.java」がBean(JavaBeans)に当たります。Strutsでは、このBeanを「アクション・フォームBean」といい、フォーム画面から送信されてくるデータの保持や、ほかのプログラムからのデータを参照する機能を持っています。前回のサンプルプログラムをMVCモデルに当てはめると、以下のようになります。
前回のプログラムでは、Webブラウザの「Login01.jsp」であるログイン画面より「ログインID」と「パスワード」の値(property)を取得します。
MVCモデル、Controller「LoginAction.java」でModelの「LoginForm.java」とデータを保持、操作して、データベースより値を取得します。前回は、「ログインID」の値により列「password」「name」を取得して「LoginForm.java」に保持しています。
「LoginForm.java」の保持された情報をController「LoginAction.java」で操作した後、Viewである「Login02.jsp」とModelの「LoginForm.java」を組み合わせて画面としてWebブラウザに返しているのです。これで、MVCモデルの「Model」の動作についても分かっていただけたかと思います。
それでは次に、Modelであるアクション・フォームBeanについてソース(LoginForm.java)から解説します。アクション・フォームBeanの動作を行うクラスは、「ActionForm」のクラスを継承する必要があります。
public class HelloForm extends ActionForm {
アクション・フォームBeanには、プロパティのデータを保持する変数を宣言して、データの保持・参照を行うためのメソッド(アクセサメソッド)を指定する必要があります。これは、「<html:text property="XXX"/>」などの属性「property」に指定された値となります。
private String name; /** * * @return */ public String getName() {return name;} /** * * @param name */ public void setName(String name) {this.name = name;}
これで、Modelであるアクション・フォームBeanの知識も高まり、Beanを上手く操作できるようになったかと思います。
O/R(Object/Relational)マッピングとは、JavaプログラムとRDB(Relational DataBase)をマッピングする技術です。具体的にいうと、Javaで開発されたアプリケーションで用いられるオブジェクトのプロパティ(属性)と、RDBで定義されているテーブルのカラム列をマッピングさせることです。
通常マッピングする際、Javaプログラムはオブジェクト構造で表現し、RDBは正規化されたリレーショナルモデルが原則となるため、このオブジェクトとリレーショナル間のモデルが違ってきてしまいます。この違いを「インピーダンス・ミスマッチ」といいます。
O/Rマッピングは、このオブジェクトとリレーショナルのモデルの違いを対応付けて変換実行させていきます。O/Rマッピングのイメージは、以下のようになります。
O/Rマッピングの利点としては、XMLファイルなどにマッピング情報を記述すると、テーブルとマッピングすべきクラスなどのソースが自動生成でき、プログラム作成作業が軽減されます。また、「SQL(Structured Query Language)」を書かなくてもRDBへのアクセスが可能になるので、煩雑になりやすいプログラムコードを書く必要がなくなり、バグなどのリスクも軽減されます。
しかし、XMLファイルを大量に書くことによる負担もあったり、SQL文でDB情報を取得した方が効率的な場合やパフォーマンスが速い場合もあるため、どちらを使うかは仕様によって見極めが必要です。
O/Rマッピングのフレームワークには以下のものがあります。
プロダクト名 | 概要 | 対応 言語 |
|
---|---|---|---|
iBATIS | SQLクエリをXMLファイルにマッピングする永続性フレームワークで、関係データベースにアクセスする際に必要となる大量のコードを大幅に減らすことを目的とする | Java .NET |
|
Hibernate | オープンソースのhibernate.orgが開発している、O/Rマッピングフレームワークで、Java用O/Rマッピングライブラリの中では最も普及しているものの1つ | Java .NET |
|
ActiveRecord | RubyでのO/Rマッピングライブラリの1つ。簡単かつ効率的にRDB上の情報をRubyオブジェクトとして扱える | Ruby | |
Torque | O/Rマッピングツール。SQLは内部で作成するために、データベースを意識せずに済み、プログラムの対応が容易なのが特徴。また、テーブル1つに対してJavaソースコードファイル(.java)が1つ生成されるため、データベースへのアクセスを気にしないで、コーディングできる | Java | |
DB_DataObject | PHPで使えるO/Rマッピングツールの1つ。オブジェクトからSQLクエリを自動生成する機能と、逆にデータベースから取得されたレコードをオブジェクトにマッピングする機能を提供する。またDB_DataObjectは、SQLテーブル構造を基にマッピングされるオブジェクトを自動生成する機能を有している | PHP | |
表1以外のO/Rマッピングフレームワークについては、以下の記事も参考にしてください。
JavaにおけるO/Rマッピング
Hibernateで理解するO/Rマッピング(2) EntiyBeanの問題点を整理した上で、リファレンス仕様である“JDO”を理解し、その他のフレームワークにも触れる
「Java Solution」フォーラム 2004/5/22
O/Rマッピングで失敗しない分析・設計のポイント
JavaのDBアクセスを極める(2) DBの表構成変更がビジネスロジックに影響するのは、レイヤ設計の失敗が原因だ。カプセル化を意識したO/Rマッピングの指針を示そう
「Database Expert」フォーラム 2005/3/10
流れるようにSQLっぽくO/RマッピングできるS2JDBC
Java初心者が超俊敏にWebアプリを作る方法(最終回) SQLっぽいメソッドチェーンやtry/catch/finally文を必要としないトランザクション管理などS2JDBCは超便利です
「Java Solution」フォーラム 2009/3/18
SeasarのO/RマッピングツールS2Dao
Seasar Projectの全貌を探る(5) SeasarV2のプロダクトにはO/Rマッピングツールも用意されている。XMLの設定などユニークな特長を持つS2Daoを紹介する
「Java Solution」フォーラム 2005/12/23
O/Rマッピング・フレームワーク「Cayenne」
Javaプロダクトレビュー O/Rマッピング・フレームワークが注目を集める中、Hibernateに次いでCayenneが関心を呼んでいる。試しながら特徴あるGUIツールなどを見てみよう
「Java Solution」フォーラム 2004/7/24
役に立つXMLツール集
便利なXMLツールを使って、JavaオブジェクトをRDBのテーブルにマッピングするプログラミングテクニックを紹介する
第6回 CastorでオブジェクトをRDBにマッピング
第7回 RelaxerでオブジェクトをRDBにマッピング
「XML & SOA」フォーラム
次ページからは、実際によく利用される「Hibernate」を用いてO/Rマッピングをどのように行うのか見ていきましょう。
Copyright © ITmedia, Inc. All Rights Reserved.