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
- @Entity
- play.db.jpa.Model 自動提供一個 @Id (Long), 並在 DB table 成為 PK
- play.db.jpa.JPASupport class 是 play.db.jpa.Model 的父 class,提供了一些實用方法用來完成從 domain object 到 DB 之間的映射。
表 1 中列出了一些重要的方法,包括常用的增刪改查操作。 表 1. play.db.jpa.JPASupport API 說明
方法 | 說明 |
---|
create(type, name, params) | 用來創建領域對象類的一個實例。參數 type 表示的是領域對象類,類型是 java.lang.Class ;name 表示的是領域對象類的名稱;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); |
|
|