Top > MyPage
 

HSQLDB

Pure Javaなデータベースを使ってみよう。

データベースといえば、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に設定を書き込む

データベースにアクセスするには

  1. 直接コードの中に書き込む。
  2. server.xmlに設定を書いておく。
  3. web.xmlに設定を書いておく。
  4. 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 ..\datacd 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プロンプトからこのバッチファイルを実行します。

hsqldbのmanagerの初期画面

そして、上記の上から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)
);


				
sqlを入力した

そして、右にある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 知久和郎