JDO APIとLow-Level APIの違いと基本CRUD処理

2010年10月21日(木)
清野 克行

4. JDOでの永続化処理

KVSにアクセスするプログラムに、JDOとLow-Level APIとで、どのような違いがあるのか。これを、比較します。最初に、JDOを使った例を示します。次に、Low-Level APIを使った例を示します。

リスト2: JDOでの永続化

package jdoajax; 
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;
import java.util.List;
import javax.jdo.Query; 
import javax.jdo.PersistenceManager;
public class msgBean {
	PersistenceManager pm = PMF.get().getPersistenceManager(); //(1)
	public String addMsg(String uname, String uemail, String umsg) {
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日:HH時mm分ss秒");
		sdf.setTimeZone(TimeZone.getTimeZone("JST"));		
		msg bbs = new msg(uname, uemail, umsg, sdf.format(date)); //(2)
		try {
			pm.makePersistent(bbs); //(3)
			return "登録成功";
		} catch(Exception e){
			return "Error = " + e;
		} finally {
			pm.close(); //(4)
		}
	}
}

リスト2は、JDOを使った、永続化処理プログラムです。永続化処理に関係する部分には、(1)から(4)までのコメントを付けています。JDOで永続化処理を行う場合、最初に(1)のように、永続化マネージャのインスタンス(pm)生成を行います。

次に、(2)のデータ・クラス定義のインスタンス(bbs)生成時に、コンストラクタで永続化データをセットし、(3)でbbsを引数にとってmakePersistentメソッドを実行します。これにより、永続化が行われます。

ただし、こうして作った永続化の内容を、不可逆な内容として確定させるのは、(4)のcloseメソッドの実行によります。

JDOを使った場合、永続化処理は決して複雑ではありませんが、データ・クラス定義(msg)のインスタンスを使って永続化処理が行われており、スキーマに類似したデータ・クラスの定義に依存した処理内容になります。

5. Low-Level APIでの永続化処理

リスト3: Low-Level APIでの永続化

package jdoajax;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.Query;
public class msgBean {
	DatastoreService ds = DatastoreServiceFactory.getDatastoreService(); //(1)
	String out = "";
	public String addMsg(String uname, String uemail, String umsg) {
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日:HH時mm分ss秒");
		sdf.setTimeZone(TimeZone.getTimeZone("JST"));
		try {
			Entity m = new Entity("msg"); //(2)
			m.setProperty("uname", uname); //(3)
			m.setProperty("uemail", uemail); //(3)
			m.setProperty("umsg", umsg); //(3)
			m.setProperty("udate", sdf.format(date)); //(3)
			ds.put(m); //(4)
			return "登録成功";
		} catch(Exception e){
			return "Error = " + e;
		}
	}
}

リスト3は、Low-Level APIを使った永続化処理です。データ・クラスの定義はありませんが、この場合もシンプルな処理内容で永続化が可能です。

(1)から(4)のコメントを付けた部分で、永続化処理を行っています。Low-Level APIの場合、最初に(1)のファクトリ・メソッドで、DatastoreServiceのインスタンス(ds)を生成します。次に(2)で、データ・ストア・エンティティのインスタンス(m)を生成した後、(3)のsetPropertyメソッドを使います。ここでは、第一引数のプロパティ名に対応する値を、第二引数でセットします。

(3)setPropertyメソッドは、キーとその値の形でのセットになっています。「uname」(ユーザー名)、「uemail」(メールアドレス)、「umsg」(書き込みメッセージ)、「udate」(日本時間での書き込み日時)をセットしていますが、このあとの(4)でインスタンス(m)を引数に指定してputメソッドを実行すれば、永続化処理が行われます。

このサンプルでは、JDOのような、コンストラクタによる永続化データのセットは行いません。(2)を見て分かる通り、永続化のプロパティ項目をそれぞれセットしていることから、ステップ数はやや増えていきますが、とりたてて複雑な処理になるという事でもありません。

永続化対象のプロパティ項目は、データ・クラスの定義を行わずに設定します。このことから、リスト2の(3)で行っているプロパティ項目定義を、別のものに変えてしまうことが可能なようにも思えます。実際、その通りです。Low-Level APIでは、同じkind(≒レコード)に属するエンティティ間で、キー項目を除くプロパティ項目は、全く任意に変えることができます。

次回は、同一のkindに対して、永続化対象となるプロパティ項目を変えながら永続化を行うプログラムを作成し、解説します。

有限会社サイバースペース
慶應義塾大学工学部電気科卒。日本IBM、日本HPなどにおいて、製造装置業を中心とした業務系/基幹業務系システムのSE/マーケティングや、3階層C/Sアーキテクチャによる社内業務システム開発などに携わる。現在は、Ajax/Web 2.0関連のセミナー講師/コンサルティング、書籍執筆などを行っている。情報処理学会会員。http://www.at21.net/

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています