MySQLとそのJDBCドライバ(MM.MySQL)のダウンロード法

 

このチュートリアルでは、シンプルかつ高速で、日本語対応も出来ているデータベースであるMySQLを教材としている。MySQLは個人的に使用するのであれば無料である。またそのJDBCドライバMM.MySQLは、VisualAge for Javaで動作することが確認されているので、今回のチュートリアルにはぴったりである。

 

以下に一般的に使われているWindows環境にこれをダウンロードし、サーブレットからアクセス出来るようにする手順を示す。なおMySQLJDBCドライバに関しては日本語の優れた情報がネット上に数多く存在するので、判らなくなったらこれらの情報にアクセスされることをお勧めする。またインストールすると英文ではあるが詳細なマニュアルがあるので、これを利用する。場所はfile:///C:/mysql/Docs/manual.html#Windows_installationである。

 

環境:Java環境(JREまたはJDK)が出来ているWindows(982000NTなど)

 

 

MySQLのダウンロードとその確認

 

1.        http://www.mysql.com/downloads/index.htmlにアクセスしてお勧め版(stable release (recommended)と表示してある)のデータベースを選択する。筆者の場合は3.23版で、http://www.mysql.com/downloads/mysql-3.23.htmlのページが開く。このページから”Windows downloads”にあるファイルを自分のPCの適当なディレクトリにダウンロードする。(筆者の場合はMySQL 3.23.42 Windows 95/98/NT/2000 (12M)のファイルでファイル名は”mysql-3.23.42-win.zip”

2.        ダウンロードしたこのzipファイルを、自分の解凍ツールでしかるべきフォルダに解凍する。(筆者の場合はe:\MySQL\なるディレクトリ)

3.        エクスプローラで見ると、展開されたファイルのなかにSETUP.EXEがある。これをダブルクリックして実行する。セットアップ開始ウィンドウにあるように、C:\MYSQL以外のディレクトリにインストールしたり、MySQLNT/Win2000のサービスとして開始させたいときはC:\MY.CNFというファイルを作成し、それには例えば次のような行で、パス指定をする:

[mysqld]

basedir=E:/インストールパス/

datadir=E:/データパス/

C:\MY.CNFは、インストールしたディレクトリにmy-example.cnfなるファイルができるので、これをベースにして変更を加えればよい。

-           ここではC:\MYSQLにインストールするので、「Choose Destination Location」が表示されたら「next」ボタンをクリックして次に進む。

-           Setup Type」が表示されたらデフォルトの「Typical」のまま「next」ボタンをクリックする。

 

 

MySQLサーバの開始

 

1.        エクスプローラで見るとC:\mysql\bin\のフォルダにwinmysqladmin.exeなる実行ファイルが出来ているので、これをダブルクリックして実行する。

2.        WinMySQLadminのクイックセットアップのウィンドウが開き、ユーザ名とパスワードを聞いてくるので、自分が決めた管理用のユーザ名とパスワードを入力して「OK」のボタンをクリックする。

3.        Windowsシステムディレクトリ(95/98C:\WindowsNT/2000C:\Winnt)にmy.iniが作成される。また、タスクトレイに欧米風交通信号機(縦型)のアイコンが表示され、MySQLのサーバが動いていることが確認できる。このアイコンは大変便利で、緑色の信号が点灯している時はサーバが動作中を、赤のときは停止中を示す。このアイコンをクリックしてサーバの開始と停止をさせたり、また後で示すように設定や管理ができる。

4.        サーバの停止はこのアイコンを右クリック、「Win9x」の「ShutDown the Server」を選択して終了させる。また再開させるときは前記のようにアイコンを使う。アイコンを消してしまっている場合は、DOSコマンドからでもエクスプローラからでも良いがwinmysqladmin.exeを開始させる。この場合、ユーザ名とパスワードはmy.iniに登録されているので、要求されない。

5.        タスクトレイのMySQLのアイコンをクリックして、下図のようなアドミニストレータのウィンドウを開くと多彩な管理と設定ができることがわかる。例えば、下図のように設定ファイルを編集することができる。

 


 

 


DOSコマンドによるサーバ動作確認

 

1.        MS-DOSプロンプトからC:\mysql\bin\>mysql testを実行する。次のような結果が得られたら、MySQLサーバが動作していることになる。ここではヘルプコマンドで通常のSQLステートメント以外のMySQLコマンドを表示させている。これらのコマンドも’;’で終了させること。

