MySQLとそのJDBCドライバ(MM.MySQL)のダウンロード法
このチュートリアルでは、シンプルかつ高速で、日本語対応も出来ているデータベースであるMySQLを教材としている。MySQLは個人的に使用するのであれば無料である。またそのJDBCドライバMM.MySQLは、VisualAge for Javaで動作することが確認されているので、今回のチュートリアルにはぴったりである。
以下に一般的に使われているWindows環境にこれをダウンロードし、サーブレットからアクセス出来るようにする手順を示す。なおMySQLやJDBCドライバに関しては日本語の優れた情報がネット上に数多く存在するので、判らなくなったらこれらの情報にアクセスされることをお勧めする。またインストールすると英文ではあるが詳細なマニュアルがあるので、これを利用する。場所はfile:///C:/mysql/Docs/manual.html#Windows_installationである。
環境:Java環境(JREまたはJDK)が出来ているWindows(98、2000、NTなど)。
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以外のディレクトリにインストールしたり、MySQLをNT/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/98はC:\Windows、NT/2000はC:\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ドライバからのアクセスの確認
MySQLをJava環境で利用するには、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 |
これでMySQLをJavaで動作可能になっているはずである。あらかじめ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% |
これはJRE(Javaランタイム)とJavaコンパイラにこのドライバを探す際のパスをあらかじめ教えるものである。このコマンドはAUTOEXEC.BATファイルの最後の行に追加しても良い。そうすると再ブート後は、Windowsで走る全てのアプリケーションがこのドライバをアクセス出来るようになる。次の事例は、JDK環境で日本語対応化したConnectionTestをMS-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][¶m2=value2]...
指定可能なパラメタは次のとおりである。
名前 |
用途 |
デフォルト値 |
user |
この名前で接続するユーザ |
なし |
password |
接続に際し使うパスワード |
なし |
autoReconnect |
コネクションが死んだときに再接続をするか否か(true/false) |
false |
maxReconnects |
自動再接続が可のときは何回再接続を試行するか |
3 |
initialTimeout |
自動再接続が可のときは再接続にかける時間(秒) |
2 |
maxRows |
返す最大行(0は全ての行を返す) |
0 |
useUnicode |
Java環境のように、Unicodeの文字エンコーディングを、文字列を扱うときに使うか否か(true/false) |
false |
characterEncoding |
UseUnicodeをtrueにしたとき、どの文字エンコーディングを文字列に対して行ってデータベースとデータ交換するかを指定( 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で、この下の0x5cはASCIIのバックスラッシュになり、MySQLサーバがこのバイトを飛ばすためである。つまり:
「正十郎」のShift JISのバイト列:90-B3-8F-5C-98-59
5CがASCIIのバックスラッシュなので外すと:90-b3-8f-98-59
これは「正序」という4バイトと、ASCIIの’Y’に相当する0x59の1バイトとみなされる。
MySQLサーバをShift JIS対応にし、このような問題を解決するためには、my.ini設定ファイルにこれを記述する必要がある。下図のように[mysqld]のブロックに
default-character-set=sjis
なる行を追加する。こうするとShift JISでも問題が生じなくなったことがさっきのプログラムを使って確認できよう。
注: MySQLの日本語化に関する情報はhttp://www.softagency.co.jp/mysql/TIPS/jp.htmlなどを参照されたい。