low-level APIを使ったデータアクセス

すごい。
shin1ogawaさんの以下のWikiを見てlow-level APIを使ったデータアクセスを試してみたんだけど。すごい分かりやすい&めちゃ簡単。
https://sites.google.com/a/topgate.co.jp/systemsolution/Home/googleappengine/datastore-lowlevelapi
なにせ、EclipseGoogleプラグインのプロジェクトを作ってServletに直接データアクセスのテストを書いてみたんだけど、5分で出来た。

package sample;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Transaction;
import com.google.appengine.api.urlfetch.HTTPRequest;

@SuppressWarnings("serial")
public class LLATestServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {

		DatastoreService datastoreService = DatastoreServiceFactory
				.getDatastoreService();
		
		if (req.getParameter("content") != null) {
			save(req, datastoreService);
		}

		resp.setContentType("text/plain");
		
		// 検索
		Query q = new Query("todo"); // KIND:todoを検索
		PreparedQuery pq = datastoreService.prepare(q);
		List<Entity> list = pq.asList(FetchOptions.Builder.withOffset(0));
		resp.getWriter().println("Hello, world");
		for (Entity e: list) {
			resp.getWriter().println(e.getProperty("content") + " : " + e.getProperty("createdAt"));
		}
	}
	private void save(HttpServletRequest req, DatastoreService datastoreService) {
		// 保存
		Entity todo = new Entity("todo");
		todo.setProperty("content", req.getParameter("content"));
		todo.setProperty("createdAt", new Date());

		Transaction transaction = datastoreService.beginTransaction();
		try {
			datastoreService.put(todo);
			transaction.commit();
		} finally {
			if (transaction.isActive()) {
				transaction.rollback();
			}
		}
	}
}

ちなみにhttp://localhost:8080/llatest?content=aaaaとやったらその内容と作成日を登録して、最後に登録されてる内容を出すっていう簡単なサンプルです。
いや、それでも最初にしては、はまる所もなく素直に出来た。不思議。結構面倒かなと思ってたんだけど、食わず嫌いだね。ひがさんのSlim3がlow-level API対応になるのを待とうと思ったんだけど。これはすぐにこっち手をつけていいかも。
あ、でも今日見たらSlim3のソースにlow-level APIに関するクラスたちが追加されてたから、もうすぐ使えるようになるのかもしれないけど。悩ましい。