とりあえずデータを登録してみる。

前回に言っていた
「わかりやすくデータを登録します」
といっていたのを今やります。

土日は親戚に会ったり、バッシュ買ったりなんやかんやで
eclipse触りませんでした。(ずっとやりたかった・・・・)

さて、翻訳ではロジックと画面が混在してて
damePGなりには満足できません。
という話の続き。

なので、ロジックはロジック!!
画面は画面で分けます。

まず画面みてください。
ここで使うのは以前に作成した、dame掲示板です。
これをDataStoreを使用します
20090427172859

え〜吟じます。
Servletです。
ここは何もありません。

package bbs;

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

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

import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class BbsServlet extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		resp.setContentType("text/html; charset=Shift_JIS");
		List list = BbsDto.findAll();
		req.setAttribute("bbsData", list);
		req.getRequestDispatcher("/bbs.jsp").forward(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		BbsDto dto = new BbsDto();
		req.setCharacterEncoding("Shift_JIS");
		dto.setName(req.getParameter("name"));
		dto.setTitle(req.getParameter("title"));
		dto.setText(req.getParameter("text"));
		dto.setDate(new Date(new java.util.Date().getTime()));
		
		BbsDto.save(dto);
		doGet(req,resp);
	}
}

ここからが肝ッ!!
Databaseに値を突っ込むときはConnectionを取得します。
その代わりと思ってもらえればいいかも・・・
GAP(JDO)はPersistenceManagerFactoryというのを使って値を書き込みます。

package bbs;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public class PMUtils {
	
	private static final PersistenceManagerFactory pm = 

JDOHelper.getPersistenceManagerFactory("transactions-optional");
	
	public static PersistenceManagerFactory getPM() {
		return pm;
	}
}

以前やったクラスでゆうとConnectionUtilってのを作成したんだけど、
それと一緒。
以下のクラスと同じようなものと思ってます。

package shop.dao;

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectionUtil {

	public static Connection getConnection()  {
		try {
			Class.forName("org.gjt.mm.mysql.Driver");
			Connection con = DriverManager.getConnection

("jdbc:mysql://localhost/test", "root", "mysql");
			return con;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}

で、getPersistenceManagerFactoryで指定している"transactions-optional"は
META-INF/jdoconfig.xmlで定義されています。

僕はここがわかっていないのでもう少し調べないとだめです。

<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">

   <persistence-manager-factory name="transactions-optional">
       <property name="javax.jdo.PersistenceManagerFactoryClass"
           

value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>
       <property name="javax.jdo.option.ConnectionURL" value="appengine"/>
       <property name="javax.jdo.option.NontransactionalRead" value="true"/>
       <property name="javax.jdo.option.NontransactionalWrite" value="true"/>
       <property name="javax.jdo.option.RetainValues" value="true"/>
       <property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>
   </persistence-manager-factory>
</jdoconfig>

で、ここ最強に注目です。

package bbs;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class BbsDto {
	@PrimaryKey
	@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
	private Long id;
	@Persistent
	private String name;
	@Persistent
	private String title;
	@Persistent
	private String text;
	@Persistent
	private Date date;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public Date getDate() {
		return date;
	}

	public void setDate(Date date) {
		this.date = date;
	}
	
	public static List findAll () {
		System.out.println("Dto findAllにはいりました。");
		List list = new ArrayList();
		PersistenceManager pm = PMUtils.getPM().getPersistenceManager();
		String query = "SELECT FROM " + BbsDto.class.getName();
		list = (List) pm.newQuery(query).execute();
		return list;
	}
	
	public static void save(BbsDto dto) {
		System.out.println("Dto saveにはいりました。");
		PersistenceManager pm = PMUtils.getPM().getPersistenceManager();
		try {
			pm.makePersistent(dto);
		} catch (Exception e) {
			throw new RuntimeException(e);
		} 
	}
}

ここでは3つのことをやっています。
1、永続化するエンティティーを決定する
2、全データ読み込み
3、書き込み

まず1は永続化させる属性に、@Persistentをつける。
主キーには@PrimaryKeyをつけます。
これはJDOの使用で決まっているみたいです。

僕はここも勉強しないとなぁ(汗)

そして読み込みはSQLの変わりに
JDOQLを使用します。
ググッたら英語のドキュメントいっぱいでてきます。

そこで、得意の(?)吉田直伝リフレクションを使用して
データを抽出します。
僕はBbsDto.class.getName();と書きましたが
絶対パスを直書きでもOK。


そして書き込みにはPersistenceManagerのmakePersistentを使用して、
値をセットしたDTOを引数に渡せば完成です。
結果こうなりました。
値をいれました。
20090427172900

すると
20090427172901


うお!!文字化けしてる〜〜と思って、
Servletでリクエストとレスポンスのエンコーディングしました。
すると・・・・

20090427172902


はい日本語にも対応しました。


このGoogleの巨大なデータベースを扱える実感わかります?
今無料じゃないですか?

万が一ですよ!
億が一ですよ!

この方法がすごく浸透して
データがオンラインでみんな扱えるようになったら、

もしかするとDBなくなるかも・・・・。

携帯が普及するときにいっせいに無料になったように
この機能が世界を変えてしまうかもしれませんね。