O/Rマッピングは、従来の煩雑なデータベースに関する処理の記述をスマートにし、柔軟なアプリケーションの構築を可能にします。本連載ではオープンソースのO/Rマッピングフレームワーク「Hibernate」を用いてO/Rマッピングの基礎を解説します。そしてさらに、J2EEアプリケーションへの実践的な適用方法とそのメリットも紹介していきます。(編集局)
前回「Hibernateを試すための準備」はHibernateを使うためにHibernateやデータベース(MySQL)のセットアップ、そして開発環境として使用するEclipseを使い、プロジェクトの作成までを行いました。
今回は、実際にサンプルプログラムを動作させることで、O/Rマッピングフレームワークを使用した場合のデータベースアクセスがどのようなものであるかを見てみましょう。この回から本連載を読み始めた読者は、前回「Hibernateを試すための準備」を読んで環境をセットアップいただき、ぜひ試してください。
まず、Hibernateを使ってアプリケーションとデータベースを接続するための接続定義ファイルを用意します。以下に示す「hibernate.cfg.xml」というファイルを作成してください。このファイルはクラスローダーが読み取り可能なディレクトリに配置する必要があるため、「HibernateProject/config」ディレクトリに保存します。
<?xml version="1.0" ?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd" > <hibernate-configuration> <session-factory> <!--MySQL JDBC Driver connection --> <property name="connection.driver_class">org.gjt.mm.mysql.Driver </property> <property name="connection.url">jdbc:mysql:///test</property> <property name="connection.username">root</property> <property name="connection.password">mysql</property> <property name="dialect">net.sf.hibernate.dialect.MySQLDialect </property> <property name="show_sql">true</property> <property name="use_outer_join">true</property> <!-- Mapping files --> <mapping resource="EMP.hbm.xml"/> </session-factory> </hibernate-configuration>
この接続定義では、以下の情報をHibernateに知らせます。
ソフトウェア | 名称 |
---|---|
connection | JDBCへの接続定義(データソースからJDBC接続を取得することも可能) |
dialect | RDBMSに固有のSQL方言(dialect)を吸収するクラスを指定 |
show_sql | 発行したSQL文を標準出力にアウトプット |
use_outer_join | リレーションが指定されたオブジェクトの階層をたどってデータを取得 |
mapping resource | 使用するマッピングファイルを指定 |
表1 接続定義ファイル「hibernate.cfg.xml」の内容 |
接続定義ファイルにはほかにも多くのパラメータが存在しますが、今回のサンプルではこれだけの指定で十分です。パラメータの詳細に関してはHibernateのマニュアルを確認してください。
次に、データベースのテーブルとJavaクラスをマッピングするための定義を記述した、マッピング定義ファイルを用意します。このサンプルプログラムでアクセスするテーブルは表2に示す定義の「EMP」テーブルです。EMPテーブルには画面1のようなレコードが格納されています。
列名 | データ型 | 主キー | NotNull |
---|---|---|---|
EMPNO | INTEGER | ○ | ○ |
ENAME | VARCHAR(10) | ○ | |
JOB | VARCHAR(10) | ||
HIREDATE | DATE | ||
表2 EMPテーブルの定義 |
マッピング定義ファイルを「EMP.hbm.xml」という名前で作成します。このファイルもクラスローダーによる読み取りが必要なので、「HibernateProject/config」ディレクトリに保存します。
<?xml version="1.0" ?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="entity.Emp" table="EMP"> <id name="empno" column="EMPNO" type="int" > <generator class="assigned" /> </id> <property name="ename" type="string" column="ENAME" /> <property name="job" type="string" column="JOB" /> <property name="hiredate" type="date" column="HIREDATE" /> </class> </hibernate-mapping>
次に作成するのはJavaアプリケーション内で使用する永続化クラスです。このクラスでは「EMP.hbm.xml」ファイルで<property>要素のname属性として記述したフィールドを定義し、各フィールドに対するgetter/setterのアクセッサメソッドを実装します。Hibernateは、データベースのデータをこのオブジェクトに格納してアプリケーションに引き渡します。この永続化クラスはEntity Beanのように特別なインターフェイスを実装せず、Serializableインターフェイスのみを実装したシンプルなオブジェクトです。
リスト3のソースコードを作成してください。なお、このクラスのパッケージは「entity」としていますので、「HibernateProject/src/entity」というディレクトリ構成を作成してソースを保存してください。
package entity; import java.io.Serializable; import java.util.Date; public class Emp implements Serializable { private Integer empno; private String ename; private String job; private Date hiredate; public Emp() {} public Integer getEmpno() { return this.empno; } public void setEmpno(Integer empno) { this.empno = empno; } public String getEname() { return this.ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return this.job; } public void setJob(String job) { this.job = job; } public Date getHiredate() { return this.hiredate; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } }
Copyright © ITmedia, Inc. All Rights Reserved.