`
scholers
  • 浏览: 620371 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Google App Engine(GAE) FOR JAVA中JDO的简单使用说明

阅读更多
  大家都知道,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)

分享到:
评论
4 楼 scholers 2010-11-08  
alang 写道
明年2季度,GAE将推出纯sql版的支持,不过是收费服务。现在还都是Datastore方式。



这个也开始收钱了啊,,
3 楼 scholers 2010-11-08  
alang 写道
总结的不错。



谢谢!
2 楼 alang 2010-11-08  
明年2季度,GAE将推出纯sql版的支持,不过是收费服务。现在还都是Datastore方式。
1 楼 alang 2010-11-08  
总结的不错。

相关推荐

    基于Google.App.Engine(GAE)的Java和GWT应用开发.pdf

    中文名: 基于Google App Engine(GAE)的Java和GWT应用开发 原名: Google App Engine Java and GWT Application Development 作者: Daniel Guermeur, Amy Unruh 资源格式: PDF 版本: 文字版 出版社: Packt ...

    初用Google App Engine for Java (org.apache.jasper.JasperExceptio; org.datanucleun)

    在IT行业中,Google App Engine(GAE)是一个非常流行的云平台,它允许开发者使用Java、Python、Go等语言构建和运行web应用。本篇将详细探讨在初用Google App Engine for Java时可能会遇到的问题,以及如何解决这些...

    Apress - Beginning Java Google App Engine(Java)(Dec 2009).pdf

    Google App Engine (GAE) 是一个强大的云服务平台,允许开发者使用多种语言(包括 Java)创建高度可扩展的 Web 应用程序。本书主要聚焦于 Java 版本的 GAE。 - **核心组件:**书中详细介绍了 GAE 的 SDK(软件开发...

    appengine-java-sdk-1.9.24

    在本例中,我们关注的是专为 Java 开发者设计的 SDK 版本——"appengine-java-sdk-1.9.24"。 **1. GAE 平台** Google App Engine 平台支持多种编程语言,包括 Python、Java 和 Go。它提供了动态扩展性,能够根据...

    google app engine java ext 留言网站

    在本案例中,AppEngine为这个留言网站提供了运行环境,处理用户的请求,执行Java代码,并与数据库进行交互。 【ExtGoogleProject】 这个文件名可能是项目的根目录或者压缩包的名称,暗示了这个项目是使用EXT框架...

    配置 google app 配置 spring. 配置jdo

    1. **设置 Google App Engine 项目**:创建一个新的GAE项目,下载SDK,并在本地环境中配置项目结构,包括`appengine-web.xml`配置文件。 2. **集成 Spring**:引入Spring库,更新`pom.xml`或`build.gradle`文件,...

    GAE--java使用入门.doc

    **Google App Engine (GAE) 是一个云服务平台,允许开发者使用Java或Python语言构建和运行应用程序。本教程主要关注Java的使用。** 首先,创建一个App Engine应用程序非常快速且免费,您可以在几分钟内将应用上传并...

    Google app engine plugins Eclipse Google 插件 3.3

    项目模板会自动包含必要的框架和配置文件,如 `appengine-web.xml` 和 `web.xml`。 3. **开发环境集成**:Eclipse 插件提供了一个内置的本地服务器,允许你在开发过程中实时预览和测试应用。你可以通过插件的调试...

    Struts2,Spring,JDO,AJAX on GAE

    这篇博客“Struts2,Spring,JDO,AJAX on GAE”可能探讨了如何在Google App Engine (GAE)平台上整合这些技术来构建高效且可扩展的Web应用。 1. Struts2:Struts2是一个基于MVC(Model-View-Controller)设计模式的...

    gae-ce-jdo-maven:由JDO和Maven支持的带有云端点的GAE(Google App Engine)示例项目

    gae-ce-jdo-maven 由JDO和Maven支持的带有Cloud Endpoints的GAE(Google App Engine)示例项目。 为了理解这一点,您应该熟悉 。 此存储库中的代码基于并附加了对的支持。 添加了SampleJdoClass.java和...

    云端代码:利用Google.AppEngine编程.源代码

    【Google AppEngine编程详解】 Google App Engine(GAE)是Google提供的一项托管服务,它允许开发者在Google的基础设施上运行自己的应用程序。这个平台基于云计算,为开发者提供了强大的资源,包括服务器、数据库和...

    guiatransmetro-gae:用于 GuiaTransmetro 的 Google AppEngine 后端 Java 应用程序

    【标题】:“guiatransmetro-gae:Google AppEngine 后端 Java 应用程序为 GuiaTransmetro 提供支持” 【描述】:“这个项目,guiatransmetro-gae,是一个基于Google AppEngine的Java应用程序,专为GuiaTransmetro...

    appengine-jersey-jackson-jdo:带有Jersey,Jackson和JDO依赖关系的Google App Engine Maven项目

    标题中的“appengine-jersey-jackson-jdo”是一个基于Google App Engine的Maven项目,它集成了三个关键的技术框架:Jersey、Jackson和JDO。让我们深入了解一下这些技术及其在项目中的作用。 **Google App Engine ...

    flex + spring + BlazeDS + google App JDO 实现一个CRUD.

    标题中的“flex + spring + BlazeDS + google App JDO 实现一个CRUD”是指使用Adobe Flex作为前端开发工具,Spring框架作为后端服务层,BlazeDS作为数据推送中间件,以及Google App Engine的JDO(Java Data Objects...

    GoogleAppEngineServlet:Google App Engine 上的简单 Java Servlet

    在本文中,我们将深入探讨如何在Google App Engine (GAE)平台上使用Java Servlet来构建一个简单的RESTful服务。Google App Engine是一个云托管平台,允许开发者使用Java、Python、Go等语言构建并运行web应用程序。...

    tutorial-google-appengine-java:Google App Engine Java 编程教程的支持代码

    在提供的压缩包文件“tutorial-google-appengine-java-master”中,你将找到整个教程的源代码和示例项目。通过阅读代码和跟随教程,你可以逐步学习如何创建、配置、运行和部署一个基本的GAE Java应用。这将包括设置...

    jdo API 2.2

    在Google App Engine (GAE)环境中,JDO API 2.2是开发者常用的工具,它允许应用程序与GAE的数据存储服务进行交互。JDO 2.2提供了一种简单、灵活且强大的方式来管理对象的生命周期,包括创建、查询、更新和删除对象。...

    spring+gae

    1. **依赖注入**:Spring的DI(依赖注入)使得在GAE环境中管理对象及其依赖关系变得简单,无需使用GAE特有的服务定位器模式。 2. **数据存储**:Spring与GAE的数据存储API(如JDO或JPA)结合,可以提供一个统一的...

Global site tag (gtag.js) - Google Analytics