Model Layer

Model Layer

Domain Ojbect

Play 觀點
  • Model 除了同如 JavaBean 的 get/set 特性外, 更應該有自已的 business logic
    • 宣告為 public 的 field, play 自動產生對應的 get/set methods, 或由開發者自行提供方法實作
  • Model 可以是任何的 Java class
  • Domain object class 須繼承 play.db.jpa.Model

表 1 中列出了一些重要的方法,包括常用的增刪改查操作。

表 1. play.db.jpa.JPASupport API 說明

方法說明
create(type, name, params)用來創建領域對象類的一個實例。參數 type 表示的是領域對象類,類型是 java.lang.Classname 表示的是領域對象類的名稱;params表示的是一個包含了實例中屬性值的類型為 java.util.Map<java.lang.String,java.lang.String[]> 的哈希表。
edit(obj, name, params)用來編輯領域對象類的一個實例。參數 obj 表示的是領域對象實例;參數 name 和 params 的含義與 create() 方法的相同。
delete()用來刪除單個領域對象類的實例。
delete(query, params)用來刪除多個領域對象類的實例。參數 query 表示的是檢索待刪除實例的查詢,而 params 表示的是查詢所使用的參數。
deleteAll()用來刪除領域對象類的所有實例。
find(query, params)用來查找領域對象類的實例。參數 query 表示的是查找時所用的查詢,而 params 表示的是查詢所使用的參數。
findAll()用來查找領域對象的所有實例。
findById(id)用來根據標識符查找領域對象的實例。
count(query, params)用來計算某個查詢結果中包含的領域對象的實例數。參數 query 和 params 的含義與 find() 方法相同。
save()用來保存該領域對象實例到數據庫中。
all()用來查找系統中的全部領域對象的實例。

表 1 中列出的方法中,find() 和 all() 方法的返回值是 play.db.jpa.JPASupport.JPAQuery 類的實例,表示一個領域對象實例的查詢結果。對於此查詢結果,可以進行進一步的操作。具體的操作,如 表 2 所示。


表 2. play.db.jpa.JPASupport.JPAQuery API 說明
方法說明
bind(name, param)用來綁定一個參數的實際值到查詢上。在查詢語句中可以使用形式參數作為佔位符,參數的實際值可以通過此方法來指定。
fetch()用來獲取此查詢的所有記錄。
fetch(max)用來獲取此查詢的前面 max 條記錄。
fetch(page, length)用來對查詢結果進行分頁。參數 page 表示當前的頁數,從 1 開始;length 表示每頁的記錄數。
first()用來返回查詢結果中的第一條記錄
from(position)用來設置查詢結果中處理的起始位置。參數 position 表示起始位置的序號。該方法的返回結果是一個新的play.db.jpa.JPASupport.JPAQuery 對象。

使用 表 2 中給出的方法,就可以在領域對象類中添加一些非常實用的方法,而不需要把這些方法添加到額外的服務層中。在示例應用中,Note 這個領域對象類表示的是用戶添加的記錄。代碼清單 1 中給出了 Note 類中的一些實用方法。


清單 1. 領域對象類中的實用方法
				
// 創建新的領域對象 Note 的實例,edit() 方法的使用與 create() 類似
Map<String, String[]> params = new HashMap<String, String[]>(); 
params.put("note.title", new String[] {"My note"}); 
params.put("note.content", new String[] {"My note's content"}); 
Note.create(Note.class, "note", params).save(); 

// 使用 find() 來進行查找
List<Note> notes = Note.find("byTitle", "My note").fetch(); 

// 使用 findById() 來查找單個實例
Note note1 = Note.findById(1); 

// 使用 delete() 來刪除對象實例
Note.delete("byTitle", "My note"); 

// 返回查詢結果中的第 2 到第 11 條記錄。
Note.find("byTitle", "My note").from(1).fetch(10); 

Comments