データベース接続

「データベース接続」の編集履歴(バックアップ)一覧に戻る

データベース接続 - (2009/03/09 (月) 23:49:46) の編集履歴(バックアップ)


JDBCドライバの取得(MySQL用)


※2009.03.01時点でのバージョンは5.1.7

以下の順でダウンロードする。
  1. ここにアクセス http://dev.mysql.com/downloads/
  2. Drivers and ConnectorsのMySQL Connector/J — for connecting to MySQL from Javaの「MySQL Connector/J 5.1」
  3. Source and Binaries (zip)の「Pick a mirror」
  4. New Usersの「Proceed」
  5. 画面下部の「No thanks, just take me to the downloads!」
  6. 好きなミラーサイトの「HTTP」
  7. 適当な場所にダウンロード

  • インストール
  1. ダウンロードしたファイルを解凍(mysql-connector-java-5.1.7.zip)
  2. 解凍したフォルダ内のmysql-connector-java-5.1.7-bin.jarをTomcatをインストールしたフォルダ\common\lib\にコピーする。

JDBCドライバのロード

MySQLの場合は次のように行う。
try {
    Class.forName("com.mysql.jdbc.Driver").newInstance();
}catch (ClassNotFoundException e){
}catch (Exception e){
}
URL http://localhost:8080/database/databasetest
アプリケーション配置場所 c:\servlet-sample\database\
web.xmlファイル c:\servlet-sample\database\WEB-INF\web.xml
コンテキストファイル C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\database.xml

データベースへの接続と切断

データベースへの接続を確立するには「DriverManager」クラスで用意されている"getConnection"メソッドを使う。
引数には接続するデータベースを表すURLと接続用のユーザー名とパスワードを指定する。
MySQLの場合、URLの形式は次のようになる。
jdbc:mysql://(サーバ名)/(データベース名)

例えばローカルホストにある「jdbctestdb」というデータベースに接続する場合は次のようになる。
jdbc:mysql://localhost/jdbctestdb
実際の使用例
Connection conn = null;
String url = "jdbc:mysql://localhost/jdbctestdb";
String user = "testuser";
String password = "testpass";

try{
    conn = DriverManager.getConnection(url, user, password);
    // データベースに対する処理
}catch (SQLException e){
}
  • データベースの切断
いったん接続した後に切断する場合には、接続の際に取得したConnectionインターフェースのオブジェクトに対して、"close"メソッドを使う。
"close"メソッドは何か問題が発生した際に忘れずに行うためにも、次のように"finally"節を使って記述する。
Connection conn = null;
String url = "jdbc:mysql://localhost/jdbctestdb";
String user = "testuser";
String password = "testpass";

try{
    conn = DriverManager.getConnection(url, user, password);
    // データベースに対する処理
}catch (SQLException e){
    // 例外処理
}finally{
    try{
        if (conn != null){
            conn.close();
        }
    }catch (SQLException e){
        // 例外処理
    }
}

データベースの用意

データベース名は「jdbctestdb」とする。
  1. MySQLへ接続する: mysql -u root -p
  2. パスワード応答
  3. データベースを作成する: create database jdbctestdb;
  4. テスト用データベースに接続する: use jdbctestdb
  5. テーブルを作成する: create table kabukatable(code int, company varchar(32), primary key(code) );
  6. ユーザの追加、権限設定: grant select,insert,update,delete on jdbctestdb.* to 'testuser'@'localhost' identified by 'testpass';
  7. データを追加する: 下記参照
  8. データを確認する: select * from kabukatable;
データを追加する
※コマンドプロンプトからINSERTしようとした場合、「ERROR 1366 (HY000): Incorrect string value: '\x83r\x83b\x83N...' for column 'com
pany' at row 1」というエラーが発生し追加できない。これはどうやらMySQLインストール時に文字コードをutf-8にしたからの模様。正しい対処かどうかはわからないが、以下のSETコマンドを実行することでINSERTができるようになる。別セッションでSELECTしたりする場合は、毎回このSETを実行しないと文字化けする。
SET character_set_client = sjis;
SET character_set_connection = utf8;
SET character_set_results = sjis;

insert into kabukatable values
(3048,'ビックカメラ'),
(4689,'ヤフー'),
(4755,'RAKUTEN'),
(9984,'SoftBank');

