データベース接続Bean 本章のプログラムを御覧の際には、Tomcatが必要です。
こちらからダウンロード出来ます。
ファイルはzipフォルダに納められています。
解凍ソフト(Aladdin
Expander等)を使って解凍して下さい。
データをまとめるクラスの作成「YoyakuData.java」 初めに、呼び出したデータをまとめて扱う為のクラス(Bean)を作成しておきましょう。 @フィールド データベースでは、「日付」「部屋番号」「時間帯」は「ID」と言うフィールドに収めておりますが、会議室予約システムでは、バラバラに使用するので、それぞれ分けておきましょう。 Aコンストラクタ Beanの条件である引数無しのコンストラクタの他に、インスタンス化時に、フィールドの初期化を行うコンストラクタも用意する事にしましょう。 Bセッタメソッドとゲッタメソッド 各フィールドのそれぞれについてセッタメソッド・ゲッタメソッドを用意します。 Cパッケージ化 「YoyakuBeans」パッケージに入れておきます。 データベースと接続 データベースに関する処理は、其れを扱うクラス(Bean)を作って、其処で集中的に行います。
データベースの接続に当たっては、以下のクラス及びインターフェースを使います。
Connection |
データベースと接続情報を保持するオブジェクトをインスタンス化 |
Statement |
SQLを実行する為のオブジェクトをインスタンス化 |
ResultSet |
SQLを実行した結果を保持するオブジェクトをインスタンス化 | 接続の手順は以下の通りです。 @JDBCドライバのロード 此処で使用するドライバ名は、 となります。 Aデータベースの接続 connection = DriverManager.getConnection("接続URL名", "ユーザ名", "パスワード"); |
接続URL名は、以下の様に書きます。 jdbc:mysql://localhost/データベース名?useUnicode = true$chatacterEncoding = SJIS |
BSQL文のコンテナの作成 statement = connection.createStatement(); |
データベースとの接続を切断 データベースの利用が終わったら、接続したデータベースを切断します。 SQL文の発行 SQL文は以下の様に発行します。 @SELECT文 resultset = statement.executeQuery(sqlQuery); |
AINSERT文・UPDATE文・DELETE文 statement.executeQuery(sqlQuery); |
結果の取得 SELECT文で取得した時、ResultSetインターフェースのオブジェクト「resultSet」は、抽象されたデータに対してポインタの働きをします。
下の表の用に、Javaにはカレントレコードを移動するメソッドが用意されています。
メソッド名 |
動作 |
next() |
次のレコードに移動 |
absolute(int row) |
指定の行数に移動 |
beforeFirst() |
先頭のレコード直前に移動 |
first() |
先頭のレコードに移動 |
previous() |
1つ前のレコードに移動 |
relative(int rows) |
相対行数だけ移動 |
afterLast() |
最後のレコードの直後に移動 |
last() |
最後のレコードに移動 | 「レコード1」の各フィールドに記録されているデータがフィールド毎に読み出せます。
読み出す為のメソッドは、取りだしたデータをどの方に変換したいかによって異なります。
フィールドの型 |
メソッド名 |
数値型(整数) |
getInt("フィールド名"); |
getInt("列番号"); |
getLong("フィールド名"); |
getLong("列番号"); |
数値型(小数点付き) |
getDouble("フィールド名"); |
getDouble("列番号"); |
getFloat("フィールド名"); |
getFloat("列番号"); |
論理型 |
getBoolean("フィールド名"); |
getBoolean("列番号"); |
テキスト型 |
getString("フィールド名"); |
getString("列番号"); |
例: |
String id = resultset.getString("ID"); |
long id2 = resultset.getLong("ID"); | 日付のデータベース仕様 日付を処理するMyDateクラス「MyDate.java」に、日付をデータベースに登録する時の形式「yyyyMMdd」に変換するメソッド「toDBFormat」を追加しておきます。 public String toDBFormat(){
SimpleDateFormat dateDBFormat = new SimpleDateFormat("yyyyMMdd");
return dateDBFormat.format(date); |
データベースに接続するクラス「yoyakuDB.java」 コンストラクタでは、データベースの接続を行います。
会議室予約状況画面では表の枠に、在る日の在る部屋の在る時間帯の予約データを表示しますが、此は1意です。
其処で、SQLのSELECT文で検索のキーとなる「日付」「部屋番号」「時間帯」を引数として受け取り、SQL文を発行して、読み込んだ1レコードから作成したYoyakuDataクラスのオブジェクトを返すメソッドを作っておく事にしましょう。 public YoyakuData dataRead(String day, String room, int time); |
予約状況表示画面 予約状況画面では、いよいよ表に表示するデータをデータベースから読み込んだ「ホンモノ」にします。
先ず、セッションから読み込んだユーザ情報の中から日付を取り出し、データベースフォーマットの文字列に変換しておきます。 String nowDate = userInf.getDate().toDBFormat(); |
次に、データベースに接続します。
YoyakuDBクラスのオブジェクトをインスタンス化する事で接続出来ます。
此の時、YoyakuDBクラスでは発生したエラーをスローしますので、此を受け止める「try〜catch」文が必要です。 YoyakuDB db = new YoyakuDB(); |
表の各セルに対するデータをデータベースから読み出します。
該当する物が無い時は、「null」が変えるので、其処のセルは「<BR>」のみとなります。
データが読み出せた時は、今迄直接データを書いていたHTMLを参考に、データベースから読み込んだデータに置き換えていきます。 <TD>部課長会議<BR>総務部<A HREF = "mailto:sone@kaisya.co.jp">曽根</A></TD> |
表のセルの1つ1つについて、以上の処理を繰り返し、全部表示出来たら、データベースの接続を切断します。
「YoyakuDB」からエラーがスローされた時には、エラーの状況をブラウザに表示します。
既に作成してあるKekkaHyoujiクラスを使います。 データベースへのデータの追加と削除「YoyakuDB.class」 YoyakuDBクラスに、INSERT文を発行するメソッドと、DELETE文を発行するメソッドを追加します。
戻り値 |
メソッドの詳細 |
void |
insertData(YoyakuData data) |
引数として渡されたdataを元にINSERTのSQL文を組み立てて発行、レコードを挿入 |
int |
deleteData(YoyakuData data) |
引数として渡されたdataを元にDELETEのSQL文を組み立てて発行、レコードを削除し、其のレコード数を返す | 排他制御 一連の処理中に、別のスレッドが処理を出来ない様にするには、メソッドに「synchronized」修飾子を付けます。
こうすると、此のメソッドの処理中に此を中断して、同じメソッドを実行出来なくなります。
同じクラスに「synchronized」修飾子の付いたメソッドが複数有った場合、此等は同時に排他制御されます。
此処では、予約処理とキャンセル処理の両方に「synchronized」修飾子を付けるので、在るスレッドが予約処理をしていた場合、別のスレッドは其れが終わる迄予約処理もキャンセル処理も始められません。
其れ以外の処理は、通常通り実行出来ます。 エラー発生時に起動されるJSP JSPページ内で補足されなかったエラーが発生した場合、Tomcat指定のエラーページが表示されて終います。
此を横取りして、任意のページを起動する様にしましょう。
pageディレクティブに、 を追加します。
此の時、エラーファイルとして指定されたjspは、此のページがエラー発生時に起動されるページであると言う事を明示する構文の、 を、pageディレクティブに書いておかなければなりません。
サーブレットの場合は、取得したセッションにデータがバインドされていない事を検出し、エラーファイルのページを検出します。 戻る |