480 likes | 695 Views
資料儲存. 教材. 湯秉翰 著 (2013) , 雲端網頁程式設計- Google App Engine 應用實作 ( 第二版 ) , 博碩文化, ISBN 978-986-201-824-8 ( 書號 PG31356) 鍾葉青、鍾武君 著 (2013) , 雲端計算, 東華書局, ISBN 9789861579030 ( 書號 CL009) 許清榮、林奇暻、買大誠 著 (2012) , 掌握 Hadoop 翱翔雲端 -Windoop 應用實作指南, 博碩文化, ISBN 978-986-201-673-2 ( 書號 PG21241)
E N D
教材 湯秉翰 著(2013), 雲端網頁程式設計-Google App Engine應用實作(第二版), 博碩文化, ISBN 978-986-201-824-8 (書號 PG31356) 鍾葉青、鍾武君 著(2013), 雲端計算, 東華書局, ISBN 9789861579030 (書號 CL009) 許清榮、林奇暻、買大誠 著(2012), 掌握Hadoop翱翔雲端-Windoop應用實作指南, 博碩文化, ISBN 978-986-201-673-2 (書號 PG21241) 鍾葉青、李冠憬、許慶賢、賴冠州 著(2011), 雲端程式設計: 入門與應用實務, 東華書局, ISBN 9789861578125 (書號 CL008)
章節大綱 Datastore JDO 類別與屬性 物件的儲存 資料查詢 更新實體資料 刪除實體資料
前言 GAE 的 Datastore 與傳統的關聯式資料庫不同,提供JDO 與 JPA 方式儲存資料
資料儲存 • 資料必須儲存在後端 • 由 Servlet 負責 • 前端接收使用者輸入後,利用 RPC 或 AJAX 傳遞至後端程式 • 傳統的資料庫系統不適合雲端應用 • GAEDatastore 為雲端儲存 • Schemaless • NoSQL
GAEDatastore • Entity 實體 • 儲存在 Datastore 裡的物件稱為實體(Entity) • 類比傳統關聯式資料庫表格中的記錄(Record) • Kind 種類 • 每一個 Entity 都屬於某一特定種類 • 分類的依據(Categorizes)
GAEDatastore • Entity 儲存時必須具備一個鍵值(Key) • Key 的組成元素 • Kind 分類 • Identifier 識別項,不可更改 • 名稱字串,使用者自訂 • 整數 ID,系統自動產生 • Ancestor Path(非必要) • 樹狀結構路徑
JDO(Java Data Object) • GAE 採用 JDO2 • 2001 年 JDO1 • Persistence 持久化 • 將物件儲存到不會因為斷電而消失之處
JDO(Java Data Object) Model
建構子 Source/Generate Constructor using Fields
識別鍵值-Key • Key 鍵值型態(com.google.appengine.api.datastore.Key) • 物件互相參照時,使用 Key 型態識別鍵值。 • 一個會員擁有一個聯絡資料 • 聯絡資料 ContactInfo • 會員 Member
物件的儲存 • PersistenceManager • 讀取資料 • 儲存資料 • 降低系統的負荷與時間成本 • PMF(Persistence Manager Factory) • 建立 PersistenceManager • 測試類別 ContactCRUD • 新增、讀取、修改、刪除
補充:Factory Design Pattern 讓次類別決定要實體化的類別為何
利用鍵值取得資料庫中的物件 • 當資料使用 long 為辨識鍵值,在呼叫PersistenceManager的makePersistent方法時,Datastore會為資料產生鍵值並儲存。 • 使用 getObjectById方法,以鍵值取得儲存在資料庫中的物件。
資料查詢 Query • 使用查詢「Query」可從資料庫中取得符合查詢條件的物件實體,可能沒有符合條件的資料,也可能是一個實體或是多個實體的集合。 • 傳回實體的鍵值(key) • 傳回完整的實體 • JDO的查詢語言-JDOQL • JDOQL是JDO的資料庫查詢語言標準 • 開發人員可以使用字串下達查詢條件,或是使用Java的方法設定查詢條件、排序與參數。 • javax.jdo.Query • Query 類別是 JDO 中專門用來查詢的類別 • 可由 PersistenceManager的 newQuery方法產生
字串方式查詢 • 查詢 Datastore中所有 Contact 實體
字串方式查詢 • 查詢 Datastore 中所有 Contact 實體鍵值
字串方式查詢(續) • 查詢 Datastore中所有符合name==‘Tom’ 的 Contact 實體
篩選器的運算元 • 篩選器的運算元可以是以下任一種: • < 小於。 • <= 小於或等於。 • == 等於。 • > 大於。 • >= 大於或等於。 • != 不等於。
字串方式查詢 • 查詢符合name值條件,並給予一個字串作為參數
字串方式查詢 • 查詢結果排序
使用JDO的方法(methods)查詢 查詢字串在不適合複雜的查詢,且程式碼不利維護。 Query類別提供了許多設定篩選器、排序與參數等方法實作出相同的效果
使用JDO的方法查詢 • 查詢 Datastore 中所有 Contact 實體。
使用JDO的方法查詢 • 查詢 Datastore 中所有 Contact 實體鍵值。
使用JDO的方法查詢 • 查詢Datastore中所有符合name==‘Tom’的Contact實體
使用JDO的方法查詢 • 查詢符合name值條件,並給予一個字串作為參數
使用JDO的方法查詢 • 在篩選器中亦可使用其他類別為外來參數
使用JDO的方法查詢 • 另法
使用JDO的方法查詢 • 查詢結果的排序 • 使用方法setOrdering可指定查詢結果的排序方式,ascending 為昇冪,descending 為降冪
更新實體資料 • 當利用PersistenceManager由Datastore中取得物件時,物件是「附接(attached)」在PersistenceManager身上 • 當物件的內容被修改或改變,當呼叫PersistenceManager的close方法關閉時,物件內容的修改將在關閉時,更新至Datastore。
更新實體資料 @PersistenceCapable(detachable="true") public class Contact{ … } • 若是不想在物件資料變動時一併更新至Datastore,則可在類別的可持久化標示語法中加入「detachable="true"」,代表該實體為可「卸離」
刪除實體資料 • 欲刪除一個Datastore內的物件,可呼叫PersistenceManager的「deletePersistent(物件)」方法
以JSP與Servlet實作會員註冊 • 以一個測試專案「store」為例,在專案中實作一個會員註冊功能 • 提供使用者輸入會員資料的頁面,將資料傳送至後端,再儲存至Datastore
JSP 與 JavaBean • JavaBean 是一個單純的類別,並遵循幾個特定被規範的要件: • 是一個公開(publie)類別。 • 具有公開的getter與setter方法(存取屬性) • 具有空參數的建構子。 • 對於網頁設計師很難在混雜有HTML標籤的程式碼中進行修改與維護。 • JavaBean-Member類別 • 為Member類別加入一個無參數的建構子 • 實作 java.io.Serializable • 設計getter與setter方法 • 程式碼區按下滑鼠右鍵,選擇「Source/ Generate setters and getters」
JSP 與 JavaBean • 使用<jsp:useBean>標籤 • 在JSP中若想要使用Member這個JavaBean,可使用JSP標籤宣告之: • <jsp:useBean id="member" class="com.store.Member" /> • 以EL標準得到member物件的屬性時,系統會自動呼叫該屬性的getter方法 • ${member.email}等於呼叫member.getEmail()方法 • 在JSP中使用Session與EL標籤必須先做必要的設定
在JSP中展示所有會員資料 <c:foreachvar="物件或變數名稱" items="集合" > … </c:foreach> • 使用JSTL標籤的foreach,將可提高JSP程式碼的可讀性,也提高網頁設計師修改JSP的效率。 • See query.jsp
物件之間的關係 • 一對一(one to one)關係 • 一個會員擁有一個聯絡資料 • 一對多(one to Many)的關係 • 留言版會員(Member)與該會員所發表的文章(Post),一個會員可能擁有許多文章
GAE規範中支援的集合類別 java.util.ArrayList java.util.HashSet java.util.LinkedHashSet java.util.LinkedList java.util.List java.util.Set java.util.SortedSet java.util.Stack java.util.TreeSet java.util.Vector
Datastore 管理介面 http://127.0.0.1:8888/_ah/admin