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技術メモへ
にほんブログ村

0 件のコメント:

コメントを投稿