JavaでGoogle App Engineのデータストアにアクセスする方法として、JDO(Java Data Object)インターフェースが提供されている。JDOを使ったコーディングでは、「データクラス」、「インターフェース(PMF)クラス」、「処理クラス」の3つのクラスが必要になる。
- データクラスを作成する
データクラスは、データストアのkind(テーブル)の全property(フィールド)をクラス変数として持つクラスで、以下のように定義する。今回はkind:SpotPlanに対するデータクラスを定義する。 - kind名と同じ名前のクラスを作成する
このクラスの1つのインスタンスが1つのentity(レコード)に相当する。例えば、データストアを検索して複数entityを受け取るケースでは、以下のようなコードが想定される。// Java List<SpotPlan> plans = (List<SpotPlan>)pm.newQuery(query).execute(); // クエリ実行
- データクラスであることを宣言する(@PersistenceCapable)
// Java @PersistenceCapable(identityType=IdentityType.APPLICATION)
- 主キー用変数を定義する(property名と同じ名前の変数を定義する)
// Java @PrimaryKey private String ID;
- その他の全てのプロパティ(フィールド)用変数を定義する
// Java @Persistent private String plan_key;
ここまでをまとめると以下の感じになる。
// Java import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.PrimaryKey; // @PrimaryKeyを付与するのに必要 import javax.jdo.annotations.Persistent; // @Persistentを付与するのに必要 @PersistenceCapable(identityType=IdentityType.APPLICATION) public class SpotPlan { @PrimaryKey private String ID; @Persistent private String plan_key; // 以下省略。全プロパティについて定義する。 }
- コンストラクタを定義する
適宜コンストラクタを記述する。(処理クラスの実装次第。) - getter/setterを定義する
- インターフェース(PMF)クラスを作成する
詳細は省略するが、データストアとの接続に必要なクラス。PMF.java として配布されているものを、そのままコピー&ペーストすればOK。 - 処理クラスを作成する
処理クラスは実際にデータストアとのデータのやり取りを行うクラス。今回は「データストア(kind名:SpotPlan)の内容を表示する」サーブレットを想定して処理クラスを作ってみる。処理の流れは以下のとおり。
(1) PersistenceManagerをインスタンス化する
(2) クエリを定義する
(3) クエリを実行する
(4) 結果を表示する
これをコーディングするとこんな感じになる。// Java public class ViewSpotPlanServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/plain"); resp.setCharacterEncoding("UTF-8"); resp.getWriter().println("Hello, world. I'm ViewPlanSpot class (sample)."); // 処理開始 // (1) PMの作成 PersistenceManager pm=PMF.get().getPersistenceManager(); // (2) データクラス名を指定してクエリを作成 Query query = pm.newQuery(SpotPlan.class); // (3) クエリを実行 - 結果はSpotPlan型のListで受け取る List<SpotPlan> plans = (List<SpotPlan>)query.execute(); // (4) 結果表示 for(SpotPlan plan:plans){ resp.getWriter().println(plan.getSpot_time() + " - " + plan.getSpot_name() ); // 時刻と地点名を表示 } pm.close(); }
- 実行例(ブラウザ画面)
プロパティ変数に対するgetter/setterを定義する。Eclipseのメニューで「ソース」-「getterおよびsetterの作成」で、まとめて作成することが可能。
ピンバック: Java/JDOでGoogle App Engineのデータストアにアクセスする方法 | Try Lifelog