■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
                      2007年12月24日

    楽しいJava講座 - 初心者から達人へのパスポート
                  vol.084

                                セルゲイ・ランダウ
 バックナンバー: http://www.flsi.co.jp/Java_text/
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


[このメールマガジンは、画面を最大化して見てください。]


========================================================
◆ 01.Tomcatのアプリケーション開発
========================================================


これでEclipseでMySQLを使用するための準備もできましたので、
これから、サーブレットとBeanとRDBMS(MySQL)とJSPを連携さ
せる方法を説明したいと思いますが、その前に、データベースの
CUSTOMERテーブルにテスト用のデータを入れてみることにしま
しょう。


Eclipseを起動し、DBViewerのパースペクティブを開いてください。
(パースペクティブの開き方を忘れた人は前回の説明を復習して
ください。)

DBViewerのパースペクティブが開きましたら、データベースINTSHOP
に接続しましょう。
(これも前回説明した通りですが、「DBツリー・ビュー」の中の
DBViewerPluginの中のINTSHOPを右クリックし、「接続」を選択す
ればよかったのでしたね。)

次に、「SQL実行・ビュー」に以下のSQLを入力してください。

insert into CUSTOMER values ('T0001', '試験太郎', '111-1111', '某県某市某町1-1-1');

入力が終わったら、「全てのSQLを実行」ボタン(緑色で右向きの矢印
(というよりも三角形)の入ったアイコンのボタン)をクリックする
ことによって実行してみてください。

では、入力したデータを確認してみましょう。「SQL実行・ビュー」
に以下のSQLを入力してください。

select * from CUSTOMER;

(あるいは、「DBツリー・ビュー」の中のTABLEの中のcustomerをダブル
クリックしてもデータを確認できます。)

結果が上のほうの「[INTSHOP]結果」タブ下に表示されますが・・・、
なんと、文字化けしていますね!

もう、読者のほとんどの人はおわかりのことと思いますが、これは
MySQLに正しい文字コードを指定していないために生じる現象です。

文字コードの設定をMySQLのデフォルト(西洋の文字コード)のまま
にしていたため、日本語の文字を入力すると文字化けをおこしてし
まうのです。

この問題に対処するためには、文字コードを明示的に指定してやる
必要があります。
文字コードは、ALTER TABLEなどのSQLを使ってテーブルごとに個別に、
あるいはカラムごとに個別に指定することもできるのですが、面倒です
から、ここではMySQLのデフォルトの文字コードの設定を変更してしま
いましょう。
(DBViewerはShift_JIS環境で動作するので、Shift_JISに設定すること
にします。)

では、DBViewerのINTSHOPへの接続を切断(切断の方法を忘れた人は
前回の最後のほうを復習してください)してから、以下の作業を行っ
てください。


(1) 「サービス」ウインドウを開きましょう。

<<Windows XPの標準のスタート・メニューであれば>>
「スタート」ボタンをクリック→「コントロールパネル」→
「パフォーマンスとメンテナンス」→「管理ツール」を選択し、
「サービス」をダブル・クリックします。

<<Windows 2000(あるいはWindows XPでもクラシック表示にしている場合)のスタート・メニューであれば>>
「スタート」ボタンをクリック→「設定」→「コントロールパネル」→
「管理ツール」を選択し、「サービス」をダブル・クリックします。

(2) MySQLのサービスを停止しましょう。
「サービス」ウインドウの中のリストに(下にスクロールすると)
MySQLがありますから、それを右クリックし、「停止」を選択します。

(3) MySQLのインストール・ディレクトリー(C:\Program Files\MySQL\MySQL Server 5.0)に
my.ini
というファイルがありますので、これをテキスト・エディター
(NoEditorまたはワードパッド)で開いて、以下のように編集
してください。

=====================================
default-character-set=latin1

という部分(2箇所あります)を

default-character-set=sjis

に書き換えます。
=====================================
(ここでsjisは、Shift_JISを表します。)

(4) my.iniファイルを上書き保存して閉じます。

(5) MySQLのサービスを再度、開始しましょう。
「サービス」ウインドウの中のリストの中のMySQLを右クリックし、
「開始」を選択します。


では、このデフォルトの文字コードの環境下でテーブルを作成し直し
ましょう。

MySQLのコマンド・ライン・クライアントを起動して作業を行いま
しょう。
(1) 「スタート」ボタン→「すべてのプログラム」→「MySQL」→
「MySQL Server 5.0」→「MySQL Command Line Client」
を選択します。

(2) rootのパスワードを聞いてきますので

rootpass

を入力しましょう。

(3) まだデータベースINTSHOPのほうは以前のデフォルトの文字コード
のままですから、変更しておきましょう。下記のコマンドを入力して
ください。

alter database INTSHOP charset sjis;

(4) 続いて、INTSHOPデータベースを使用(接続)するために以下の
コマンドを入力します。

use INTSHOP

