2010/01/28

Play!(2-1)

說到Struct和JSF這些Java Framework,它們都沒有一個標準的資料庫關系的功能。但是從ROR(Ruby on Rails)以
後的MVC Framework,負責存取資料庫部份的「Model」卻佔有著重要的角色。

Play!的資料庫存取是使用「JPA(Java Persistance Architecture」,這是為Java EE所準備的,為了要使物件
永續化的技術,大多數的網頁應用程式的資料庫是使用傳送SQL詢問句來做存取的動作,但是在Play!裡,SQL幾乎都不會
出現。只要定義一個被稱為「Model」的類別,並呼叫它的方法就能進行資料庫操作。

而且,在使用資料庫的場合,資料庫的基本操作和根據特定的人連線進入操作的權限不同也變的是需要的。

資料庫的設定

網頁應用程式和資料庫的關係是不管怎麼切都切不斷的關係,在Java裡,從以前到現在的資料庫存取就是由「JDBC用
SQL的詢問送出來取得資料」的一般存取方法。Hibernate等的O/R映射並沒有改變太多這樣的概念,Structs等並
沒有這些標準的技術來存取資料庫,還需要自己組合才可以使用,在Play!裡就有準備了一個標準的資料庫存取機能

MVC架構裡,資料庫的存取是由「Model」所實行的,要操作資料庫,首先定義必要的Model類別,然後呼叫出來使用,這
樣子可以將資料庫的獨特的處理部份與程式本體分離開來,Play!也是一樣,定義Model這件事情成為了資料庫使用的
基本,讓我們來實際做做看吧。

首先,準備使用資料庫的相關設定,在Play!裡已經內藏一個名為HSQL的純Java資料庫程式,以學習等級而言,這個就
足夠了,打開application.conf,然後加入一行

db=men

這是表示使用HSQL在記憶體上保管資料的模式,因為是保管在記憶體裡,所以當Server終了的時候,資料也會跟著消失,
要確認程式是否動作,這樣就已經很足夠了,想要將資料完整的保存的場合請使用「db=fs」,這是表示使用檔案保存的模式

雖然這次並不使用,HSQL以外的資料庫也可以在Play!上使用,例如想要使用MySQL5的話,就如同下面這樣把設定加入

db=mysql:$UserName:$Password@$DatabaseName

不管怎麼說,只要簡單的一行設定就可以了。只需要改變設定,除此之外其他的程式完全都不需要變更就能夠切換資料庫,
這就是使用Model的最大的優點,「資料庫的切換並不是這麼常有的吧?」有時候會這樣想,但是例如開發的時候使用替代
的資料庫,而在正式釋出後可以存取正式的資料庫,這樣的事情不是經常發生嘛?這種時候如果是直接把SQL語句寫在程
式碼內的話,想你也能夠想像這樣事情是有多麼的糟糕。

Model的作成

那麼,來製作Model吧,這次先思考看看一個極為單純的訊息保管資料庫。來作成一個只保存名字、訊息內容還有發布時間
的簡單Model吧。在「app」內的「model」資料夾裡製作一個新的檔案叫做「MsgData.java」,然後加入下列內容:

package models;

import java.util.Calendar;
import java.util.Date;
import javax.persistence.Entity;
import play.db.jpa.Model;

@Entity
public class MsgData extends Model {
        private static final long serialVersionUID = 1L;
        public String message;
        public String name;
        public Date time = Calendar.getInstance().getTime();
        
        public MsgData(String message,String name){
                this.name = name;
                this.message = message;
        }
}

這就是這次用來保存訊息的類別,在類別的定義前加上「@Entity」這個宣告,這表示說這個類別是JPA的「Entity」,
Entity是Java EE使用的資料物件,為了要用JPA來把資料永續化,所以標明它是Entity是必要的。

這次作成的MsgData類別是繼承「play.db.jpa.Model」這個類別來作成的,記得每一個Model都要繼承這個類別,
類別裡有message、 name、 time等欄位,各自保管自己的資料。在這裡面,代表時間的date在實例作成的階段就
已經將現在的時間保管了起來。message和name這兩個常數是準備用來接受傳遞的引數並直接作成實例。

稱作Entity可能會讓你覺得不太熟悉,但是說它只不過是一個很一般的Bean就應該很明瞭了。完全沒有任何資料的查找
和保存等的相關處理,只是僅僅準備了資料保管的欄位和常數而已。

原文參考:http://codezine.jp/article/detail/4751

No comments:

Post a Comment