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