白猫のメモ帳

C#とかJavaとかJavaScriptとかHTMLとか機械学習とか。

Play Frameworkで遊びたい③

続き。

EclipseからrunしたらCtrl+Dで止まらないのでバッチを作りました。
でも、エラーはEcliseコンソールに出てほしい人だから、
PIDでjava.exeをkillするバッチを作って無理やり止めてもいいかもしれない。


さておき。

今回の目標
「DBアクセスができるようにしたい」

普段はOracle+JDBCで接続している私ですが、
今回はMySQL+EbeanでのDBアクセスにチャレンジ。

Playの推奨しているH2を使ってみてもいいのだけれど、
あれってオブジェクトブラウザでクエリ叩いたりできるの?


MySQLをセットアップする

XAMPPがインストール済みだったので既にありました。
これはまぁ特に困ることはないはずなので割愛。


MySQLにA5からアクセスできるようにする

phpMyAdminでも十分といえば十分なのですが、
A5好きなので接続できるようにしておきたい。

1. まずはXAMPからApacheMySQLを起動。
f:id:Shiro-Neko:20150703121005j:plain

2. http://localhost/phpmyadmin にアクセスして、
ユーザを作るなりrootのパスワードを変更するなりする。

なんだかんだでコマンドラインの方がやりやすかったりすることもあるので、
mysqlにパスを通しておくとよい。

3. A5で「データベースの追加と削除」⇒「追加」⇒「MySQL(直接接続)」
ユーザとパスワードは2で設定したもの。
f:id:Shiro-Neko:20150703165740j:plain

③PlayにDB設定を適用

1. conf/application.confに以下を追加。

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost:3306/test_db"
db.default.user=test_db
db.default.password="test_db"
ebean.default="dbmodels.*"

もちろんユーザとかパスワードとかは各自で。
ebean.defaultはエンティティとして利用したクラスを置くパッケージを指定。

2. project/pulugins.sbtに以下を追加。

addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0")

コメントアウトされているだけかも

3. build.sbtに以下を追加。

lazy val root = (project in file(".")).enablePlugins(PlayEbean)

libraryDependenciesの中に
"mysql" % "mysql-connector-java" % "5.1.31"

5. 更新を反映
activatorコンソールで「reload」と「update」を実行。
これってやらなくても起動時に反映されるの…?


④エンティティの作成

ebean.default="dbmodels.*"と設定したので、
エンティティはdbmodelsパッケージの配下に作成する。

1. com.avaje.ebean.Modelを継承してエンティティクラスを作成する。

2. クラスにEntityアノテーションをつける。

3. publicフィールドでカラムを定義し、主キーにはIdアノテーションをつける。

4. finderをstaticで定義する。

@Entity
public class User extends Model {

	@Id
	public Long id;

	public String name;

	public static Find<Long, User> find = new Find<Long, User>() {};
}


⑤コントローラで呼び出してみる

List<Message> datas = Message.find.all();


この状態でサーバを起動してみると、
「Database 'default' needs evolution!」というメッセージが出る。

f:id:Shiro-Neko:20150703170229j:plain

「Apply this script now!」をクリックするとデータベースにテーブルが勝手にできる。

すごい!

ちなみに編集するとまたこの画面が出て反映してくれるらしい。


※最初にフィールドにDate型を設定したらテーブルができなかった。
 なんでかと思っていろいろ調べていたら、MySQLのバージョンが古かったため、
 生成されるSQLが構文エラーになっていた。
 SQLファイル自体はconf/evolutions/defaultの下に生成されるので、
 適当にいじって手動で流せば大丈夫かも。(MySQLのバージョンを上げろって話…)


一応これでDBアクセスができるようになった。
設定とかは難しいけれど、いったん作ってしまえば簡単にできそう…かな?