MyEclipseはHibernateの利用にも便利!
DB中の郵便番号データとJavaオブジェクトの変換には、O/RマッピングのデファクトであるHibernateフレームワークを使用することにします。
MyEclipseはHibernateをサポートしており、便利な機能がいくつか用意されています。今回は、それらの機能を活用して郵便番号や住所の情報で郵便番号データを検索するJavaクラスを作成します。Hibernateを利用するためには、次の5つの設定が必要です。
- hibernateのライブラリをクラスパスに追加
- 設定ファイル(hibernate.cfg.xml)を設定
DBにアクセスするための情報を記述。JDBCドライバ名、DBのURL、ユーザー名、パスワードなど - Javaクラス(DTO、Data Transfer Object)
DBの表の1行に対応するJavaクラス。各カラムに対応したgetter/setterを持つ - マッピングファイル
DBの表とJavaクラスとのマッピングを記述。どの表をどのJavaクラスに関連付けるのか、表のどのカラムをJavaクラスのどのカラムに関連付けるのかを記述 - DAO(Data Access Object)
DBへのアクセスをカプセル化するオブジェクト
プロジェクトにHibernate機能の追加
まず、WebプロジェクトでHibernateを利用できるようにするための準備として、1と2を行います。[J2EE開発]パースペクティブに切り替えて、[パッケージ・エクスプローラー]ビューからWebプロジェクト「post」を選択し、右クリックで[MyEclipse]→[Hibernate機能の追加]を実行します。
基本的に、デフォルトの設定のままで問題ありません。図8では、DBプロファイルに「mydb」を選択します。選択すると、自動的にそのほかの項目が設定されます。
図9では、Javaパッケージを「com.hoge.orm」としました。
以上で、Hibernateのライブラリの設定およびhibernate.cfg.xmlファイルが作成されました。
Hibernate リバース・エンジニアリング
次に、3と4を定義します。MyEclipseでは、これらの定義はDBのテーブル情報から[Hibernate リバース・エンジニアリング]によって、自動生成できます。
再度、[データベース・エクスプローラー]パースペクティブに切り替えます。[DBブラウザー]ビューから、ツリーを展開しPOSTALDATAテーブルを選択します。DBに接続していない場合は、再接続してください。POSTALDATAテーブルを右クリックすると、[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エディター領域に記入してください。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
右下の[Hibernateダイナミック・クエリー変換]ビューは、このHQLに対応するSQL文を表示します。記入したHQLがどのようなSQLに変換されるのかを確認できます。
このHQL文はパラメータを持っています。パラメータ付きのHQLを実行するには、パラメータの値を指定しなければなりません。パラメータ値を指定するのが、右側の[クエリー・パラメータ]ビューになります。「:P+」というアイコンをクリックすると、HQLで使用しているパラメータが一覧に追加されます。後は、表上で値を直接入力してください。図11では、千代田区の郵便番号データを検索しようとしています。
パラメータを指定してHQLを実行すると、結果がエディター領域の下の「クエリー結果」ビューに表示されます。ただし、結果は、オブジェクトのtoStringメソッドの値が表示されるので、いちべつしただけでは正しい値なのか判別できません。そこで、右側の[プロパティ]ビューを表示させた状態で、[クエリー結果]ビューのオブジェクトを選択してみてください。上図のように、オブジェクトの値を参照できます。
以上のように、HQLエディターを使用すれば、Javaのプログラムを書くことなく試せます。
郵便番号データのDAOクラスの作成と解説
最後に、5のDAOを作成します。[Hibernate リバース・エンジニアリング]で、DAOの自動生成もできますが、今回作成するDAOは検索するだけの単純なものなので、最初から作成することにします。郵便番号データを検索するコードは次のようになります。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
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.