連載
» 2007年04月10日 00時00分 公開

O/Rマッピングで郵便番号検索Ajaxアプリ作成!MyEclipseでAjax+Javaをやさしく開発(3)(2/4 ページ)

[水島和憲,エクリプス]

MyEclipseはHibernateの利用にも便利!

 DB中の郵便番号データとJavaオブジェクトの変換には、O/RマッピングのデファクトであるHibernateフレームワークを使用することにします。

 MyEclipseはHibernateをサポートしており、便利な機能がいくつか用意されています。今回は、それらの機能を活用して郵便番号や住所の情報で郵便番号データを検索するJavaクラスを作成します。Hibernateを利用するためには、次の5つの設定が必要です。

  1. hibernateのライブラリをクラスパスに追加
  2. 設定ファイル(hibernate.cfg.xml)を設定
    DBにアクセスするための情報を記述。JDBCドライバ名、DBのURL、ユーザー名、パスワードなど
  3. Javaクラス(DTO、Data Transfer Object)
    DBの表の1行に対応するJavaクラス。各カラムに対応したgetter/setterを持つ
  4. マッピングファイル
    DBの表とJavaクラスとのマッピングを記述。どの表をどのJavaクラスに関連付けるのか、表のどのカラムをJavaクラスのどのカラムに関連付けるのかを記述
  5. DAO(Data Access Object)
    DBへのアクセスをカプセル化するオブジェクト

プロジェクトにHibernate機能の追加

 まず、WebプロジェクトでHibernateを利用できるようにするための準備として、12を行います。[J2EE開発]パースペクティブに切り替えて、[パッケージ・エクスプローラー]ビューからWebプロジェクト「post」を選択し、右クリックで[MyEclipse]→[Hibernate機能の追加]を実行します。

 基本的に、デフォルトの設定のままで問題ありません。図8では、DBプロファイルに「mydb」を選択します。選択すると、自動的にそのほかの項目が設定されます。

図8 Hibernate機能の追加(Hibernate データベース接続の詳細を指定) 図8 Hibernate機能の追加(Hibernate DB接続の詳細を指定)

 図9では、Javaパッケージを「com.hoge.orm」としました。

図9 Hibernate機能の追加(セッション・ファクトリー・プロパティーの定義) 図9 Hibernate機能の追加(セッション・ファクトリー・プロパティーの定義)

 以上で、Hibernateのライブラリの設定およびhibernate.cfg.xmlファイルが作成されました。

Hibernate リバース・エンジニアリング

 次に、34を定義します。MyEclipseでは、これらの定義はDBのテーブル情報から[Hibernate リバース・エンジニアリング]によって、自動生成できます。

 再度、[データベース・エクスプローラー]パースペクティブに切り替えます。[DBブラウザー]ビューから、ツリーを展開しPOSTALDATAテーブルを選択します。DBに接続していない場合は、再接続してください。POSTALDATAテーブルを右クリックすると、[Hibernate リバース・エンジニアリング]というメニュー項目がありますので、これを実行します。

図10 Hibernateリバース・エンジニアリング 図10 Hibernateリバース・エンジニアリング

 図10のように、javaソースフォルダとパッケージを指定し、[各データベース・テーブル用のHibernateマッピングファイル][Javaデータオブジェクト]には、チェックを入れます。これで、マッピングファイルとデータオブジェクト(DTO)が自動生成されるようになります。

注意!

通常、一般的なO/Rマッピングでは、DAOの生成にもチェックを入れておいた方がよいでしょう。チェックを入れると、DTOの永続化削除、検索などを行うDAOクラスも自動的に生成してくれます。今回は、検索だけなので、DAOの自動生成はせずに手動で作成することにしました。


 後は、特別な設定もなくウィザードに従えばよいので、[終了]ボタンをクリックします。指定したパッケージに、マッピングファイルとDTOが自動生成されます。

 [Hibernate リバース・エンジニアリング]を実行した後に、[Hibernate]パースペクティブに切り替えるかどうかのダイアログが表示されます。次の作業のために、[Hibernate]パースペクティブに切り替えておいてください。

