■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ 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. 不許無断複製 |