(5) テーブルを作り直すために、ひとまず下記のコマンドを入力して
既存のテーブルを削除しましょう。

drop table ORDERITEM;

drop table ORDERHEADER;

drop table ITEM;

drop table CUSTOMER;

(上記の削除するテーブルの順番には意味があるので注意してください。
外部キーの設定によってテーブル同士に関係があるときは、参照されて
いるテーブルのほうを先に削除してしまうと問題が生じますので、後回し
にします。たとえば、ORDERHEADERはORDERITEMによって参照されています
からORDERITEMよりも後回しにし、ITEMやCUSTOMERはORDERHEADERによって
参照されていますから、ORDERHEADERよりも後回しにする、という順番に
なるのです。)

(6) 以下のコマンドでテーブルを再作成しましょう。以前、テーブルを
作成するためのSQLコマンドをファイルに保管していましたから、それを
使います。

source C:\JavaWorks\CUSTOMER.sql

source C:\JavaWorks\ITEM.sql

source C:\JavaWorks\ORDERHEADER.sql

source C:\JavaWorks\ORDERITEM.sql

(これも削除のときと同じ理由で、順番に注意してください。)


以上で作成されたテーブルでは、文字コードがShift_JISになっています。
(上記のコマンドは基本的にはDBViewerでも実行できるのですが、現時点
では少し不具合があるため、当メールマガジンではMySQLのコマンド・
ライン・クライアントを使用しました。ちなみに、SQLコマンドを入れた
ファイルをDBViewerで使用するためには、DBViewerの「SQL実行・ビュー」
の一番左側にある「SQLファイルを開いてください」ボタン(フォルダーの
アイコンのボタン)をクリックしてファイルを指定すればいいようになっ
ています。逆に、入力したSQLをファイルに保存することもできます
(その右隣のボタン)。)


では、この文字コードをDBViewerのほうでも指定しておきましょう。

(1) Eclipseの「DBツリー・ビュー」の中のDBViewerPluginの中のINTSHOP
を右クリックし、「編集」を選択します。
(2) 「次へ」ボタンをクリックします。
(3) もうひとつ「次へ」ボタンをクリックします。
(4) 「Charsetの設定(有効なデータベースのみ)」欄に
sjis
を入力し、「終了」ボタンをクリックします。


では、続いてデータベースINTSHOPに接続しておきましょう。
(INTSHOPを右クリック→「接続」)


┌補足─────────────────────────┐
MySQLではどんな文字コードが使用できるか知りたい人は、
「SQL実行・ビュー」に以下のSQLを入力してください。

show character set;

そうすると、その上のほうに、使用できる文字コードの名前が
リストされますね。
ちなみに、これらのうちbinaryというのは文字コードの名前では
なく、特定の文字コードを認識せずに、入力されたデータをその
まま無変換で格納し、そのまま無変換で出力するというものです。
└───────────────────────────┘


では、いよいよテスト用のデータを入力していきましょう。
「SQL実行・ビュー」に以下のSQLを入力してください。

insert into CUSTOMER values ('T0001', '試験太郎', '111-1111', '某県某市某町1-1-1');
/
insert into CUSTOMER values ('T0002', '試験花子', '112-1112', 'なんとか県なんとか市なんとか町1-2-3');
/
insert into CUSTOMER values ('T0003', '試験次郎', '113-1113', 'ほにゃら県ほにゃら市ほにゃら町4-5-6');
/

(DBViewerでは、複数のSQL文を入力するときには、上記のように
スラッシュ(/)の行で分けることになっています。なお、スラッ
シュは、SQL文にくっつけるのではなく、上記のように独立した行に
します。)
入力が終わったら、「全てのSQLを実行」ボタンをクリック
しましょう。

なお、DBViewerのデフォルトでは自動コミットになっていないため、
このあと自分で「コミット」ボタン(円筒形のアイコンのボタンが
2つあるが、左側のが「コミット」ボタン)をクリックしてコミット
しておく必要があります。(コミットしておいてください。)

面倒だと思う人は、「M」ボタン(Mという文字のアイコンのボタン)
の右側の三角形ボタンをクリックして「Auto Commit」を選択するか、
または、「M」ボタン自体をクリックすると、自動コミットになります
ので、この操作を行っておきましょう。

以後、当メールマガジンでは、DBViewerを自動コミットにしていること
を前提としてお話していきます。


さて、ここで「DBツリー・ビュー」の中のTABLEの中のcustomerを
ダブル・クリックしてみましょう。右上のcustomerタブ下にデータ
が表形式で表示されますが、ちゃんと漢字が表示されていることが
わかりますね。
ちなみに、この表では、表計算ソフトのように直接データを編集す
ることもできるし、データを追加することもできます。
リレーショナル・データベースのデータの1行をレコードと呼ぶこと
もありますが、レコードは新規に追加することもできれば、既存の
レコードをコピーして貼り付け、それを編集して新しいレコードに
することもできます。

