←FreeBSD で JAVA しよう編 ↑おもちゃ箱 ->POVRAY編

¶JDBC ドライバを使って MySQL のデータベースにアクセス[工事中]

  1. mysql をインストール
  2. mysql の初期設定
  3. Apache に mysql 認証モジュールを組み込み再インストールする
  4. mysql に Web からアクセスする認証用テーブルを用意する
  5. mysql をアクセスする HTML の権限(privilege)を Apache に設定
  6. JDBC ドライバのインストールとテスト
  7. JAVA アプレットから JDBC ドライバを使ってみる
  8. eSuite DevPackのアプレットから JDBC ドライバを使ってみる

アニメーションのアプレットを作るくらいでは満足できなくなってきた方は、 少々実用的なもの手をのばしてみましょう。データベースを Java アプリケー ションないし Java アプレットからアクセスしてみます。 FreeBSDに port されているSQLデータベースには、mSQL, MySQL, PostgreSQL などがあります。たまたま Apache のMySQL用認証モジュールを見つけたので、 MySQL + Apache の組み合わせを使ってみることにしました。
既に mysql を使っている方は i, ii を読み飛ばして下さい。 私自身はデータベースに詳しくないので、間違った記述があれば指摘していた だけると助かります。


i. mysql をインストール

インストールについては ports を使って楽をします。スーパユーザになり /usr/ports/database/mysql で make install するだけです。 Dialup PPP な人で、$CDROM/ports/distfiles のある CDROM を持って いない方は、/etc/make.conf に
MASTER_SITE_BACKUP?=    \
        ftp://ftp.jp.freebsd.org/pub/FreeBSD/distfiles/${DIST_SUBDIR}/
の二行を入れておく方が良いかと思います。


ii. mysql の初期設定

