HSQLDB
データベースといえば、PostgreSQLやMy SQLなど色々ありますが、 Javaのみで実装したHSQLDBというものがあります。以前は少々商用でつかるのは不安などという話もありましが、 最近ではJBossなどでもデフォルトのデータベースに採用されたりして、信頼性も高まっているようです。
で、HSQLDBを積極的に使う理由はあまりありませんが、少なくとも、warファイルにて配布する際、それだけで全てOK ということが可能だと言うことです。つまりなんらサーバーでDBの設定がいらないと言うことです。
さらに、もう少し別の視点で言うならば、Hibernateを使う限り、仮に、HSQLDBからPostgreSQLに変更になったところで、 Hibernateの設定を1行変えるだけで済むので、とりあえずで始められるということも言えます。
まずはのダウンロードと展開
まずはHSQDBに行って、 すでに1.8が出ていますが、もう少しこれを使うのは待って、 hsqldb_1_7_3をダウンロードしてください。
そして、展開したら、その中hsqldb/libにあるhsqldb.jarが本体で、これを使います。
必要に応じて、例えば、今回のようなサーバサイドの場合WEB-INF/libにつっこんでおきましょう。
HSQLDBを試してみよう
まずはwebcmsにコピー
先ほど展開したhsqldb.jarをwebcms/WEB-INF/libにコピーします。
次にstruts-config.xmlに設定を書き込む
データベースにアクセスするには
- 直接コードの中に書き込む。
- server.xmlに設定を書いておく。
- web.xmlに設定を書いておく。
- struts-config.xmlに書いておく。
今回は、上記の1および4を試してみようと思います。
以前Xdocletで説明した、mergeディレクトリにstruts-data-sources.xmlを作成し、
<data-sources> <data-source type="org.apache.commons.dbcp.BasicDataSource"> <set-property property="user" value="sa" /> <set-property property="password" value="" /> <set-property property="driverClass" value="org.hsqldb.jdbcDriver" /> <set-property property="description" value="HSQLDB test" /> <set-property property="url" value="jdbc:hsqldb:file:c:/eclipse/workspace/webcms/WEB-INF/database/webcms" /> </data-source> </data-sources>
を書き込み保存し、とりあえずantする(Xdocletの説明参照)。
テーブルの作成
Javaのソースからテーブルを作るという手もなくはないですが、今回はhsqldbに付いてくるManagerを使って作ってみましょう。
まずは先ほど展開したhsqldbのディレクトリの直下のdemoというディレクトリにrunManager.batというのがあります。
cd ..\data @java -classpath ..\lib\hsqldb.jar org.hsqldb.util.DatabaseManager %1 %2 %3 %4 %5 %6 %7 %8 %9
中身は上記のようになっていますが、先ほど展開したままだったらcdでエラーになります(というかそのままでも動きますが)。
そのcd ..\dataをcd cd c:\eclipse\workspace\webcms\WEB-INF\database にします(別の方法もあります)。
同様に-classpathのあともc:\hsqldb\lib\hsqldb.jar org.hsqldb.util.DatabaseManager %1 %2 %3 %4 %5 %6 %7 %8 %9に変えます。
そして保存したら、Dosプロンプトからこのバッチファイルを実行します。

そして、上記の上から3番目のtypeにstandaloneを選び、
上から5番目にjdbc:hsqldb:file:c:\eclipse\workspace\webcms\WEB-INF\database\webcmsを入力します。
次に、clearというボタンの横のテキストフィールドに、下のようなtableを作成するsqlをコピペしてください(本当はunique (USER_NAME)が必要でしょうが、 今回は実験なので、一度insertするたびにソースを変えるのが面倒なのではずしました)。
create table USERS ( ID integer generated by default as identity (start with 1), EMAIL varchar(64) not null, USER_ID varchar(64) not null, NOTE varchar(64), MEMBER_NAME varchar(64), primary key (ID) );

そして、右にあるexecuteボタンを押すと、さっきまでなかったファイルがWEB-INF/databaseに出来ていればOKです。
最後に
Actonの作成
いつものように、Actionを作成します。
/*
* Created on 2005/05/30
*
*/
package com.chikkun.webcms.test2;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
/**
* @author Administrator
* @struts.action path="/insertUserTest" scope="request"
* validate="false"
* @struts.action-forward name="success" path="/WEB-INF/jsp/success.jsp"
*/
public class InsertUserTestAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm actionForm,
HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
DataSource dataSource = null;
Connection con = null;
try {
dataSource = getDataSource(request);
con = dataSource.getConnection();
// do what you wish with myConnection
PreparedStatement statement
=con.prepareStatement("insert into USERS (EMAIL, USER_NAME, NOTE, MEMBER_NAME) values(?, ?, ?, ?);");
statement.setString(1,"chikkun@chikkun.com");
statement.setString(2,"tomoko");
statement.setString(3,"hogehoge");
statement.setString(4,"知久和郎");
int result = statement.executeUpdate();
System.out.println(result + "行データを追加");
} catch (SQLException sqle) {
getServlet().log("Connection.process", sqle);
} finally {
//enclose this in a finally block to make
//sure the connection is closed
try {
con.close();
} catch (SQLException e) {
getServlet().log("Connection.close", e);
}
}
return mapping.findForward("success");
}
}
antを実行して、struts-config.xmlを書き出して、さらにWEB-INF/jsp/success.jspを作成します(面倒なので、ごく簡単なもの)。
<%@page pageEncoding="Windows-31J" contentType="text/html; charset=Windows-31J" %> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <html:html locale="true"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J"/> <title>Insert User Test</title> </head> <body> <h2>初めてのHSQLDB</h2> Success!!!!!!!!!!!!! </body> </html:html>
最後に
<data-source type="org.apache.commons.dbcp.BasicDataSource">
先ほどのstruts-config.xmlで必要なクラスを取得します。Jakarta Commonsへ行って、DBCPを ダウンロードしてきて、その中のcommons-dbcp-1.2.1.jarをWEB-INF/libにコピーします。
そして最後にTomcatを立ち上げて、いつものように、 http://localhost:8080/webcms/insertUsetTestを実行して、 WEB-INF/database/webcms.logにその結果が書き込まれていればOK(ただのテキストファイルなので簡単に見られる)。
by 知久和郎