では、コピー&貼り付けで新しいレコードを作ってみましょう。

(1) 「試験次郎」の行を右クリックし、「レコードをコピー」を
選択してください。

(2) 再度、右クリックし、「レコードを貼り付け」を選択して
ください。

(3) 先頭にアスタリスク(*)がついた行ができ、コピーされた
内容が表示されますので、必要な箇所を編集してください(TABキー
またはカーソル・キー(←や→の矢印が描かれているキー)で
編集するカラムを移動できます。下のほうに赤色の字で説明文が
出ているはずです)。たとえば、NUMカラムはT0004にし、NAMEカラム
は試験三郎にし、他のカラムもお好きな値に編集してみてください。
(少なくともNUMカラムはプライマリー・キーなので、必ず編集して
他のレコードと異なる値にしておかなければなりません。)

(4) 最後にEnterキーを押します。
そうすると、編集された内容がデータベースに反映され、先ほどの
アスタリスクのマークは数字に変わります。


なお、どれがプライマリー・キーだったか忘れたときなど、テーブル
の構造を知りたいときは、下のほうの「DDL」というタブをクリック
すればCREATE TABLEのSQL文が表示されるのでこれで調べることが
できます。SQL文ではわかりにくいという人は、「定義情報」タブを
クリックすれば、もっとわかりやすい表示になります(プライマリー・
キーは下のほうに表示されます)。



それでは、最後に、Javaのプログラムでもちゃんとデータの入力や
表示ができるか確認してみましょう。

下記のようなクラスを作成して実行してみてください(もちろん、
パースペクティブをJavaに切り替えてから作業を行います)。
(以前H2 Database Engineの説明をしたときのプログラムとほとん
ど同じなので、解説は省略します。)


(データを新規追加するプログラム)
--------------------------------------------------------
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

public class MySqlTest1 {
   public static void main(String[] args) {
      {
         try {
            Class.forName("com.mysql.jdbc.Driver");
            Properties props = new Properties();
            props.put("user", "root");
            props.put("password", "rootpass");
            Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/INTSHOP", props);
            conn.setAutoCommit(false);
            PreparedStatement inSql = conn.prepareStatement("insert into CUSTOMER  values (?, ?, ?, ?)");
            inSql.setString(1, "J0001");
            inSql.setString(2, "なんとか太郎");
            inSql.setString(3, "000-0001");
            inSql.setString(4, "市川市某町301-300-301");
            inSql.executeUpdate();
            inSql.setString(1, "J0002");
            inSql.setString(2, "なんとか次郎");
            inSql.setString(3, "000-0002");
            inSql.setString(4, "市川市某町301-300-302");
            inSql.executeUpdate();
            inSql.close();
            conn.commit();
            conn.close();
         }
         catch (SQLException exception) {
            exception.printStackTrace();
         }
         catch (Exception otherException) {
            otherException.printStackTrace();
         }
      }
   }
}
--------------------------------------------------------


(データを表示するプログラム)
--------------------------------------------------------
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class MySqlTest2 {
   public static void main(String[] args) {
      {
         try {
            Class.forName("com.mysql.jdbc.Driver");
            Properties props = new Properties();
            props.put("user", "root");
            props.put("password", "rootpass");
            Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/INTSHOP", props);
            conn.setAutoCommit(false);
            Statement selectSql = conn.createStatement();
            ResultSet rs = selectSql.executeQuery("select * from CUSTOMER");
            while (rs.next()) {
               System.out.println(rs.getString(1) + ", " + rs.getString(2) + ", " + rs.getString(3) + ", " + rs.getString(4));
            }
            selectSql.close();
            conn.close();
         }
         catch (SQLException exception) {
            exception.printStackTrace();
         }
         catch (Exception otherException) {
            otherException.printStackTrace();
         }
      }
   }
}
--------------------------------------------------------


実行が終わったら、DBViewerでも同じデータが表示されることを
確認しておいてください。


では、今回はここまでとし、INTSHOPを切断しておきましょう。
「DBツリー・ビュー」の中のINTSHOPを右クリックし、「切断」を
選択してください。



(次回に続く)


何か、わからないところがありましたら、下記のWebページまで質問を
お寄せください。



┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
★ホームページ:
      http://www.flsi.co.jp/Java_text/
★このメールマガジンは
     「まぐまぐ(http://www.mag2.com)」
 を利用して発行しています。
★バックナンバーは
      http://www.flsi.co.jp/Java_text/
 にあります。
★このメールマガジンの登録/解除は下記Webページでできます。
      http://www.mag2.com/m/0000193915.html
★このメールマガジンへの質問は下記Webページにて受け付けて
 います。わからない所がありましたら、どしどしと質問をお寄
 せください。
      http://www.flsi.co.jp/Java_text/
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

Copyright (C) 2007 Future Lifestyle Inc. 不許無断複製