2015年12月21日月曜日

GAEのデータストアからの検索、挿入、削除、更新

目次へ



GAEのデータストアにJDOでアクセスし、データの検索、挿入、削除、更新をする方法です。
データストアには、Persistence Managerというオブジェクトを使い、アクセスします。
  • Persistence Managerの取得
  • カインドの定義(RDBのテーブルの定義にあたる)
  • データの挿入
  • JDOQLによる検索
  • データの削除
  • データの更新


■■■■Persistence Managerの取得

JDOによるデータストアからの検索、書き込みにはPersistence Managerというオブジェクトを使います。
Persistence ManagerオブジェクトはPersistence Manager Factoryというファクトリオブジェクトを使って作成します。
下のPMFクラスはPersistence Manager Factoryのインスタンスを1つだけ作成するシングルトンです。
PMFクラス
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

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



■■■■カインドの定義

JDOではアノテーション付きのクラスを定義することでカインドを定義します。
下のSyouhinクラスはnameとpriceというプロパティとLong型のキーを持つSyouhinカインドを定義しています。
カインドとはRDBの表だと思ってください

  • @PersistenceCapable このクラスがカインドを定義するためのクラスであることを示します。
  • @PrimaryKey このフィールドがキーであることを示します
  • @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY) キーを自動で作成することを示します
  • @Persistent このフィールドをデータストアへ書き込むことを示します
Syouhinクラス
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.search.SortExpression.SortDirection;

@PersistenceCapable
public class Syouhin {

 @PrimaryKey
 @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
 private Long key; //自動で作成するキー

 @Persistent
 private String name; //商品名

 @Persistent
 private Integer price; //価格

