大家都知道,GAE中是使用JDO来做持久层的。当初我在做自己的清风记账本的时候,去网上找了一些资料,但是国内用的人很少,找到的资料基本上少的可怜,先在将清风记账本这个应用中的JDO一些基本语法公布出来。
每个使用数据存储区的请求都新建一个 PersistenceManager 类的实例。使用 PersistenceManagerFactory 类的实例完成此操作。
PersistenceManagerFactory 实例的初始化需要时间。好在您对于应用程序只需一个实例,而该实例可存储在将由多个请求和多个类使用的静态变量中。简单的做法是为静态实例创建一个单独的包装器类。
一:增加:
/**
* 保存
*
* @param accBean 要保存的实体对象
*/
public void saveAccount(Pay accBean) {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(accBean);
} finally {
pm.close();
}
}
二:查询
public List<Pay> qryAccount(int startNum, int endNum, User user) {
if (startNum > endNum) {
return null;
}
List<Pay> accountList2 = new ArrayList<Pay>();
List<Pay> accountList3 = new ArrayList<Pay>();
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = null;
try {
List<Pay> accountList = null;
pm.setDetachAllOnCommit(true);
//类似于参数
String queryTemplate = "",filter="";
String username = user.getEmail();
//替换的值
queryTemplate = "email == \"%s\" ";
filter = String.format(queryTemplate, username);
query = pm.newQuery(Pay.class,filter);
//排序
query.setOrdering("useDate desc");
accountList = (List<Pay>) query.execute();
// 管理员
if (!user.getEmail().equals("scholers@gmail.com")) {
for (Pay tempBean : accountList) {
if (tempBean.getUser().getEmail().equals(user.getEmail())) {
accountList2.add(tempBean);
}
}
} else { // 普通用户
accountList2.addAll(accountList);
}
//
if (accountList2 == null) {
return new ArrayList<Pay>();
}
if (endNum > accountList2.size()) {
endNum = accountList2.size();
}
accountList3.addAll(accountList2.subList(startNum, endNum));
if (accountList3 != null) {
return accountList3;
} else {
return new ArrayList<Pay>();
}
} catch (RuntimeException e) {
e.printStackTrace();
} finally {
query.closeAll();
pm.close();
}
return accountList3;
}
三:统计:
public int qryAccCount(String email, String times) {
//List<Pay> accountList2 = new ArrayList<Pay>();
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = null;
try {
List<Pay> accountList = null;
pm.setDetachAllOnCommit(true);
String queryTemplate = "", filter = "";
//日期参数的传递
//日期参数支持>=,<=的方式
if(times != null && !times.equals("")) {
queryTemplate = "email == \"%s\" && useDate == today";
} else {
queryTemplate = "email == \"%s\" ";
}
filter = String.format(queryTemplate, email);
query = pm.newQuery(Pay.class, filter);
//查询结果排序方式
query.setOrdering("useDate desc");
if(times != null && !times.equals("")) {
//这里类似于声明,声明这个参数类型
query.declareImports("import java.util.Date");
query.declareParameters("Date today");
//格式化参数
DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
Date today = null;
try {
today = format1.parse(times);
} catch (ParseException e) {
e.printStackTrace();
}
//执行查询
accountList = (List<Pay>) pm.newQuery(query).execute(today);
} else {
accountList = (List<Pay>) pm.newQuery(query).execute();
}
if (accountList != null)
return accountList.size();
else
return 0;
} finally {
pm.close();
}
}
多个参数的传递:
query.declareImports("import java.util.Date");
//开始日期--这里事先要声明
query.declareParameters("Date today, Date today2");
DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
Date today = null;
try {
today = format1.parse(times);
} catch (ParseException e) {
e.printStackTrace();
}
//结束日期
//query.declareParameters("Date today2");
Date today2 = null;
try {
today2 = format1.parse(times2);
} catch (ParseException e) {
e.printStackTrace();
}
//查询结果排序方式
query.setOrdering("useDate desc,id desc");
accountList = (List<Pay>) query.executeWithArray(today, today2);
//这里可以将两个参数的值传入
四:删除
public void delAccount(long accountId) {
if (accountId <= 0) {
return;
}
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
Pay accBean = pm
.getObjectById(Pay.class, accountId);
pm.deletePersistent(accBean);
} finally {
pm.close();
}
}
注意:GAE不支持SUM的统计方法我用如下代码:
query.setResult("sum(price)");
List results = (List)query.execute();
就会直接报出错误信息,而根据JDO的描述,JDO是支持的!
010-11-26 13:06:40 com.google.appengine.tools.development.DevAppServerImpl start
信息: The server is running at http://localhost:8888/
org.datanucleus.store.appengine.query.DatastoreQuery$UnsupportedDatastoreOperatorException: Problem with query <SELECT sum(ID) FROM com.scholers.account.bean.Pay WHERE email == "scholers@gmail.com">: App Engine datastore does not support operator sum.
at org.datanucleus.store.appengine.query.DatastoreQuery.validateResultExpression(DatastoreQuery.java:679)
at org.datanucleus.store.appengine.query.DatastoreQuery.validate(DatastoreQuery.java:618)
at org.datanucleus.store.appengine.query.DatastoreQuery.performExecute(DatastoreQuery.java:215)
at org.datanucleus.store.appengine.query.JDOQLQuery.performExecute(JDOQLQuery.java:89)
at org.datanucleus.store.query.Query.executeQuery(Query.java:1489)
at org.datanucleus.store.query.Query.executeWithArray(Query.java:1371)
at org.datanucleus.store.query.Query.execute(Query.java:1344)
at org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:221)
分享到:
相关推荐
The App Engine SDK for Java includes a local development server as well as the tooling for deploying and managing your applications in App Engine. By downloading, you agree to be bound by the Terms ...
基于Google App Engine(GAE)的Java和GWT应用开发_Google App Engine Java and GWT Application Development Nov.2010
中文名: 基于Google App Engine(GAE)的Java和GWT应用开发 原名: Google App Engine Java and GWT Application Development 作者: Daniel Guermeur, Amy Unruh 资源格式: PDF 版本: 文字版 出版社: Packt ...
google app engine 的帮助文档 不过是英文版的 是我自己根据google官方文档用软件生成的chm版 有时候会出现“internet 脚本错误” 哪位高手可以修改以下让他不要出现 那就太感谢了
Eclipse Google 插件 Google App Engine SDK for Java Google App Engine文档 按钮 Google App Engine 开发包
google_appengine_1.9.10 for linux 发布于2014-08-28 To install on Linux: Unzip the App Engine SDK file you downloaded (google_appengine_1.9.10.zip), for example: unzip google_appengine_1.9.10.zip ...
一个应该在Google App Engine 上的一个实例。用Java语言编写,里面包含源代码。致以Google App Engine是什么,请Google。 实例部署的地址是:http://hellojavaweb.appspot.com
GAE(Google App Engine)空间 GAE(Google App Engine)空间申请使用教程及 GAE域名捆绑方法使用教程及 GAE域 GAE(Google App Engine)空间申请使用教程及 GAE域名捆绑方法捆绑方法
Google App Engine for Java快速入门指南v1.2.0
Google App Engine for java.GAE for java,Eclipse开发环境,入门上手简单快速。
Google App Engine is a key component of the Google Cloud Platform and one of the most comprehensive cloud services. Together with Python, the first programming language ever supported by the platform,...
clock.rar 这是我今天做的一个基于google app engine写的一个在该平台上开发app的示例,通过该示例的学习,我们可以很快上手学会怎样在GAE上开发属于你的应用程序了,希望对大家有用!
2017最新MSI安装包,Google_App_Engine_SDK_for_Python,方便网速不好的同学下载
[基于Google.App.Engine(GAE)的Java和GWT应用开发].(Google.App.Engine.Java.and.GWT.Application.Development).Daniel.Guermeur.文字版
云应用开发——Google App Engine & Google Web Toolkit入门指南 Google App Engine入门 Google App Engine 开发人员指南
Google云端的一个重要部分,主要介绍了Google中App Engine的限制。
菜鸟用GAE(Google_App_Engine)完全指南,网络穿越配置指南
基于Google.App.Engine(GAE)的Java和GWT应用开发
download time: 2015-07-28 Google App Engine SDK for Java
GAE Google App Engine 数据库部分