作者: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快速教程”系列文章