來玩Play框架05 資料庫

Vamei發表於2014-05-07

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段宣告。謝謝!

 

資料庫是整個站點的資料儲藏室。使用者提交的資料可以儲存在資料庫中,以便未來使用。Play可以通過JDBC和資料庫通訊。我講介紹Play和mysql資料庫的連線。 

Play 2.*版本的預設運算元據庫的方式是通過Ebean。Play提供Finder這一幫助型別,可以實現一些簡單的資料庫查詢。

 

資料庫準備

在mysql中增加資料庫testing。增加使用者"player",密碼為"player"。為使用者player增加適當的許可權。

CREATE DATABASE testing DEFAULT CHARACTER SET utf8;
CREATE USER 'player'@'localhost' IDENTIFIED BY 'player';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES ON testing.* TO 'player'@'localhost';

 

為了在Play中使用mysql資料庫,需要在conf/application.conf中增加設定:

# Database configuration

db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://127.0.0.1:3306/testing"
db.default.user="player"
db.default.password="player"

# Ebean configuration
ebean.default="models.*"

 

還需要修改build.sbt為:

name := "test"

version := "1.0-SNAPSHOT"

libraryDependencies ++= Seq(
  javaJdbc,
  javaEbean,
  cache,
  "mysql" % "mysql-connector-java" % "5.1.18"
)

play.Project.playJavaSettings

上面的改動完成後,使用play run來執行伺服器。

 

建立模型

下面,我在模型中增加一個實體(entity),即一個Person類。放入models/Person.java

package models;

import java.util.List;

import javax.persistence.Entity;
import javax.persistence.Id;

import play.db.ebean.Model;
import play.db.ebean.Model.Finder;

@Entity
public class Person extends Model {
    @Id
    public Integer id;
    public String name;

    // Query
    public static Finder<Integer,Person> find = 
            new Finder<Integer,Person>(Integer.class, Person.class);
    
    public static List<Person> findAll() {
        return find.all();
    }
    
    public static Person findByName (String name) {
        return find.where().eq("name", name).findUnique();
    }
}

Person類繼承自Model類,並有一個@Entity的註解,從而說明它是模型中的一個實體。實體有兩個場,整數的id和字串的name,用來儲存資料。

@id註解下,id將不為空,不重複,並自動增加。

Person還有一個靜態的場find。find是Play提供的Finder型別,用於資料庫查詢。而Person類中得findAll()和findByName()的靜態方法中,就呼叫了find,從而在資料庫中查詢條目。

 

Play有evolution模組,管理資料庫的表。寫好Person.java後,訪問專案。Play這時會生成在mysql中建立表格的指令碼。執行該指令碼即可。

 

增加資料庫條目

增加一個動作。這個動作向資料庫增加條目:

 

public static Result addPerson() {
    Person p1 = new Person();
    Person p2 = new Person();
    p1.name = "vamei";
    p2.name = "play";
    p1.save();
    p2.save();
    return ok("Saved");
}

*** 上面的程式碼要import models.Person

 

將/addPerson這一URL對應該動作。訪問後,資料庫將增加條目:

練習 根據表單一講的內容,增加一個向資料庫新增條目的表單。

 

資料庫查詢

我可以在動作中呼叫剛才定義的查詢方法findAll()和findByName(),比如增加allPerson()動作:

public static Result allPerson() {
    List<Person> persons = Person.findAll();
    return ok(views.html.personList.render(persons));
}

上面查詢得到的Person型別的表,傳遞給模板views/personList.scala.html:

@(personList: List[models.Person])

<!DOCTYPE html>
<html>
  <body>
    <ul>
      @for(person <- personList) {
        <li>@person.name</li>
      }
    </ul>
  </body>
</html>

修改routes,增加對應的URL為/allPerson,頁面如下:

事實上,我也可以在動作中直接呼叫Person.find,來組成查詢語句。這將讓動作內部有更大的查詢自由度。比如上面的動作可以改寫成:

public static Result allPerson() {
    List<Person> persons = Person.find.all();
    return ok(views.html.personList.render(persons));
}

 

總結

save()

Finder

 

歡迎繼續閱讀“Java快速教程”系列文章

相關文章