第8回 Servlet/JSP+MySQLでアプリケーションサーバ その1
鶴長 鎮一
MySQLユーザ会
2001/6/12
Javaアプリケーションのコーディング
■JDBCドライバのロードとMySQLサーバへの接続
では、JDBCドライバをロードしてMySQLサーバへ接続するサンプルを見てみましょう(リスト1)。
1、2行目でJDBC APIを使用するためにjava.net.*とjava.sql.*をインポートし、
import java.net.*; |
7〜11行目で必要な値の宣言を行います。
String server = "localhost"; //MySQLサーバ |
11行目の、サーバの単純なURLは下記のように定義されます。
jdbc:<サブプロトコル名>://<サブネーム> |
一般的にホームページのアドレスは「http://www.mysql.gr.jp」のように「プロトコル名://サーバのアドレス」で構成されるのに対し、JDBC APIを使ってデータベースに接続するにはサブプロトコルが必要になります。このサブプロトコルはJavaSoftから一意に与えられており、MM.MySQL JDBCドライバの場合は「mysql」がサブプロトコルになります。
次にMM.MySQL JDBCドライバをロードします(15行目)。
Class.forName("org.gjt.mm.mysql.Driver"); |
準備が整ったところでDriverManagerのConnectionメソッドに、URL、ユーザー名、パスワードを引数として渡し、MySQLサーバと接続します(18行目)。
con = DriverManager.getConnection(url,user,pass); |
MySQLサーバに対するすべての操作が終わったところで接続を解除します(23行目)。
con.close(); |
ではサンプルをコンパイル、実行してみましょう。Sample1.java(リスト1)を保存したディレクトリで下記のようにします。
$ $JAVA_HOME/bin/javac Sample1.java |
コンパイルが成功した後、Sample1.classファイルができていることを確認したら、上のディレクトリに先ほど展開してできたmysql.jarをコピーして実行します。
$ cp mm.mysql-2.0.4/mysql.jar . |
MM.MySQL JDBCドライバを参照するため、javaコマンドに-classpathオプションを使ってmysql.jarファイルをclasspathに追加しています。ここで重要なのは、-classpathオプションを指定することです。暗黙的なclasspathである“.”(カレントディレクトリ)がclasspathから外れてしまうのを防ぐことです。そのため、
-classpath mysql.jar:. |
とすることで、mysql.jarとカレントディレクトリを明示的にclasspathに追加します。成功していれば「接続成功です!」と表示されます。
■レコードの挿入
では次に、実際にMySQLサーバに対し「INSERT」を行ってみましょう(リスト2)。
JDBCを使ってクエリーを作成するには、まずStatementオブジェクトを作成する必要があります(21行目)。
Statement stmt = con.createStatement(); |
StatmentクラスのexecuteUpdate()メソッドにSQL文を渡すことでINSERT、UPDATE、DELETEEなど、SELECT以外のクエリーを実行できます(23行目)。
stmt.executeUpdate(sql_str); |
| 注:SQL文中に「'」「"」「\」を含ませる場合はエスケープ文字を用いて「\'」「\"」「\\」とします。 |
ではコンパイルと実行です。Sample2.java(リスト2)を保存したディレクトリで下記のようにします。
$ $JAVA_HOME/bin/javac Sample2.java |
「レコードの挿入成功です!」と表示されれば成功です。また本当にデータが挿入されているか下記の手順で確かめてみましょう。
$ mysql ATMARKIT |
■漢字の対応
MySQLは多くの方の努力により、EUCやシフトJISなどのマルチバイト文字に対応しています。一方、Java内部ではUnicodeとして文字を扱い、入出力は実行環境のfile.encodingに左右されます。そのため、Windows 95/98/2000/NTではマルチバイトを含んだSQL文はシフトJISとして実行され、LANGがja_JP.eucJPにセットされているLinuxではEUCとして実行されます。Javaアプリケーションを実行する際に「java -Dfile.encoding=EUC_JP」などとして明示的に指定することも可能ですが、MM.MySQL JDBCドライバはURLにcharacterEncodingパラメータを指定することで、文字列を任意のコードとして扱えます(リスト3)。
リスト2とリスト3では、11行目が異なっていることが分かるかと思います。
String url = "jdbc:mysql://"
+ server + "/" + db; |
| リスト2の11行目 |
String url = "jdbc:mysql://"
+ server + "/" + db + "?useUnicode=true&characterEncoding=EUC_JP"; |
| リスト3の11行目 |
jdbc:mysql://<MySQLサーバ名>:<ポート番号>/<データベース名>?useUnicode=true&characterEncoding=<サーバの文字コード> |
| characterEncodingを使った場合の書式 |
| 注:MySQLサーバがデフォルトの3306ポートで起動しているなら:<ポート番号>は省略できます。 |
●characterEncodingの例
[MySQLサーバがEUCで起動している場合]
jdbc:mysql://<MySQLサーバ名>:<ポート番号>/<データベース名>?useUnicode=true&characterEncoding=EUC_JP |
[MySQLサーバがシフトJISで起動している場合]
jdbc:mysql://<MySQLサーバ名>:<ポート番号>/<データベース名>?useUnicode=true&characterEncoding=SJIS |
| 注:characterEncodingパラメータは同時に「useUnicode=true」の指定が必要です。 |
MM.MySQL JDBCでは、上記以外にもURLにパラメータを加えることでさまざまな値を調整できます。
|
変数
|
用途
|
デフォルト値
|
| user | 接続時のユーザー名 | なし |
| password | 接続時のパスワード | なし |
| autoReconnects | データベースとの接続が失われた場合、再接続を試みるかどうか(true/false) | false |
| maxReconnects | autoReconnectsが選択されている場合、再接続を何回まで行うか | 3 |
| initialTimeout | autoReconnectsが選択されている場合、再接続までの待ち受け時間(秒数) | 2 |
| maxRows | データベースサーバから受け取る最大レコード数(すべて受け取る場合は0) | 0 |
| useUnicode | 文字列を扱う際、Unicode変換を行うかどうか(true/false) | false |
| characterEncoding | 文字コード変換を何で扱うか(useUnicodeが選択されている必要あり) | なし |
| 表 MM.MySQL JDBCのURLパラメータ | ||
URLの指定は、下記の要領になります。
jdbc:mysql://<MySQLサーバ名>:<ポート番号>/<データベース名>?<変数1=値1>&<変数2=値2>&... |
では、漢字を含んだINSERTクエリーを実行してみましょう。Sample3.java(リスト3)を保存したディレクトリで下記のようにします。
$ $JAVA_HOME/bin/javac Sample3.java |
「漢字を含んだレコードの挿入成功です!」と表示されれば成功です。
■レコードの抽出
次はSELECTクエリーをJavaアプリケーションで実行してみましょう(リスト4)。
リスト2と同様にStatementオブジェクトを作成します(21行目)。SELECTクエリーを実行するには、先ほどのexecuteUpdate()メソッドではなく、executeQuery()メソッドを呼び出し、戻り値にResultSetオブジェクトを受け取ります(25行目)。
ResultSet rs = stmt.executeQuery(sql_str); |
ResultSetオブジェクトのnext()メソッドの戻り値がfalseになるまでgetXX()メソッドに該当カラムのカラム番号を引数に渡し、処理を行います(28〜36行目)。
while(rs.next()){ |
| 注:カラム番号ではなく、カラム名を引数に渡すこともできます。 |
ResultSetオブジェクトには、各レコードの型に対応して下記のようなデータの取得方法が用意されています。
|
get系メソッド
|
得られるJavaの型
|
|
| getAsciiStream | InputStream | |
| getBigDecimal | BigDecimal | |
| getBinaryStream | InputStream | |
| getBoolean | boolean | |
| getByte | byte | |
| getBytes | byte[] | |
| getDate | sava.sql.Date | |
| getDouble | double | |
| getFloat | float | |
| getInt | int | |
| getLong | long | |
| getObject | java.lang.Object | |
| getShort | short | |
| getString | String | |
| getTime | java.sql.Time | |
| getTimestamp | java.sql.timestamp | |
| getUnicodeStream | InputStream |
では、実行してみましょう。Sample4.java(リスト4)を保存したディレクトリで下記のようにします。
$ $JAVA_HOME/bin/javac Sample4.java |
先ほど登録したレコードも含めて結果が表示されると思います。
-------1--------- |
次回は、今回作成したプログラムをServlet化してWebブラウザから使えるようにしたいと思います。また、Servletを実行するにはApacheに加えてTomcatというJava実行環境が必要になります。そこでTomcatの設定についても紹介します。
|
2/3
|
| Index | |
| 快速MySQLでデータベースアプリ! | |
| Webアプリの大本命、Java | |
| Javaアプリケーション開発の準備 JSDK 1.3.1のインストール JDBCドライバのインストール データベースとテーブルの準備 |
|
| Javaアプリケーションのコーディング JDBCドライバのロードとMySQLサーバへの接続 レコードの挿入 漢字の対応 レコードの抽出 |
|
| Appendix | |
| 連載 快速MySQLでデータベースアプリ! |
| Linux Squareフォーラム データベース関連記事 |
| 連載:快速MySQLでデータベースアプリ!(全11回) 軽快な動作で知られるRDBMS、MySQLでDBアプリの構築を行う。MySQLのインストールに始まり、PerlやRubyなどのスクリプトでデータベースを操作する方法までを完全解説 |
|
| 連載:今から始める MySQL入門(連載中) 定番のLAMP(Linux+Apache+MySQL+PHP)構成でWebアプリケーション開発に挑戦! サンプルアプリの構築を進めながら、基礎知識や操作方法について詳しく解説する |
|
| 連載:Oracleマイスター養成講座(全6回) 本連載では、Oracleの管理・チューニング方法を紹介していく。これからOracleを始める人、そしてOracleをより深く理解したい人のための、一歩踏み込んだ実用講座 |
|
| 連載:DB2マイスター養成講座(全7回) 本連載では、DB2 UDBの実践的な運用・管理方法を紹介していく。DB2を利用するうえで必要な知識を、実運用を前提にDB2のプロが解説 |
|
| 特集:エンタープライズ市場に向かうMySQL
5.0[前編] MySQL 5.0の新機能をアルファ版でチェック 1月に公開された5.0アルファ版は大幅に拡張されており、エンタープライズ市場への進出を予感させる |
|
| 特集:Linuxで動くリレーショナルデータベース・カタログ データベースサーバのOSとしてLinuxを採用するケースが増えている。Linuxで動作する7つの主なリレーショナルデータベースを紹介する。製品導入の際の参考にしてほしい |
|
|
TechTargetジャパン
- クライアントがアクセスできる範囲を制限する (2012/2/10)
今回は、サーバ上のファイルの扱いに関係する設定項目について解説します - 新しい記事も入っていて安心しました (2012/2/7)
Linux Squareのアクセスランキングを公開します。定番の記事ばかりでなく、連載中の記事もよろしくお願いいたします - エラーメッセージをどう扱うか? (2012/2/2)
今回は、スクリプト実行時にエラーが発生したことを知らせるメッセージの扱い方を説明します - ファイルのアップロードを制限する (2012/1/30)
HTTPクライアントがアップロードしてくるファイルの扱いについて解説します。そもそも受け入れる必要があるのか? ということのほかにも、いろいろ設定が必要です
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -
