Play Framework 2.3 For Java ことはじめ #4 データベース接続(EBean)編
Play Framework 2.3 For Java 入門記事一覧
第4回は、JDBCではなく、Play標準装備のORMであるEBeanを使ってデータベース接続します。
EBean
とは、JavaのオープンソースのORMで主にPlay Frameworkで使われてるみたいです。
Ebean is an open source (LGPL license) Java Object Relational Mapping tool. It uses JPA Annotations (@entity, @OneToMany ...) for mapping. It provides a simple API for fetching and saving object graphs.
なにはともあれ、第3回のサンプルをEBeanで動くようにしていきます。
1. application.confの設定を変更する
チュートリアルに従いEBeanの設定をします。
以下の箇所がコメントアウトされてるのでコメントアウトを外す。
ebean.default="models.*"
2. モデルを作成する
次に、eclipse上でmodelsパッケージを作って、その下に、Member.javaを作る。
チュートリアルを参考にしながら、memberテーブル用のクラスを作る。idはさっきはなかったけどこういうauto incrementな値も扱いたいからいれておく。
package models; import javax.persistence.Entity; import javax.persistence.Id; import play.db.ebean.*; import play.data.validation.*; @Entity public class Member extends Model { @Id @Constraints.Min(10) public Long id; @Constraints.Required public String name; public String email; public static Finder<Long, Member> find = new Finder<Long, Member>( Long.class, Member.class ); }
3. データ取得処理を書く
Application.javaに書いていたデータ取得処理をEBeanで取得するやり方に書き直す。
うん。直感的。
// 適当にデータ登録 Member member = new Member(); member.name = "hoge"; member.email = "hoge@example.com"; member.save(); // メンバー一覧取得してコンソールに出力 List<Member> members = Member.find.all(); for (Member member : members) { System.out.println(member.id + ":" + member.name + ":" + member.email); }
4. Evloutionによる状態不一致の検出
これでブラウザからアクセスすると、memberテーブルにidなんてないぞっていわれる。そりゃそうだid列追加してないもん。
この不一致を検知する仕組みがPlay FrameworkのEvolutionという仕組みなんです。
簡単に説明すると、モデル作って@Entity
ってアノテーションしておけば、モデルの状態とテーブルの状態をチェックして、DDLまで作成して、さらにDDLの実行までやってくれる至れり尽くせりなやつ。
Railsやってる人はすぐイメージつくんじゃないかな。Railsのdb:migrate
の仕組みみたいなもので、コードでDDLの管理をするというもの。
Playの場合はplay_evolutions
というテーブルが作られてそこにマイグレーションの状態が登録されていく。Railsの場合は、schema_migrations
みたいな感じだよね。
ただ、Railsのmigrationと違うのは、コマンドラインからrake db:migrate
みたいにコマンドで実行はできなくて、ブラウザからアクセスしたときに初めて実行されるというもの。ちょっとその辺はどっちかっていうと、Railsの仕組みの方が好きだなぁ。なんか長くなってしまった。とりあえずEvolutionはそういうものです。
5. テーブルきれいにしてEvolutionさせる
ということで、第3回で作ったテーブルをとりあえず削除するので、drop table member;
しちゃう。
そして、ブラウザからアクセスすると、memberテーブルないけど私が作ったこのDDL流します?みたいなメッセージと実行するボタンがご丁寧に出てくるので、それを押す。そうすると、DDLが流れてテーブル作ってくれる。で、ちょっと待ってると画面が表示されるようになります。
ちなみに、このときのEvolutionされたときのDDLは、conf/evolutions/default/1.sql
ってとこに勝手に出力されてます。sequenceとかちゃんとpostgreSQL用のsqlを出力してくれてますね。
1.sql
# --- Created by Ebean DDL # To stop Ebean DDL generation, remove this comment and start using Evolutions # --- !Ups create table member ( id bigint not null, name varchar(255), email varchar(255), constraint pk_member primary key (id)) ; create sequence member_seq; # --- !Downs drop table if exists member cascade; drop sequence if exists member_seq;
まとめ
EBean
での接続方法を知ろうと思っただけなのに、予期せずEvolutionという仕組みが入ってきたのでちょっと分かりにくくなってしまったかもしれません。とりあえず、Evolutionのことは忘れて、EBean
でのORMの書きやすさと設定の簡単さに着目してもらいたいです。
公式チュートリアルでは、次はJPAでの接続方法ですが、そのままではあれなので、公式サンプルソースで用意されているPlay with Spring Data JPA (Java)をもとにPostgreSQLで接続できるようにしてみます。ちなみに、JPAってなんなのかよく分かってないし、Spring Framework自体も触ったことないしどんなものか分かっていませんw
第5回はこちら -> Play Framework 2.3 For Java ことはじめ #5 データベース接続(Spring Data JPA)編