2014年1月9日 星期四

Google App Engine 連接資料庫(GAE Datastore)

Google App Engine中使用的資料庫並不是一般的SQL,而是有點類似SQL的GQL。

底下將會介紹五個不同的檔案,分別是
FunctionCall.java (將所有的Java功能全部寫在這個裡面,可以做呼叫)
PMF.java (主要是要使用到PersistenceManagerFactory這功能)
store.java (這個檔案有點類似像資料庫中的資料表)
WriteDataToDatastore.html (這是我寫的測試網頁,用來post資料給result.jsp)
result.jsp(處理post過來的資料,並且寫入到資料庫中)


FunctionCall.java
package com.study2fun.datastore;

import java.util.List;
import javax.jdo.Query;
import javax.jdo.PersistenceManager;

public class FunctionCall {

 public static void adddata(String name,String num){
  //宣告一個PersistenceManager
  PersistenceManager pm = PMF.get().getPersistenceManager();
  //創建一個資料表物件,並同時將資料寫入
  store db = new store(name,num);
  try{
   //透過PersistenceManager將資料表放入DataStore
   pm.makePersistent(db);
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   pm.close();
  }
 }
 
 //這邊是一個查詢功能,爾後會在連結Facebook那邊寫詳細一點
 public static List<store> sqlfile(String sql){
  PersistenceManager pm = PMF.get().getPersistenceManager();
  //此處可以做query的動作,有點類似SQL語法
  Query query = pm.newQuery(store.class);
  List<store> result = (List<store>) query.execute();
  
  return result;
  /*
   * for(filestore fs : result){
   * System.out.println(fs.???)
   * }
   * 
  */
 } 
}

PMF.java
package com.study2fun.datastore;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public class PMF {

 private static final PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional");
 private PMF(){}
 public static PersistenceManagerFactory get(){
  return pmfInstance;
 }
}



store.java
package com.study2fun.datastore;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

//這個地方有點像一個資料表的意思
@PersistenceCapable(identityType=IdentityType.APPLICATION)
public class store {

 //可以設定主鍵,這邊是讓系統自動產生流水號
 @PrimaryKey
 @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
 Long id;
 
 //各欄位的名稱和屬性
 @Persistent
 String name;
 
 @Persistent
 String num;
 
 //各欄位的名稱和屬性
 //@Persistent
 //int No;
 
 //設定建構子,將值傳進來
 public store(String name,String num){
  super();
  this.name = name;
  this.num = num;
  
 }
 
 
 public Long get_id(){return id;}
 public String get_name(){return name;}
 public String get_num(){return num;}

}


WriteDataToDatastore.html
<!DOCTYPE html>
<html>
<head>
<meta charset="BIG5">
<title>寫入資料庫測試</title>
</head>
<body>
<!-- 這邊簡單寫一個表單傳送的HTML網頁,並將值post到result.jsp這頁面 -->
<FORM action="result.jsp" method="post">
 名字:<INPUT name="name" size=10 maxlength=20><P>
 學號:<INPUT name="no" size=10 maxlength=20><P>
 
 <INPUT type="submit" value="送出表單">
 <INPUT type="reset" value="重新輸入">
 
</body>
</html>

result.jsp
<%@ page language="java" contentType="text/html; charset=BIG5" pageEncoding="BIG5"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=BIG5">
<title>Test</title>
</head>
<body>
<!-- 這邊是屬於JSP網頁,我們需要把該頁所用到的Java功能import進來 -->
<%@page import="com.study2fun.datastore.FunctionCall"%>

<!-- 在JSP頁面中使用JAVA Code需要使用<%/*...*/%>包起來,如下面 -->
<%
//這邊會接收剛剛post過來的資料,並且要設定好相對應的名稱(如上一頁的的參數name="?")
String name = request.getParameter("name");
String no = request.getParameter("no");
//呼叫Java功能,這邊是做寫入的動作
FunctionCall.adddata(name, no);
%>

<a href="http://127.0.0.1:8888/_ah/admin/datastore">查看本地資料庫</a>


</body>
</html>

執行本地端瀏覽器瀏覽結果
在要瀏覽的網頁檔上按下右鍵>>Run As>>Web Application





























底下的Development Mode那邊會顯示一個網址,可以點擊後瀏覽。
而右上角有一個雙黃色的箭頭「Reload web server」則是當有做任何修改的話,只需存檔後,按下此紐,就會重新載入網頁,無須再Run As......











檢視本地資料庫的方式為,請在網址那邊打上http://127.0.0.1:8888/_ah/admin/可以進入到本機端管理介面,此時我們可以先看到資料庫是沒有資料的。


















之後我們來嘗試新增一筆資料













新增完畢後,我們再到管理介面,並且列出資料




此時會發現剛剛新增的中文部分會顯示亂碼,英文則是正常的顯示,關於這點,目前在本地端不太要緊,之後上架到GAE平台後,可以支援中文的~



























完整專案檔下載:下載

7 則留言:

  1. 可以用xml作示範嗎???

    回覆刪除
    回覆
    1. 不好意思,不是很懂您的意思...><"

      刪除
  2. 有點小神奇
    完全沒用到Java Servlet

    回覆刪除
  3. 其實主要是因為這的平台是Google提供的~所以很多的功能不需要自己寫了~

    回覆刪除
  4. 這個範例 我有用GWT compile和 Deploy to app engine
    可直接在網路上使用google雲端的datastore

    請問這個範例 可以寫成讓.NET C#寫的網站來呼叫嗎?
    (呼叫來執行新增 刪除cloud datastore裡的東西 等等動作)

    回覆刪除
    回覆
    1. 請參考GAE官方有支援的語言:
      https://cloud.google.com/appengine/docs

      刪除
  5. 想請教一下,GAE有支援將一份Excel檔的資料直接匯入GAE的資料庫內嗎?

    回覆刪除