2009年4月21日火曜日

JDOで保存と検索

さぁGAEでデータベースを取り扱ってみましょう!

JDOを利用して行うことができるようです。
JDOは。。。平たく言うとオブジェクトを保存できる仕組みとでもいいましょうか。。。

下準備は「src/META-INF」に
jdoconfig.xmlを準備する必要があります。

これはeclipseのプラグインでプロジェクトを作成した場合に
勝手にできあがってるみたいです。


それとパーシスタントクラスを準備する必要があります。
このクラスはPOJOと呼ばれる単純なクラスを準備します。


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;

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

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Project {

@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
@PrimaryKey
private Long id;
@Persistent
private String name;
@Persistent
private String detail;
@Persistent
private User creator;
@Persistent
private User editor;

・・・・(getter と setterも準備)
}


残したいデータを準備するのですが
大事なのは「@~」っていう記述方法です。
アノテーションと呼ばれるコメントにより、特性を決める技術です。


@PersistenceCapable(identityType = IdentityType.APPLICATION)
でこのアプリケーションで一意であるデータということ

@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
保存対象でありIDENTITY(一意)であるということ

@PrimaryKey
プライマリーであるということ

@Persistent
保存対象である

ということを意味します。


さぁこれで保存する準備はできました。
画面を作成して保存して一覧に出すようにしてみましょう!

まず実行するJSPを準備


<form name="testForm" action="./JDOServlet" method="post">
<input type="text" name="name">
<textarea name="detail"></textarea>
<input type="submit">
</form>


まぁ普通のHTMLファイルでもOKですね。
でJDOServletをweb.xmlに記述します。


<servlet>
<servlet-name>JDOTestServlet</servlet-name>
<servlet-class>bz.ziro.test.servlet.JDOServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>JDOTestServlet</servlet-name>
<url-pattern>/secure/JDOServlet</url-pattern>
</servlet-mapping>

※servletタグとservlet-mappigタグは順番に並べてください。

で少し長いですがサーブレットは以下のようになります。
※折りたたんであるので広げてください。


public class JDOServlet extends HttpServlet {

/**
*
*/
private static final long serialVersionUID = 1234131818439520488L;

private static PersistenceManagerFactory pmfInstance = JDOHelper.getPersistenceManagerFactory("transactions-optional");
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {

UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();

String name = req.getParameter("name");
String detail = req.getParameter("detail");

Project project = new Project();
project.setName(name);
project.setDetail(detail);
project.setCreator(user);

PersistenceManager pm = pmfInstance.getPersistenceManager();
try {
pm.makePersistent(project);
} finally {
pm.flush();
}

Query query = pm.newQuery(Project.class);
try {
List<Project> projectList = (List<Project>)query.execute();
PrintWriter writer = resp.getWriter();
resp.setContentType("text/html");
if (projectList.iterator().hasNext()){
writer.println("<table>");
writer.println("<tr>");
writer.println("<td>id</td>");
writer.println("<td>name</td>");
writer.println("<td>detail</td>");
writer.println("</tr>");
for ( Project pro : projectList ) {
writer.println("<tr>");
writer.println("<td>" + pro.getId() + "</td>");
writer.println("<td>" + pro.getName() + "</td>");
writer.println("<td>" + pro.getDetail() + "</td>");
writer.println("</tr>");
}
writer.println("</table>");
} else {
}
} finally {
query.closeAll();
}
}
}


まずProjectのオブジェクトを準備しています。
でPersistenceManagerでmakeします。
これがinsert行為になります。

まだpmは使うのでflushだけして
Queryクラスで一覧を取得してきます。
このQueryクラスでwhere文やlimit文、Order文などを記述します。

でPrintWriterでHTMLに記述をしています。


さぁベタな文法ですがいかがだったでしょうか?
※PMFなどをSingletonパターンを利用しないと
 もう一回インスタンスを取得するとExceptionになります。

http://gae.ziro.bz/secure/test.jsp

でお試しできます。
※ごめんなさい。Creatorユーザでユーザを保存していますので
 試すとアカウントの情報が残ります。
 間違っても何かに使ったりしませんのでお試しください。

※ごめんなさい。現在はStrutsによる実装になってしまいました。

・・・さてトランザクションとかもやらんとな。。。

0 件のコメント: