3.JDBC API ( Servlet )

Java からデータベースにアクセスする JDBC API を Servlet 版で説明します。

(1) JDBC API ( Servlet )


 前章では、JDBCを使用してデータベースをアクセスする基本的な操作について説明しましたが、Servlet でも API 操作自体は同じです。問題はJDBC ドライバのロードできる環境が必要です。次の例は、データベース(MySQL)を参照し、結果を表示する Java Servlet のスタイルです。

// HelloWorldServletMysqlJDBC.java 

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public class HelloWorldServletMysqlJDBC 
                                 extends HttpServlet {

  public void service(HttpServletRequest request, 
  HttpServletResponse response) throws ServletException,
  IOException {

    response.setContentType
                    ("text/html;charset=Shift_JIS");
    PrintWriter out = response.getWriter();

    out.println("<html>");
    out.println("<head>");
    out.println("<title>Hello World Servlet</title>");
    out.println("</head>"); 
    out.println("<body>");
    out.println("Hello World Mysql<br><br>");

    try {
      Class.forName("org.gjt.mm.mysql.Driver");
      Connection con = 
        DriverManager.getConnection
            ("jdbc:mysql:///hellodb");
//          ("jdbc:mysql://127.0.0.1/hellodb") でも可
      Statement stmt = con.createStatement();
      String sql = "SELECT * FROM hello_world_table";
      ResultSet rs = stmt.executeQuery(sql);
      out.println("<table border=1>");

      while(rs.next()){
        int no = rs.getInt("NO");
        String lang = rs.getString("LANGUAGE");
        String msg = rs.getString("MESSAGE");
        out.println("<tr>");
        out.printin("<td>" + no   + "</td>");
        out.println("<td>" + lang + "</td>");
        out.println("<td>" + msg  + "</td>");
        out.println("</tr>");
      }
      out.println("</table>");

      stmt.close();
      con.close(); 
    } catch (Exception e) {
      e.printStackTrace();
    }

    out.println("</body>");
    out.println("</html>");
  }
}



servlet 必須
servlet.http 必須
java.sql 必須


servlet 派生クラス

service メソッドは
必ず呼ばれる






Html 文を出力







*1 ドライバクラスのロード


*2 データベースに接続

*3 SQL ステートメント
  オブジェクトの生成
*4 SQL 文の実行と結果取得
Html 文出力

*5 検索された行数分ループ
  int 型の項目 NOを取得
  文字型の項目 言語と
      メッセージを取得
  標準出力(表示)
   Html のtable と
   入力データを組合わせて
   出力



*6 クローズ
  SQL stmt をクローズ
  データベースから切断
*7 Exception エラー
 標準エラーストリーム
 に出力

Html 文出力



実行結果
ブラウザで実行 : http://127.0.0.1/examples/servlet/HelloWorldServletMysqlJDBC

Hello World Mysql

1日本語こんにちわ 世界
2英語Hello World

 ※MySQL テーブル 定義の内容 ==> hello_world_table


 上記プログラムの朱記部分の命令は servlet 特有の規則で、すでに「サーブレットの構造」で説明済みです。尚、MySQL はフリーのリレーショナルデータベースです。そのインストールやDBの作成等の詳細は、ホームの「DB」を参照してください。また、MySQL JDBC ドライバも入手しないと、実行できません。

   MySQL ダウンロード    MySQL JDBC ダウンロード


  *1 〜 *7 は前章の説明と同じですので、ここでは省略します。


(2) Java Aplication とJava servlet での環境の違い


 (2)-1 Java Aplication

任意のフォルダで java Aplication としてソースを作成し、コンパイル後そのまま
実行できます。

・コンパイルは、javac.exe で、実行は java.exe です。

 path 定義で、javac.exe , java.exe はどのフォルダでも実行できます。
  Path=C:\jdk1.3.1_06\bin;c:\mysql\bin;....

・実行時に、指定したDBCドライバ クラスを参照します。

 classpath 定義により、
  C:\java_test> set classpath=%classpath%;C:\...\mysql-connector-java-2.0.14
  とすると、mysql-connector-java-2.0.14 直下に「org.gjt.mm.mysql.Driver」が
  存在するので正しく動作します。

※JDBC ドライバ クラスにパスが通っていないと実行時に次のエラーになります。

   「java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver」

※java.exe の classpath パスオプションで指定しても構いません。



 (2)-2 Java servlet

任意のフォルダで java Servlet としてソースを作成し、コンパイル後に
ブラウザ側で起動します。

サーブレットはサーバー側で実行されますので、Java Aplication が検索する 
classpath とはなにも関係ありません。

・コンパイルは、javac.exe で、実行は ブラウザで行います。

・path 定義で、javac.exe  はどのフォルダでも実行できます。

・作成したサーブレットのクラスは、サーブレット実行可能フォルダーに移動する
 必要があります。
          ( ...\WEB-INF\classes\HelloWorldServletMySQLJDBC.class )

・JDBC ドライバ クラスを含む、jar ファイルをサーブレット実行可能フォルダー
 に移動する必要があります。
          ( ...\WEB-INF\lib\mysql-connector-java-2.0.14-bin.jar )

 このjar ファイルがないと、エラーログファイルに次のメッセージが出力されま
  す。

 「java.lang.ClassNotFoundException: org.gjt.mm.mysql.Driver」

Windows の環境設定は、コントロールパネル、システム、詳細、環境変数で設定し再起動するか、上記のように一時的に コマンドプロンプトの set コマンド( path=... , classpath=...)でも設定できます。

 実行可能フォルダーは、次のフォルダ構造を参照してください。詳細は Servlet 編で説明済みですので省略します。尚、JDBC ドライバ クラスを含む、jar ファイルは、%JAVAHOME%jre\ext\mysql-connector-java-2.0.14-bin.jar としても探してくれますが、好ましくないとされています。



 (2)-3 JDBC 環境のフォルダ 構造

 今までの説明をフォルダ 構造で整理してみました。尚、JDBC は MySQL を例にしています。

webapps (ルート)  ・・・  "C:\Program Files\Apache Group\Tomcat 4.1\webapps\"
 │
 ├─ examples
 │      ├─ jsp     ─── HelloWorldJspMySQLJDBC.jsp
 │      ├─ servlet ─┬─ HelloWorldServletMySQLJDBC.java
 │      │             ├─ 
 │      │             └─ 
 │      │      
 │      └─ WEB-INF ─┬─ web.xml
 │                     ├─ classes ─ HelloWorldServletMySQLJDBC.class
 │                     ├─ lib     ─ mysql-connector-java-2.0.14-bin.jar
                                      (MySQL JDBCのインストール先からコピー)

java_test  ・・・  "C:\java_test\"
 │
 ├─ HelloWorldMySQLJDBC.java
 ├─ HelloWorldMySQLJDBC.class

tool  ・・・  "C:\toolt\"   (MySQL JDBCのインストール)
 │
 ├─ mysql ─┬─ META-INF ─── MANIFEST.MF
 │           ├─ mysql-connector-java-2.0.14.zip (ダウンロード)
 │           └─ mysql-connector-java-2.0.14
 │                     ├─ mysql-connector-java-2.0.14-bin.jar
 │                     ├─ com ─
 │                     ├─ lib ─
 │                     └─ org ─git─mm─mysql─┬─ Driver.class
 │                                                ├─ Driver.java


mysql  ・・・  "C:\mysql\"   (MySQL のインストール)
 │
 ├─ bin  ─── mysql.exe 
 ├─ data ─┬─ hellodb ─┬─ hello_world_table.frm
 │          │             ├─ hello_world_table.MYD
 │          │             └─ hello_world_table.MYI
 │          ├─ mysql   ─┬─ db.frm




前の章(2.JDBC API)    次の章(4.JDBC API Applet )