Microsoft(R) Windows 98

   (C)Copyright Microsoft Corp 1981-1998.

 

C:\WINDOWS>cd c:\mysql\bin

 

C:\mysql\bin>mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 4 to server version: 3.23.42

 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 

mysql> \h

 

MySQL commands:

Note that all text commands must be first on line and end with ';'

help    (\h)    Display this help.

?       (\?)    Synonym for `help'.

clear   (\c)    Clear command.

connect (\r)    Reconnect to the server. Optional arguments are db and host.

ego     (\G)    Send command to mysql server, display result vertically.

exit    (\q)    Exit mysql. Same as quit.

go      (\g)    Send command to mysql server.

notee   (\t)    Don't write into outfile.

print   (\p)    Print current command.

quit    (\q)    Quit mysql.

rehash  (\#)    Rebuild completion hash.

source  (\.)    Execute a SQL script file. Takes a file name as an argument.

status  (\s)    Get status information from the server.

tee     (\T)    Set outfile [to_outfile]. Append everything into given outfile.

use     (\u)    Use another database. Takes database name as argument.

 

Connection id: 4  (Can be used with mysqladmin kill)

 

mysql> quit

Bye

 

C:\mysql\bin>

2.        次に簡単なSQLステートメントを使ってテーブルの作成と表示を試してみよう。

C:\mysql\bin>mysql test

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 6 to server version: 3.23.42

 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 

mysql> create table users

    -> (username char(20),

    -> password char(20));

Query OK, 0 rows affected (0.06 sec)

 

mysql> insert into users values ('Jyunichrou', 'LionHeart');

Query OK, 1 row affected (0.06 sec)

 

mysql> select * from users;

+------------+-----------+

| username   | password  |

+------------+-----------+

| Jyunichrou | LionHeart |

+------------+-----------+

1 row in set (0.06 sec)

 

mysql>

この内容については特に説明するまでも無かろう。ユーザ名とパスワード各々20文字からなるusersという新規のテーブルを作成し、それに1フィールド分のデータを追加し、selectステートメントでその内容を出力したものである。

 

 

MM.MySQLドライバからのアクセスの確認

 

MySQLJava環境で利用するには、MySQL用のJDBCドライバが必要になる。Mark Matthews氏が開発したフリーウエアMM.MySQLドライバは、非常にポピュラーであり、http://mmmysql.sourceforge.net/index.htmlからダウンロードできる。次の二つのjar圧縮ファイルを自分の適当なディレクトリ(筆者の場合はE:\MM.MySQL\)にダウンロードする。

mm.mysql-2.0.4-bin.jar

バイナリファイルのみ

mm.mysql-2.0.4-src.jar

ソースコードとドキュメンテーション

 

これを皆さんの開発環境にインポートする。IBM VisualAge for Javaの開発環境の場合は次のようになる。

 


ファイル->インポート->jarファイルで下図のウィンドウが出るので、この図のようにインポートするファイルとインポート先を指定して「終了」のボタンをクリックする。

 

 


そうすると次のようなパッケージが追加されることを確認しよう。

 

org.gjt.mm.mysql

org.gjt.mm.mysql.jdbc1

org.gjt.mm.mysql.jdbc2

testsuite

 

ソースコードとドキュメンテーションのファイルもインポートすると、次の位置にこのドライバの説明書のHTMLファイルがあるので、参照すると良い(但し英文)。

 

E:\Program Files\IBM\VisualAge for Java\ide\project_resources\Apache_Tomcat_Test_Environment\mm.mysql-2.0.4\doc\mm.doc\book1.htm

 

これでMySQLJavaで動作可能になっているはずである。あらかじめMySQLサーバを立ち上げ、またDOSプロンプトでサーバがアクセスできることを確認したら、次のような簡単なプログラムを実行させて、Javaプログラムからのアクセスを確認する。

 

package mysql_learning;

 

import java.sql.*;

/**

 * ^の記述を挿入してください。

 * 作成日 :

 * @author:

 */

public class ConnectionTest {

/**

 * ConnectionTest コンストラクター・コメント。

 */

public ConnectionTest() {

         super();

}

/**

 * アプリケーションを開始します。

 * @param args コマンド行引き数の配列

 */

public static void main(java.lang.String[] args) {

 

         try {

// The newInstance() call is a work around for some broken Java implementations

                   Class.forName("org.gjt.mm.mysql.Driver").newInstance();

         }

         catch (Exception E) {

                   System.err.println("Unable to load driver.");

                   E.printStackTrace();

         }

 

         try {

                   Connection con = DriverManager.getConnection("jdbc:mysql://localhost/test");

 

                   // Do something with the Connection

 

 

         }

         catch (SQLException E) {

                   System.out.println("SQLException: " + E.getMessage());

                   System.out.println("SQLState:     " + E.getSQLState());

                   System.out.println("VendorError:  " + E.getErrorCode());

         }

 

 

}

}

 

デバッガでステップで進ませて、例外を発生させることなく終了できれば完了である。

 

ConnectionTestクラスは、データベースの教科書どおりで、forNameメソッドでドライバをロードする。次にgetConnectionメソッドでMySQLサーバとの接続を行う。ForNameメソッドでドライバのclassファイルをロードするときに、newInstanceメソッドを呼んでいるのは、mm.mysqlドライバのプログラミング・ノートにあるように、バーチャルマシンによっては正しくstaticクラスの初期化をコールしないものがあるからである。

 

接続が成功したら、データのセットが可能か、次の行をさっきのプログラムの”// Do something with the Connection”とコメントされている行の下に追加して実行させよう。

                   Statement s = con.createStatement();

                   s.executeUpdate("insert into users values ('Makiko', 'MrsInconsistency');");

                   ResultSet r =  s.executeQuery("select username, password from users;");

                   while (r.next()){  //line by line reslt out

                            String username = r.getString(1);

                            String password = r.getString(2);

                            System.out.println("username: "+username +"   password: "+password);

                   }

                   s.close();

                   con.close();

 

最後に正しくデータがテーブルに追加されていることをコンソール画面で確認する。

 


 


またMSDOSプロンプトで下図のように確認しても良い。

 

C:\mysql\bin>mysql test

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 14 to server version: 3.23.42

 

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

 

mysql> select * from users;

+------------+------------------+

| username   | password         |

+------------+------------------+

| Jyunichrou | LionHeart        |

| Makiko     | MrsInconsistency |

+------------+------------------+

2 rows in set (0.11 sec)

 

mysql> exit

Bye

 

C:\mysql\bin>

 

なお開発環境によって(JDKなど)は、次のようにこのドライバのクラスパスを設定しておく必要がある。

 

C:\> set CLASSPATH=\path\to\mm.mysql.jdbc-[version];%CLASSPATH%

具体的には、例えばmm.mysql-2.0.4-bin.jarのファイルをc:\MM.MySQLなるディレクトリに置いた場合は:

C:\>set CLASSPATH=c:\MM.MySQL\ mm.mysql-2.0.4-bin.jar;%CLASSPATH%

 

これはJREJavaランタイム)とJavaコンパイラにこのドライバを探す際のパスをあらかじめ教えるものである。このコマンドはAUTOEXEC.BATファイルの最後の行に追加しても良い。そうすると再ブート後は、Windowsで走る全てのアプリケーションがこのドライバをアクセス出来るようになる。次の事例は、JDK環境で日本語対応化したConnectionTestMS-DOSプロンプトで実行させたものである。クラスパス指定により、ドライバが問題なくロードされていることがお分かりだろう。

 

C:\Jdk1.3.1>set CLASSPATH=e:\MM.MySQL\mm.mysql-2.0.4-bin.jar;%CLASSPATH%

 

C:\Jdk1.3.1>java ConnectionTest

ConnectionTest Started

username: 正十郎   password: MrHealer

username: 真紀子   password: MrsInconsistency

 

C:\Jdk1.3.1>

 

 

 

日本語対応化

 

ところで、Javaが使っている文字コードはUnicodeである。さっきのプログラムからドライバ経由でMySQLサーバに送ったSQLステートメントは、実は下8ビットのみである。ちなみに上のプログラムで日本語の文字列を入れてみると、下の8ビットだけの文字に化けていることが理解されよう。

 

今まではデフォルトの下8ビットだけで使える英語の文字セットで扱ってきていたが、日本語のように2バイト文字を使えるようにするには、接続の際にこれを指定しなければならない。Windows環境の場合はShift JISでデータベースに記録したほうが、DOSプロンプトでMySQLクライアント・ソフトからでもテストできるので、良かろう。

 

DriverManager.getConnectionメソッドに渡すURLの書式は次のとおりである。

jdbc:mysql://[hostname][:port]/dbname[?param1=value1][&param2=value2]...

指定可能なパラメタは次のとおりである。

名前

用途

デフォルト値

user

この名前で接続するユーザ

なし

password

接続に際し使うパスワード

なし

autoReconnect

コネクションが死んだときに再接続をするか否か(true/false)

false

maxReconnects

自動再接続が可のときは何回再接続を試行するか

3

initialTimeout

自動再接続が可のときは再接続にかける時間()

2

maxRows

返す最大行(0は全ての行を返す)

0

useUnicode

Java環境のように、Unicodeの文字エンコーディングを、文字列を扱うときに使うか否か(true/false)

false

characterEncoding

UseUnicodetrueにしたとき、どの文字エンコーディングを文字列に対して行ってデータベースとデータ交換するかを指定( EUC_JP , SJISなど )

none

 

従ってURLのパラメタ指定の個所に

?useUnicode=true&characterEncoding=SJIS

などのように指定してやればよい。

 

それでは、次のプログラムを実行してみよう。

 

package mysql_learning;

 

import java.sql.*;

/**

 * ^の記述を挿入してください。

 * 作成日 : (01/10/01 13:02:53)

 * @author:

 */

public class ConnectionTest {

/**

 * ConnectionTest コンストラクター・コメント。

 */

public ConnectionTest() {

  super();

}

/**

 * アプリケーションを開始します。

 * @param args コマンド行引き数の配列

 */

public static void main(java.lang.String[] args) {

 

  try {

// The newInstance() call is a work around for some broken Java implementations

    Class.forName("org.gjt.mm.mysql.Driver").newInstance();

  }

  catch (Exception E) {

    System.err.println("Unable to load driver.");

    E.printStackTrace();

  }

 

  try {

    /** 接続に際し、下8ビットだけが有効な文字セットの場合は、変換は指定しなくて良い */

//    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test");

    /** 漢字を扱うときは、接続時に文字セットの変換をJDBCドライバに指定する */

    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=SJIS");

//    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=EUC_JP");

 

    Statement statement = connection.createStatement();

    statement.executeUpdate("insert into users(username, password) values (\'正十郎\', \'MrHealer\')");

    ResultSet result =  statement.executeQuery("select username, password from users");

    while (result.next()){  //line by line reslt out

      String username = result.getString(1);

      String password = result.getString(2);

      System.out.println("username: "+username +"   password: "+password);

    }

    statement.close();

    connection.close();

 

  }

  catch (SQLException E) {

    System.out.println("SQLException: " + E.getMessage());

    System.out.println("SQLState:     " + E.getSQLState());

    System.out.println("VendorError:  " + E.getErrorCode());

  }

 

 

}

}

 

このプログラムを実行させると、コンソールに出力されたusersというテーブルの中身で文字化けを生じていることがわかるであろう。これはMS-DOSプロンプトでMySQLクライアントを使ってこのテーブルをアクセスしても同じ結果が得られる。

 

username: 真紀子   password: MrsInconsistency

username: 正序Y   password: MrHealer

 

これはShift JISの場合は、第2バイトにASCII文字が入ってしまうからで、「正」という漢字のShift JISコードが0x8f5cで、この下の0x5cASCIIのバックスラッシュになり、MySQLサーバがこのバイトを飛ばすためである。つまり:

 

「正十郎」のShift JISのバイト列:90-B3-8F-5C-98-59

5CASCIIのバックスラッシュなので外すと:90-b3-8f-98-59

これは「正序」という4バイトと、ASCII’Y’に相当する0x591バイトとみなされる。

 

MySQLサーバをShift JIS対応にし、このような問題を解決するためには、my.ini設定ファイルにこれを記述する必要がある。下図のように[mysqld]のブロックに

default-character-set=sjis

なる行を追加する。こうするとShift JISでも問題が生じなくなったことがさっきのプログラムを使って確認できよう。

 


 


注: MySQLの日本語化に関する情報はhttp://www.softagency.co.jp/mysql/TIPS/jp.htmlなどを参照されたい。