libro
www.tuyano.com
Google App Engine for Java(GAE/J)プログラミング入門

Google Cloud SQLを利用する (6/6)

作成:2012-05-20 10:38
更新:2012-05-20 10:38

■レコードの追加と検索

後は、要するにSQLを実行していくだけなので、Cloud SQLならではの使い方ぬんぬんというのは特にないわけですが……、まぁもうちょっとサンプルがあったほうがイメージしやすいでしょう。

先ほどのJSPを更に追加して、レコードの追加と検索の機能も足してみました。NAMEとMAILという2つの項目があるフォームを用意してあります。そのままアクセスすれば、前レコードが表示され、フォームの2つの項目にテキストを書いて送信すると、そのデータがレコードとして追加登録されます。また、NAMEのほうにテキストを書いて送信(MAILは何も書かない)すると、そのテキストをNAMEに含むレコードを検索し表示します。

ここでは、2つの送信されたフォームの項目を取り出し、どちらも空でなければレコードを追加、NAMEだけ空でなければ検索、それ以外は普通に前レコード取得、というように条件分けしてあります。

ただのSQLの実行なので改めて説明するまでもないでしょうが、簡単に補足しておきましょう。まず、2つの送信パラメータをnm_strml_strに取り出しておきます。値がnullなら""(からのテキスト)にしておきます(後で個別にチェックするのが面倒くさいので。良い子は真似しません)。

●レコードの追加
レコードの追加は、両方の変数に値があれば、それらをもとにinsert文を実行して行います。この部分ですね。
int result = st.executeUpdate("insert into persondata (name, mail) VALUES ('"
    + nm_str + "','" + ml_str + "');");
SQLでのレコード追加は、「INSERT INTO テーブル (フィールド名……) VALUES (値……)」というようにして実行します。テーブル名の後の()に値を設定するフィールド名をカンマでまとめ、VALUESの後の()内に保存する値をテーブル名の順番にあわせてカンマで記述します。

なお、すでにあるレコードのデータが更新されるような処理(検索などでなく、内容を操作する処理)の場合は、executeQueryではなく「executeUpdate」メソッドを使います。間違えると正しくSQL文が実行されないので注意しましょう。

●レコードの検索
レコードの検索は、nm_strが空でなければselect文にwhere節を追加して行います。以下の部分です。
rs = st.executeQuery("SELECT * FROM persondata where name like '%"
     + nm_str + "%'");
単純に全レコードを検索するなら「SELECT * FROM テーブル名」で十分ですが、特定の条件で絞り込むときは、その後に「WHERE 条件」といった節を追加しておきます。ここでは「WHERE name like %検索テキスト%」というような形で条件を設定してあります。「like」は、いわゆる「あいまい検索」というもので、%をつけて、検索テキストの前後に他のテキストがあっても探し出せるようにできます。


――というわけで、後はSQLの使い方の話になってきますので、Cloud SQLから離れてしまいます。このへんにしておきましょう。Cloud SQLは、「申請して登録」「API Consoleでデータベースやテーブルなどの準備」という、プログラミング以前の部分で躓く人が多いように思えます。その部分をしっかりやって、プログラミングまで入れば、後は楽ちんです。

実際のプログラミングでは、「AppEngineDriverをドライバクラスに指定してConnectionを作成して使う」という点さえきちんとできれば、後はまったく通常のSQLと同じです。Cloud SQLというより、「JavaからのSQL利用」についてしっかり勉強すればよいでしょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※helo.jsp修正

<%@ page language="java" contentType="text/html; charset=utf-8"
		pageEncoding="utf-8"%>
<%@ page import="java.util.List" %>
<%@ page import="java.sql.*" %>
<%@ page import="com.google.appengine.api.rdbms.AppEngineDriver" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Sample jsp</title>
<style>
h1{
	font-size: 16pt;
	background: #AAFFAA;
	padding: 5px;
}
table {
	border: 1px solid black
}
table tr th {
	background-color: #CCFFDD;
	margin: 5px;
}
</style>
</head>
<body>
	<h1>Sample jsp page</h1>
	<p>これはサンプルで用意したページです。</p>
<%
Connection c = null;
c = DriverManager.getConnection("jdbc:google:rdbms://tuyano-gae-sample-sql:sampledata/mydb");
ResultSet rs = null;

String title ="レコード一覧";
String nm_str =  request.getParameter("name");
String ml_str = request.getParameter("mail");
nm_str = nm_str == null ? "" : nm_str;
ml_str = ml_str == null ? "" : ml_str;

// レコードの追加
if (!"".equals(nm_str) && !"".equals(ml_str)){
	Statement st = c.createStatement();
	int result = st.executeUpdate("insert into persondata (name, mail) VALUES ('"
		+ nm_str + "','" + ml_str + "');");
	Statement st2 = c.createStatement();
	rs = st2.executeQuery("SELECT * FROM persondata");
}
// レコードの検索
if (!"".equals(nm_str) && "".equals(ml_str)){
	Statement st = c.createStatement();
	rs = st.executeQuery("SELECT * FROM persondata where name like '%"
		 + nm_str + "%'");
} else {
	Statement st = c.createStatement();
	rs = st.executeQuery("SELECT * FROM persondata");
}
%>

<form metho="post" action="helo.jsp">
<table>
<tr>
	<td>NAME:</td>
	<td><input type="text" name="name"></td>
</tr>
<tr>
	<td>MAIL:</td>
	<td><input type="text" name="mail"></td>
</tr>
<tr>
	<td></td>
	<td><input type="submit" value="追加"></td>
</tr>
</table>
</form>
<hr>
<p><%= title %>
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Mail</th>
</tr> <%
while (rs.next()){
    int id = rs.getInt("id");
    String name = rs.getString("name");
    String mail = rs.getString("mail");
%>
<tr>
<td><%= id %></td>
<td><%= name %></td>
<td><%= mail %></td>
</tr>
 
<% }
c.close();
%>
</table>

</body>
</html>

※関連コンテンツ

「Google App Engine for Java(GAE/J)プログラミング入門」に戻る