はじめに
StrutsやJSFといった従来のJavaフレームワークは、標準でデータベース関係の機能をあまり用意していません。しかし、RoR(Ruby on Rails)以降のMVCフレームワークでは、データベースとのやりとりを行う「モデル(Model)」は重要な役割を果たしています。
Play!は、データベースとのやりとりに「JPA(Java Persistance Architecture)」を採用しています。これはJava EEに用意されている、オブジェクトの永続化のための技術です。多くのWebアプリケーションでは、データベースとのやりとりにSQLのクエリーを送信するなどしていますが、Play!では、SQLはほとんど登場しません。「モデル(Model)」と呼ばれるクラスを定義し、そのメソッドを呼び出すだけでほとんどの操作を行うことができます。
また、データベースを利用するようになった場合、データベースの基本操作や、特定の人間がログインして操作するようにするための仕組みなども必要になってきます。こうした機能を素早く構築する方法についてもあわせて説明しましょう。
対象読者
- Javaで手ごろなフレームワークを探している技術者
- 最近のフレームワークをごくざっと理解しておきたい方
- Web開発の手法がどうも気に入らない、と常々考えているJavaプログラマ
データベースの設定
Webアプリケーションとデータベースは切っても切り離せない関係にあります。しかし、Javaでは、これまでデータベースアクセスと言うと「JDBCでSQLのクエリーを送ってデータを取り出す」といったアプローチが一般的でした。HibernateなどのO/Rマッピングによりだいぶそのあたりの事情は変わりましたが、Strutsなどでは標準でこうした技術は組み込まれておらず、自分でそれらを組み込むなりして使わなければいけませんでした。Play!では、標準でデータベースアクセスのための機能がちゃんと用意されています。
MVCアーキテクチャーでは、データベースとのやりとりは「モデル」によって行われます。データベース操作は、まず必要なモデル・クラスを定義し、それを呼び出すことで行うわけです。こうすることで、データベース固有の処理をプログラム本体から切り離すことができます。Play!でも、モデルを定義することが、データベース利用の基本となります。では、実際にやってみましょう。
まずは、使用するデータベースに関する設定を用意します。Play!には、標準でHSQLというpure javaなデータベースプログラムが内蔵されており、学習レベルならこれで十分と言えるでしょう。application.confを開き、そこに次のように記述してください。
db=mem
これは、HSQLでメモリ上にデータを保管するモードを示します。メモリに保管されますから、サーバを終了すると同時に消えてしまいます。プログラムの動作確認であれば、これで十分でしょう。データをきちんと保管したい場合は「db=fs
」としてください。これはファイルにデータを保管するモードを示すものです。
今回は使用しませんが、HSQL以外のデータベースもPlay!では使用できます。例えば、MySQL5を使う場合は、次のように設定を追記します。
db=mysql:ユーザー名:パスワード@データベース名
いずれにせよ、ただ1行の設定を書くだけです。設定を書き換えるだけで、それ以外のプログラムはまったく変更せずにデータベースを切り替えることができます。これがモデルを利用する最大の利点でしょう。「データベースを切り替えることなんてそんなにないだろう」と思うでしょうが、例えば開発時にはダミーのデータベースを使い、正式リリース時には正規のデータベースにアクセスさせる、というようなことはよくあるのではないでしょうか。こうしたとき、コード内にSQL文が直接埋め込まれている場合、どれだけ大変か容易に想像できるでしょう。
モデルの作成
では、モデルを作成しましょう。今回は、ごく単純なメッセージを保管するデータベースを考えてみます。名前とメモと作成日時だけを保存するシンプルなモデルを作成しましょう。「app」内の「models」フォルダ内に、新たに「MsgData.java」というソースコードファイルを作成し、次のように記述をします。
package models; import java.util.Calendar; import java.util.Date; import javax.persistence.Entity; import play.db.jpa.Model; @Entity public class MsgData extends Model { private static final long serialVersionUID = 1L; public String message; public String name; public Date time = Calendar.getInstance().getTime(); public MsgData(String message,String name){ this.name = name; this.message = message; } }
これが、今回扱うメモのデータを保管するクラスです。クラスの定義直前に「@Entity
」というアノテーションが記述されています。これは、このクラスがJPAの「エンティティ」であることを示すものです。エンティティとは、Java EEで扱われるデータオブジェクトで、JPAでデータを永続化するためには、それがエンティティであることを示しておく必要があるのです。
今回作成したMsgDataクラスは「play.db.jpa.Mode
」というクラスを継承して作成しています。モデルは、このクラスを継承するのが基本と考えてください。クラス内には、message
、name
、time
といったフィールドがあり、ここに各データを保管します。このうち、日時であるdate
はインスタンスを作る段階で既に現在の日時が保管されるようにしてあります。message
とname
は、引数に渡されたものをそのまま使ってインスタンスを作成できるようコンストラクタを用意してあります。
エンティティというのがなじみがないかもしれませんが、クラスの定義そのものはごくありふれたBeanであることが分かるでしょう。データの検索や保存などに関する処理などもまったくありません。ただ、データを保管するフィールドとコンストラクタを用意しているだけです。