Google app engine 在数据存储gae中插入正确的前检查?
首先对不起我的英语我用谷歌翻译 我对使用Google App Engine是新手,我会放置一个用户,但首先我需要检查一个用户是否已经存在,我会在电子邮件中注明“是唯一的密钥”,并告知我是否使用了正确的方法 伪代码如下所示: 类NewUserGoogle app engine 在数据存储gae中插入正确的前检查?,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,首先对不起我的英语我用谷歌翻译 我对使用Google App Engine是新手,我会放置一个用户,但首先我需要检查一个用户是否已经存在,我会在电子邮件中注明“是唯一的密钥”,并告知我是否使用了正确的方法 伪代码如下所示: 类NewUser if not exist mail put user to database return true else return false Servlet插入器: if not NewUser.put redirect log
if not exist mail
put user to database
return true
else
return false
Servlet插入器:
if not NewUser.put
redirect login.jsp
else
redirect user.jsp
这是代码:
新用户类:
public static boolean insert(String name, String mail, String password) {
DatastoreService datastore = DatastoreServiceFactory
.getDatastoreService();
Key k = KeyFactory.createKey(User.class.getSimpleName(), mail);
if (!userExist(k)) {
Entity user = new Entity(k);
user.setProperty("name", name);
user.setProperty("password", Encrypt.MD5(password));
datastore.put(user);
return true;
} else {
return false;
}
}
private static boolean userExist(Key key) {
DatastoreService datastore = DatastoreServiceFactory
.getDatastoreService();
Query q = new Query(key).setKeysOnly();
List<Entity> ent = datastore.prepare(q).asList(
FetchOptions.Builder.withDefaults());
return (ent.isEmpty() || ent == null) ? false : true;
}
我可以让它在没有查询的情况下检查电子邮件吗
这段代码很有效,但我正在寻找如何改进的建议
提前感谢。要检查实体是否存在,您只需使用:
使用这种方法,考虑到几乎总是生成异常,它不会影响性能吗?最好避免例外情况?这对你真的有效吗
Query q=new Query(key)
创建一个祖先查询,其中key
是父实体。它不使用此键查询实体:查询有效。关键的用户实体是电子邮件。咨询关键祖先会更快吗?
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
resp.sendRedirect(NewUser.insert(req.getParameter("name"),
req.getParameter("mail"), req.getParameter("password")) ? "jsps/user.jsp"
: "jsps/login.jsp");
}
private static boolean userExist(Key key) {
DatastoreService datastore = DatastoreServiceFactory
.getDatastoreService();
try {
datastore.get(key);
} catch (EntityNotFoundException e){
return false;
}
return true;
}