[HQLエディター]でデータを検索

 Hibernateでは、HQL(Hibernate Query Language)というSQLに似た言語を使用して、検索を行います。ここでは、郵便番号データを検索するDAOクラスを作成する前に、[HQLエディター]を使って、どのようなHQL文を実行すればよいのかを試してみます。

 [HQLエディター]を開くには、[パッケージ・エクスプローラー]からHibernate機能を追加したプロジェクト(今回の場合はpostプロジェクト)を選択します。右クリックし、[MyEclipse]→[HQLエディターを開く]を実行すると、エディター領域に[HQLエディター]が表示されます。

 郵便番号データ検索では、郵便番号、都道府県名、市町村名、地域名、それぞれの「AND」で検索します。すべて前方一致で照合することにします。HQLでは次のように記述します。コロンが先頭に付いた単語はパラメータです。次のHQL文をHQLエディター領域に記入してください。

実行するHQL文
    from
        Postaldata as p
    where
        p.zipcode like :zipcode
        and p.pref like :pref
        and p.city like :city
        and p.town like :town

 右下の[Hibernateダイナミック・クエリー変換]ビューは、このHQLに対応するSQL文を表示します。記入したHQLがどのようなSQLに変換されるのかを確認できます。

図11 HQLエディター 図11 HQLエディター(クリックすると拡大します)

 このHQL文はパラメータを持っています。パラメータ付きのHQLを実行するには、パラメータの値を指定しなければなりません。パラメータ値を指定するのが、右側の[クエリー・パラメータ]ビューになります。「:P+」というアイコンをクリックすると、HQLで使用しているパラメータが一覧に追加されます。後は、表上で値を直接入力してください。図11では、千代田区の郵便番号データを検索しようとしています。

図12 HQLの結果確認 図12 HQLの結果確認(クリックすると拡大します)

 パラメータを指定してHQLを実行すると、結果がエディター領域の下の「クエリー結果」ビューに表示されます。ただし、結果は、オブジェクトのtoStringメソッドの値が表示されるので、いちべつしただけでは正しい値なのか判別できません。そこで、右側の[プロパティ]ビューを表示させた状態で、[クエリー結果]ビューのオブジェクトを選択してみてください。上図のように、オブジェクトの値を参照できます。

 以上のように、HQLエディターを使用すれば、Javaのプログラムを書くことなく試せます。

郵便番号データのDAOクラスの作成と解説

 最後に、5のDAOを作成します。[Hibernate リバース・エンジニアリング]で、DAOの自動生成もできますが、今回作成するDAOは検索するだけの単純なものなので、最初から作成することにします。郵便番号データを検索するコードは次のようになります。

PostaldataDAO.java
public class PostaldataDAO {

    private static final String QUERY = "from Postaldata as p "
                                + "where p.zipcode like :zipcode "
                                + "and p.pref like :pref "
                                + "and p.city like :city "
                                + "and p.town like :town";
    private static final int MAX_RESULT = 50;

    public List find(String zipcode, String pref, String city
                                                , String town) {
        Session session = null;
        try {
            session = HibernateSessionFactory.getSession();
            Query queryObject = session.createQuery(QUERY);

            // パラメータの設定
            queryObject.setString("zipcode", zipcode);
            queryObject.setString("pref", pref);
            queryObject.setString("city", city);
            queryObject.setString("town", town);

            // 最初の50件を取得する指定
            queryObject.setFirstResult(0);
            queryObject.setMaxResults(MAX_RESULT);

            return queryObject.list();
        } catch (HibernateException e) {
            e.printStackTrace();
            return Collections.EMPTY_LIST;
        } finaly {
            if (session != null) session.close();
        }
    }
}

 HibernateSessionFactoryはHibernate機能を追加したときに自動生成されるファクトリークラスです。getSessionメソッドを呼び出すと、HibernateのSessionオブジェクトを取得できます。

 パラメータを指定したクエリーを投げる場合、HibernateではQueryオブジェクトを使用します。このオブジェクトはSessionオブジェクトから作成します。パラメータの値を指定する場合は、QueryオブジェクトのsetXXXメソッドを使用します。今回の例では、すべてString型なので、setStringメソッドを使用しています。

 また、検索結果を最初の50件に絞るために、setFirstResultとsetMaxResultsメソッドを使用しています。最後に、listメソッドでPostaldataオブジェクトのリストとして、検索結果が返ります。

 以上で、郵便番号、都道府県名、市町村名、地域名を与えれば、DBを検索し、Postaldataのリストを返すPostaldataDAO#findメソッドができました。次は、このメソッドをJavaScriptから呼び出せるようにします。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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