連載
» 2009年06月04日 00時00分 公開

Webアプリの常識をJSPとStrutsで身につける(9):Hibernateで覚えるO/RマッピングとBeanの常識 (1/3)

本連載は、JSP/サーブレット+StrutsのWebアプリケーション開発を通じて、Java言語以外(PHPやASP.NET、Ruby on Railsなど)の開発にも通用するWebアプリケーション全般の広い知識・常識を身に付けるための連載です

[眞野寿彦,株式会社メセナ・ネットコム]

 前回の「MySQLの常識を知りセットアップしてJSPからDB操作」では、アプリケーション開発におけるデータベースとの連携と、その仕組みを説明しました。

 今回は、データベース操作において重要なO/Rマッピングや、長らく連載で触れながら説明できなかった、MVCモデルの「Model」の部分であるBeanについて説明していきます。今回も引き続きMySQLを使用するので、環境作成がまだの読者は前回の記事を参照しておいてください。

お待たせしました、Beanとは?

 Beanとは、簡単にいうと「部品化されたプログラム」のことです。

 前回でいえば、「LoginForm.java」がBean(JavaBeans)に当たります。Strutsでは、このBeanを「アクション・フォームBean」といい、フォーム画面から送信されてくるデータの保持や、ほかのプログラムからのデータを参照する機能を持っています。前回のサンプルプログラムをMVCモデルに当てはめると、以下のようになります。

図1 インストーラー起動画面 図1 前回のサンプルプログラムと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」に指定された値となります。

例 属性「property」が「name」の場合
private String name;
 
    /**
     *
     * @return
     */
    public String getName() {return name;}
    /**
     *
     * @param name
     */
    public void setName(String name) {this.name = name;}

 これで、Modelであるアクション・フォームBeanの知識も高まり、Beanを上手く操作できるようになったかと思います。

DBを使うアプリの常識になっているO/Rマッピングとは

 O/R(Object/Relational)マッピングとは、JavaプログラムとRDB(Relational DataBase)をマッピングする技術です。具体的にいうと、Javaで開発されたアプリケーションで用いられるオブジェクトのプロパティ(属性)と、RDBで定義されているテーブルのカラム列をマッピングさせることです。

 通常マッピングする際、Javaプログラムはオブジェクト構造で表現し、RDBは正規化されたリレーショナルモデルが原則となるため、このオブジェクトとリレーショナル間のモデルが違ってきてしまいます。この違いを「インピーダンス・ミスマッチ」といいます。

 O/Rマッピングは、このオブジェクトとリレーショナルのモデルの違いを対応付けて変換実行させていきます。O/Rマッピングのイメージは、以下のようになります。

図2 O/Rマッピングのイメージ 図2 O/Rマッピングのイメージ

 O/Rマッピングの利点としては、XMLファイルなどにマッピング情報を記述すると、テーブルとマッピングすべきクラスなどのソースが自動生成でき、プログラム作成作業が軽減されます。また、「SQL(Structured Query Language)」を書かなくてもRDBへのアクセスが可能になるので、煩雑になりやすいプログラムコードを書く必要がなくなり、バグなどのリスクも軽減されます。

 しかし、XMLファイルを大量に書くことによる負担もあったり、SQL文でDB情報を取得した方が効率的な場合やパフォーマンスが速い場合もあるため、どちらを使うかは仕様によって見極めが必要です。

 O/Rマッピングのフレームワークには以下のものがあります。

表1 代表的な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マッピング

JavaにおけるO/Rマッピング
Hibernateで理解するO/Rマッピング(2) EntiyBeanの問題点を整理した上で、リファレンス仕様である“JDO”を理解し、その他のフレームワークにも触れる
      「Java Solution」フォーラム 2004/5/22

O/Rマッピングで失敗しない分析・設計のポイント

O/Rマッピングで失敗しない分析・設計のポイント
JavaのDBアクセスを極める(2) DBの表構成変更がビジネスロジックに影響するのは、レイヤ設計の失敗が原因だ。カプセル化を意識したO/Rマッピングの指針を示そう
      「Database Expert」フォーラム 2005/3/10

流れるようにSQLっぽくO/RマッピングできるS2JDBC

流れるようにSQLっぽくO/RマッピングできるS2JDBC
Java初心者が超俊敏にWebアプリを作る方法(最終回) SQLっぽいメソッドチェーンやtry/catch/finally文を必要としないトランザクション管理などS2JDBCは超便利です
      「Java Solution」フォーラム 2009/3/18

SeasarのO/RマッピングツールS2Dao

SeasarのO/RマッピングツールS2Dao
Seasar Projectの全貌を探る(5) SeasarV2のプロダクトにはO/Rマッピングツールも用意されている。XMLの設定などユニークな特長を持つS2Daoを紹介する
      「Java Solution」フォーラム 2005/12/23

O/Rマッピング・フレームワーク「Cayenne」

O/Rマッピング・フレームワーク「Cayenne」
Javaプロダクトレビュー O/Rマッピング・フレームワークが注目を集める中、Hibernateに次いでCayenneが関心を呼んでいる。試しながら特徴あるGUIツールなどを見てみよう
      「Java Solution」フォーラム 2004/7/24

役に立つXMLツール集

役に立つXMLツール集
便利なXMLツールを使って、JavaオブジェクトをRDBのテーブルにマッピングするプログラミングテクニックを紹介する
     第6回 CastorでオブジェクトをRDBにマッピング
     第7回 RelaxerでオブジェクトをRDBにマッピング
      「XML & SOA」フォーラム

 次ページからは、実際によく利用される「Hibernate」を用いてO/Rマッピングをどのように行うのか見ていきましょう。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。