 //-------------------------------- getter setter
 public Long getKey() {
  return key;
 }
 public void setKey(Long key) {
  this.key = key;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Integer getPrice() {
  return price;
 }
 public void setPrice(Integer price) {
  this.price = price;
 }



■■■■データの挿入

次のメソッドはsyouhinオブジェクトをデータストアに格納します
格納するメソッド
public boolean insert(Syouhin syouhin) {
 PersistenceManager pm = PMF.get().getPersistenceManager();
 try {
  pm.makePersistent(syouhin);
  return true;
 } catch(Exception e) {
  e.printStackTrace();
  return false;
 } finally {
  pm.close();
 }
}



■■■■JDOQLによる検索

次のメソッドはどちらも、データストアの中のSyouhinカインド内のすべてのエンティティを取得します
Single-String JDOQLによる全検索
public List selectAll() {
 PersistenceManager pm = PMF.get().getPersistenceManager();

 try {
  //------------- Single-String JDOQLによる検索
  Query query = pm.newQuery("SELECT FROM SYOUHIN");
  List list = (List)query.execute();
  return list;
 } catch(Exception e) {
  e.printStackTrace();
  return null;
 } finally {
  pm.close();
 }
}



Declarative JDOQLによる全検索
public List selectAll() {
 PersistenceManager pm = PMF.get().getPersistenceManager();
 
 try {
  //------------- Declarative JDOQLによる検索
  Query query = pm.newQuery(Syouhin.class);
  List list = (List)query.execute();
  return list;
 } catch(Exception e) {
  e.printStackTrace();
  return null;
 } finally {
  pm.close();
 }
}



キーを指定して検索(キー以外でも使える)
public Syouhin selectByKey(long number) {
 PersistenceManager pm = PMF.get().getPersistenceManager();

 try {
  //---キーを作成
  Key key = KeyFactory.createKey(Syouhin.class.getName(), number);

  //---そのキーのデータを取得
  Syouhin syouhin = pm.getObjectById(Syouhin.class, key);

  return syouhin;
 } catch(Exception e) {
  e.printStackTrace();
  return null;
 } finally {
  pm.close();
 }
}



条件を指定して検索(キー以外でも使える)
public List selectByKey(long number) {
 PersistenceManager pm = PMF.get().getPersistenceManager();

 try {
  //------------- とりあえずすべてを選択するクエリー
  Query query = pm.newQuery(QData.class);
 
  //---条件作成 numberというパラメータを指定している
  query.setFilter("key==number");

  //---パラメータnumberの型を指定
  query.declareParameters("long number");

  //---パラメータに実際の値を入れて実行
  List results = (List) query.execute(number);

  return list;
 } catch(Exception e) {
  e.printStackTrace();
  return null;
 } finally {
  pm.close();
 }
}



Single-String JDOQLによる条件検索
public List selectByKey(String name) {
 PersistenceManager pm = PMF.get().getPersistenceManager();

 try {
  //------------- JDOQL作成
  String str = "select from " + Syouhin.class.getName() +
   " WHERE name==" + name + " order by price ASC";
  List list = (List) pm.newQuery(str).execute();

  pm.close();
  return list;
 } catch(Exception e) {
  e.printStackTrace();
  return null;
 } finally {
  pm.close();
 }
}



■■■■データの削除

次のメソッドはすべてのsyouhinオブジェクトをデータストアから削除します
Syouhinカインド内のすべてのエンティティを削除するメソッド
public boolean deleteAll() {
 PersistenceManager pm = PMF.get().getPersistenceManager();
 try {
  Query query = pm.newQuery(Syouhin.class);
  List list = (List)query.execute();
  // いったん取得したものすべてを削除
  pm.deletePersistentAll(list);
  return true;
 } catch (Exception e) {
  e.printStackTrace();
  return false;
 } finally {
  pm.close();
 }
}



選択した1つのSyouhinを削除するメソッド
public boolean deleteByKey(long number) {
 PersistenceManager pm = PMF.get().getPersistenceManager();
 try {
  //---キーを作成
  Key key = KeyFactory.createKey(Syouhin.class.getName(), number);

  //---そのキーのデータを取得
  Syouhin syouhin = pm.getObjectById(Syouhin.class, key);

  // 取得したものを削除
  pm.deletePersistent(syouhin);
  return true;
 } catch (Exception e) {
  e.printStackTrace();
  return false;
 } finally {
  pm.close();
 }
}



■■■■データの更新

更新は、選択したオブジェクトを変更すればよい
public boolean update(Syouhin s) {
 PersistenceManager pm = PMF.get().getPersistenceManager();
 try {
  //---キーを作成しそのキーのデータを取得
  Key key = KeyFactory.createKey(Syouhin.class.getName(), s.getNumber());
  Syouhin syouhin = pm.getObjectById(Syouhin.class, key);
  syouhin.setName(s.getName());
  syouhin.setPrice(s.getPrice());
  return true;
 } catch(Exception e) {
  e.printStackTrace();
  return false;
 } finally {
  pm.close();
 }
}



にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

2015年12月7日月曜日

GAEのデータストア上のデータ構造

目次へ

  • データストア上のデータ構造
  • データストアに格納できるデータ型


■■■■データストア上のデータ構造

データストアに格納するデータ構造は次のようになります。


おおざっぱに言うとRDBのテーブルにあたるものがデータストアのカインド。
RDBのレコードにあたるものがエンティティ。
RDBの列項目にあたるものがプロパティになります。

また、各エンティティには、ユニークなキーが必要で、アプリケーションで指定することも、自動で作成することもできます。


■■■■データストアに格納できるデータ型

エンティティの各プロパティには下表のような型の値を格納することができます。
文字列、バイト列に対しては、500バイト未満と500バイト以上の型があります。

対応するJavaクラス
短い文字列(500バイト未満) String
長い文字列(500バイト以上) com.google.appengine.api.datastore.Text
短いバイト列(500バイト未満) com.google.appengine.api.datastore.ShortBlog
長いバイト列(500バイト以上) com.google.appengine.api.datastore.Blob
真偽値 boolean,Boolean
整数値 short,int,long,Short,Integer,Long
浮動小数点数 float,double,Float,Double
日時 java.util.Date
Googleアカウント com.google.appengine.api.users.User
エンティティキー com.google.appengine.api.datastore.Key
カテゴリ com.google.appengine.api.datastore.Category
電子メールアドレス com.google.appengine.api.datastore.Email
位置情報 com.google.appengine.api.datastore.GeoPt
インスタントメッセージのハンドル com.google.appengine.api.datastore.IMHandle
URL com.google.appengine.api.datastore.Link
電話番号 com.google.appengine.api.datastore.PhoneNumber
郵便番号 com.google.appengine.api.datastore.PostalAddress
評価値(1~100の整数値) com.google.appengine.api.datastore.Rating






にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村