まず、 /etc/services に
mysql           3306/tcp   #mySQL
の一行を入れて、 kill -HUP 1 しておきます。 インストール直後に mysqlサーバが勝手に立ち上がるので、mysql とい うデータベースに自ホストからアクセスできるユーザとして、まず root(ないしは相当する管理者) とそれ以外のユーザを最低一人登録し ましょう。サーバが立ち上がっていなければ
mysql.server  start
して立ち上げておきます。 ここでは仮に、root のパスワードを foo1%bar に、ユーザ www のパス ワードを websql としました。
shell> mysql mysql
INSERT INTO user VALUES ('%','root',password('foo1%bar'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y') ;
INSERT INTO user VALUES ('%','root,'','N','N','N','N','N','N','Y','N','Y','Y') ;
INSERT INTO user VALUES ('localhost','www',password('websql'),'N','N','N','N','N','N','Y','N','Y','Y') ;
INSERT INTO user VALUES ('%','www','','N','N','N','N','N','N','Y','N','Y','Y') ;
この場合、mysqlサーバを走らせるホストとそれをアクセスする Web サーバ (Apache)が同一であると仮定しています。リモートの Web サーバから MySQL にアクセスする場合は、当然 Web サーバを走らせるホストとそのユーザに アクセス権限を与えなければなりません。 このあたりのコマンド操作は気を使うので、 xmysqladmin などというアプリを使うと楽ができるでしょう。 以降のアクセスは、
mysqlshow -uroot -p'foo1%bar'
のようにユーザ名とパスワードを付けることになります。 では mysql へのアクセステストをしてみましょう。
% mysqladmin -uroot -pstable create test
Database "test" created.
以下のコマンドで jdbcというテーブルを作られ、テストデータが挿入されます。
% mysql -uroot -p'foo1%bar' test < jdbcTest.sql
ERROR 1121 at line 11: Column 'r1' is used with UNIQUE or INDEX but is not defined as NOT NULL
これは、INDEX など空欄にしてはいけないフィールドがそのように指定されて
いないというエラーです。そこで、データ入力行のうち r1, r2, r3, r4, r10 の行を
  r1 tinyint NOT NULL, 
  r2 smallint NOT NULL,
  r3 mediumint NOT NULL,
  r4 int NOT NULL,
     :
  r10 char(100) NOT NULL,
のように修正してもう一度試すと、何もメッセージが出ずにデータの挿入が成功 
すると思います。
これ以降のテストはここでは述べませんので、 マニュアルを眺めながらいじってみましょう。


iii. Apache に mysql 認証モジュールを組み込み再インストールする

apache から mysql にアクセスする際に認証を行なわせるには Apache にmysql_auth_module を組み込まなければなりません。mysql_auth_module付属のREADMEにコン パイル方法が、USAGEに認証方法が詳しく書かれているので、ここでは私 が apache-1.3.0で行なった手順を簡単に記載するだけにします。 mysql_auth_module, mysql_log_module を組み込んだ以下の ports で Apacheをインストールし直してみて下さい。

※注意※
これは私が unofficial に作成した ports で、PHP/FIやPHP3と合わせ たパッチにはなっていません。

何らかの理由で ports を使いたくない場合は、ports に含まれるパッチ だけを利用して手動でコンパイル、インストールを行なってもかまいませ ん。 初回起動は、スーパユーザになって
# /usr/local/sbin/apachectl start
とします。


iv. mysql に Web からアクセスする認証用テーブルを用意する

% mysqladmin -uroot -p'foo1%bar' create http_auth
% mysql -uroot -p'foo1%bar' http_auth
mysql> CREATE TABLE mysql_auth (
    -> username char(25) NOT NULL,
    -> passwd char(25) NOT NULL,
    -> groups char(25),
    -> PRIMARY KEY (username)
    -> );
Query OK, 0 rows affected (0.12 sec)
mysql> 
こうして、三つのフィールドを持つ mysql_authテーブルを http_auth に作り、 Apacheからの認証用に使います。このフィールド名は mysql_auth_module の デフォルトです。このフィールド名は予約語と重なっており(これは mysql で は許されている)、「そんなの気持ち悪いよぉ」という人は異なるフィールド 名をつけてもかまいません。 ただし、その場合は Apache の設定で Auth_MYSQLpwd_field, Auth_MYSQLgrp_field という二つのディレクティブを使って指示しなければなりません。 また、データベース http_auth を作らなくても、既存のデーターベースに認 証用テーブルを作成してもかまいません。 では、このデータベース http_auth にユーザを登録します。
% mysql -uroot -p'foo1%bar' http_auth
mysql> INSERT INTO mysql_auth (username,passwd,groups)
    -> VALUES ('www', password('websql'), 'www');
Query OK, 0 rows affected (0.12 sec)
mysql> quit
これで、httpdからデータベースにアクセスするユーザが用意されました。


v. mysql をアクセスする HTML の権限(privilege)を Apache に設定

/usr/local/etc/apache/access.conf 内に設定してしまう方法と、 .htaccess に記述する二通りの方法があります。 ここでは後者でやってみます。例えば /usr/local/www/data/db に JDBC ドライバやインストールしたとすると、アプレットをインストールする 予定として、サブディレクトリ以下にも効くように、
<Directory /usr/local/www/data/db>
Options FollowSymLinks
AllowOverride All
</Directory>
などと書いておきます。 /usr/local/www/data/db/.htaccess には、
Auth_MYSQL on
Auth_MYSQL_Authoritative off
Auth_MYSQLdatabase http_auth
Auth_MYSQLpwd_table mysql_auth
Auth_MYSQLgrp_table mysql_auth
Auth_MYSQL_nopasswd off
Auth_MYSQL_EncryptedPasswords off
Auth_MYSQL_ScrambledPasswords on
という記述を入れます。(これを access.conf で <Directory>〜 </Directory> の中に書いても良いわけです) 各ディレクティブの意味は、 /usr/local/share/doc/apache/mod_auth_mysql-2.11 にある README, USAGE を参照して下さい。これらはデータベースをアクセスする権限の設 定なので、このディレクトリやそれに含まれる HTML 自身のアクセスも制 限したい場合は、Apacheの通常の方法 (passwdファイルを用意して .htaccess に <Limit> 〜 </Limit> を書く) を使って下さ い。では、httpd を再起動しましょう。
# /usr/local/sbin/apachectl restart


vi. JDBC ドライバのインストールとテスト

mysql の gweJDBCドライバ (jms130b.zip) を適当なところに展開します。 例えば、/usr/local/java/lib で展開したとすると、
ash, bash, ksh, zsh なら
export CLASSPATH=.:/usr/local/java/lib/classes.zip:/usr/local/java/lib/jms1.3.0b
csh, tcsh なら
setenv CLASSPATH .:/usr/local/java/lib/classes.zip:/usr/local/java/lib/jms1.3.0b
のように環境変数を設定します。
では最初のアクセステストです。
% java jms.jmsadmin -P 3306 -uroot -p'foo1%bar' version
MySQL system administer with Java, by X.K.ZHU
Server version  3.21.29-gamma           Protocol version        10
JDBC driver     gweMysqlDriver  Version 0.93
Connected to    jdbc:mysql://localhost:3306/
Uptime          4 hours 52 mins 42 sec
 Running threads: 1  Questions: 638  Opened_tables: 5  Reloads: 1  Open tables: 5
もしここで
mysql exception: gweMysql.Connect: java.sql.SQLException: Access denied for user: 'root@localhost.your_domain' (Using password: YES)
java.sql.SQLException: mysql exception: gweMysql.Connect: java.sql.SQLException: Access denied for user: 'root@localhost.your_domain' (Using password: YES)
と出たら、 rootのパスワードが間違っているか、ユーザ root が登録されていないか、もし くは localhost.your_domain というホストが登録されていないか、のいずれ かにより、アクセスが拒否されたことを意味します。 では、java アプリケーションから今作ったテーブルの読み出しをしてみます。 /usr/local/java/lib/jms1.3.0b/test に行き、testSelect.java を編集し、 自分の mysql サーバの URL に合わせます。
        String url = "jdbc:mysql://localhost:3306/test";

                // Set up a connection, as user and password (both as
                // clear text here - the password is encrypted by the
                // driver
                // An empty username is changed to "nobody" in mysql

        Connection con = DriverManager.getConnection(url, "root", "foo1%bar");
太字が修正した部分です。更に testSelect.java の 67, 68行目に '//' を入 れて、この二行をコメントアウトして下さい。 (でないと実行時桁間違いのエラーを起こします)
            //Date r9d = rs.getDate(9); System.out.println("r9d : "+r9d);
            //Time r9t = rs.getTime(9); System.out.println("r9t : "+r9t);
これをコンパイルします。
% javac testSelect.java
こうしてできた testSelect.class は JDBCドライバを呼び出して、 mysql サーバにアクセスします。
% export CLASSPATH=.:/usr/local/java/lib/classes.zip:/tmp/jms1.3.0b
% java test.testSelect
以下のような出力がでれば、正常動作です。
Results : 

1 : 20000 : 8000000 : 2000000000 : 9999999999999 : 2.00 : 3.3333 : Y : 970224121120 : This is a fixed string :
 This is a variable string : This is a tinyblob : This is a blob : This is a mediumblob : This is a longblob :

r1 : 1
r2 : 20000
r3 : 8000000
r4 : 2000000000
r5 : 9999999999999
r6 : 2.0
r7 : 3.3333
r8 : true
r9ts : 1997-02-24 12:11:20.0
r10 : This is a fixed string
r11 : This is a variable string
r12 : This is a tinyblob
r13 : This is a blob
r14 : This is a mediumblob
r15 : This is a longblob
r15 as byte array : This is a longblob
(中略)
max(r1)=3
r2=20000


vii. JAVA アプレットから JDBC ドライバを使ってみる

では、Java アプレットから JDBC ドライバを呼び出してみましょう。

[すんません、工事中です]


viii. eSuite DevPackのアプレットから JDBC ドライバを使ってみる

アプレットベースの市販のアプリケーションである eSuite DevPack に含まれ る JDBC アプレットから MySQL の JDBCドライバを呼び出してみます。 ここではアプレットを呼び出す起点(CODEBASE)を仮に /usr/local/www/date/db にしてみました。 eSuite DevPackが /usr/local/www/date/db にインストールされているものと して、/usr/local/www/date/db/samples/jdbc/index.html を以下のように作っ てみました。

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN">
<html><head>
<title>MySQL Access Test for JDBC driver</title>
</head>
<body bgcolor="#c0d0d0">
<h1>LOTUS eSuite DevPack で MySQL JDBCドライバを使うテスト</h1>
<APPLET NAME="dataBase1" CODEBASE="../.."
        CODE="lotus.jdbc.JdbcSource"
        ARCHIVE="jars/devpack_jdbc_app.jar"
        WIDTH=720 HEIGHT=600 >
<PARAM NAME="CABINETS" VALUE="cabs/devpack_infobus.cab,
  cabs/devpack_scripthelper_app.cab,cabs/devpack_shared.cab,
  cabs/devpack_ic.cab,cabs/devpack_jdbc_app.cab,
  cabs/devpack_dbaw.cab">
<PARAM NAME="driver" VALUE="gwe.sql.gweMysqlDriver">
<PARAM NAME="autoload" VALUE="true">
<PARAM NAME="autoExecute" VALUE="false">
<PARAM NAME="database" VALUE="jdbc:mysql://localhost:3306/test">
<PARAM NAME="allowUI" VALUE="true">
<PARAM NAME="user" VALUE="www">
<PARAM NAME="password" VALUE="websql">
<PARAM NAME="autoconnect" VALUE="false">
</APPLET>
</body></html>
eSuite Devpackの JDBCアプレットで MySQLに接続した例
[eSuite JDBC appletの表示例]
(Netscape Communiator4.5b1)
ここから、更に infoBus を使って、アプレットの連係プレーをするとカッコ いいし、実用性十分となるのですが、今のところ FreeBSD用の Netscape Communicator-4.5b1 では少々きびしいものがありそうです。