データベース接続テスト

URL http://localhost:8080/database/databasetest1

データの取得(SELECT)

  • ステートメントを作成する
Connection」インターフェースで定義されている"createStatement"メソッドを使う。
conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
  • 問い合わせの実行
「Statement」インターフェースで用意されている"executeQuery"メソッドを使う。
conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM kabukatable";
ResultSet rs = stmt.executeQuery(sql);
  • 結果の取得
カーソルを動かすには「ResultSet」インターフェースで定義されている"next"メソッドを使う。
conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM kabukatable";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
    /* 行からデータを取得 */
    int code = rs.getInt("code");
    String company = rs.getString("company");
}
データ型毎の値取得メソッド一覧(一部)
boolean getBoolean(String columnName)
byte getByte(String columnName)
Date getDate(String columnName)
double getDouble(String columnName)
int getInt(String columnName)
long getLong(String columnName)
Timestamp getTimestamp(String columnName)
  • リソースの開放
使わなくなった「ResultSet」オブジェクトは"close"メソッドを使ってリソースを開放する。
また、「Statement」オブジェクトもに"close"メソッドを使ってリソースを開放する。
rs.close();
stmt.close();

URL http://localhost:8080/database/databasetest2







インクルード(include)

例えば、サーブレットAが呼ばれ、レスポンスに対して出力をしている途中でサーブレットBをインクルードしたとする。そうするといったんサーブレットBへ処理が移った後でサーブレットBの処理が終わったら呼び出し元のサーブレットAへ処理が戻り、残りの処理を行う。
例えばこのWebアプリケーションのパスが「/dispatch」でインクルードしたいサーブレットが「/dispatch/includetest」だった場合は次のようになる。
String disp = "/includetest";
RequestDispatcher dispatch = request.getRequestDispatcher(disp);
dispatch.include(request, response);
URL http://localhost:8080/dispatch/dispatchtest
アプリケーション配置場所 c:\servlet-sample\dispatch\
web.xmlファイル c:\servlet-sample\dispatch\WEB-INF\web.xml
コンテキストファイル C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\Catalina\localhost\dispatch.xml

フォワード(forward)

インクルードと似ているがフォワードの場合は処理をフォワード先のサーブレットに移すため、呼び出し元のサーブレットには処理は戻って来ない。また呼び出し元の方ではレスポンスに対する出力も行えない。その為、呼び出し元の方で何らかの処理を行った上で、処理をフォワード先のサーブレットに完全に移す場合に利用する。
フォワードは、元のサーブレットへ送られてきたパラメータなども含めてフォワード先のサーブレットへそのままフォワードする。その為、クライアントからはサーブレット内部でフォワードされたことに気が付かないまま、フォワード先のサーブレットからの出力を受け取る。
String disp = "/forwardtest";
RequestDispatcher dispatch = request.getRequestDispatcher(disp);
dispatch.forward(request, response);

リクエストへの属性追加

フォワードなどを行う際に、フォワード先に何か別の情報を合わせて渡すことができる。クライアントから送られてきたリクエストをフォワード先に渡す前に、リクエストに属性を追加することで実現する。
呼び出し元:setAttributeメソッド
request.setAttribute("hantei", "Out");
呼び出し先:getAttributeメソッド
String hantei = (String)request.getAttribute("hantei");

リダイレクト(redirect)

リダイレクトは他のサーブレットやHTMLファイルに処理を移す。フォワードと似ているが、フォワードはサーバ内で次のサーブレットなどへ処理を移すが、リダイレクトの場合はクライアントに対してリダイレクト先のサーブレットなどを見に行くように指示を出すだけ。その為、クライアント側でも処理が別のページ移ったことを認識できる。
例えば何かの処理をしてエラーだった場合にはエラーページへ飛ことや、データベースの処理だけをするサーブレットを呼び出した後に処理が終わったらサーブレットでは何も出力を行わずに特定のページへ飛ばすなどに使う。リダイレクトの場合には、別のサーバにあるURLへ飛ばすことも可能(フォワードの場合は同一サーバ内しか行えない)。
String url = "/dispatch/redirecttest";
response.sendRedirect(url);