データベースへのアクセス

JRun データベースには、Java database connectivity API (JDBC) を使用してアクセスします。JDBC は、Sun のドライバ マネージャと、JDBC ドライバ (JDBC-ODBC ブリッジは Sun により提供、ほかの JDBC ドライバはサードパーティ ベンダにより提供) を使用します。JDBC によるデータベース アクセスに慣れていない場合は、ご使用の JDBC ドライバのマニュアル、または JDBC に関する解説書をお読みください。

JDBC を使用してデータベースにアクセスするには、ユーザ アプリケーションに次のものが必要です。

ここでは、次の手段でデータベースにアクセスする方法について説明します。

JDBC-ODBC ブリッジの使用

JDBC-ODBC ブリッジは、既存の ODBC ドライバをインターフェイスでつなぎ、データベース アクセスを提供する JDBC ドライバです。 Type 1 JDBC ドライバとも呼ばれます。JDK は JDBC-ODBC ブリッジを含んでいるため、データベース アクセスの概念の学習に適しています。しかし、実際の製品開発にはネイティブの JDBC ドライバを使用した方が効率的です。

次の例では、JDBC-ODBC ブリッジを使用して cfsnippets データソースにアクセスします。

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

public class DbTest extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws IOException, ServletException  { 
  // まず、セットアップを行います。
  // JDBC ドライバ
  String dbDriverName = "sun.jdbc.odbc.JdbcOdbcDriver";
  // 接続 URL
  String dbConnectionURL = "jdbc:odbc:cfsnippets";
  // 接続オブジェクト
  Connection dbConnection = null;
  // ステートメント オブジェクト
   Statement dbStatement = null;
  // 実行する SQL ステートメント
  String sqlStatement = "Select * from Courses";
  // 結果セット オブジェクト
  ResultSet dbResultSet = null;

  // サーブレット出力を開始します。
  PrintWriter out = resp.getWriter();
  resp.setContentType("text/html");
  out.println("<html><head><title>DB Test</title></head><body>");
  out.println("<h1>Database Test</h1>");

  // db アクセス コードを開始します。
  try {
    // JDBC ドライバ インスタンスを作成します。
    Class.forName(dbDriverName).newInstance();

    // db 接続を作成します。
    dbConnection = DriverManager.getConnection(dbConnectionURL);

    // ステートメント オブジェクトを作成します。
    dbStatement = dbConnection.createStatement();

    // クエリを実行します。
    dbResultSet = dbStatement.executeQuery(sqlStatement);

    // 列ヘッダを表示します。
    ResultSetMetaData rsMetaData = dbResultSet.getMetaData()
    int colCount = rsMetaData.getColumnCount();
    // 結果をテーブルに表示します。
    // テーブルを開始します。
    out.println("<table>");

    // 新しい行を開始します。
    String thisLine = "";
    for (int i = 0; i < colCount; i++) {
      thisLine += "<th>";
      // 1 を基準とした列ヘッダ
      thisLine += rsMetaData.getColumnLabel(i + 1);
      thisLine += "</th>";
    }
    // ヘッダを表示します。
    out.println("<tr>" + thisLine + "</tr>");

    // 結果セットを表示します。
    int rows = 0;

    // 結果セットをステップスルーします。
    while (dbResultSet.next()) {
      rows++;

      // 行の内容を表示します。
      thisLine = "";
      for (int i = 0; i < colCount; i++) {
        // 1 を基準とした列のインデックス
        thisLine += "<td>";
        thisLine += dbResultSet.getString(i +1);
        thisLine += "</td>";
      } // for を終了します。
      out.println("<tr>" + thisLine + "</tr>");
    } // while を終了します。
      // テーブルを終了します。
      out.println("</table>");
  } // try を終了します。
  catch (Exception e){
    out.println("<p>Exception in main try block");
    e.printStackTrace();
  }

  // すべてにこの処理を実行します。
  finally {
    // クリーンアップ
    try {
      if (dbResultSet != null) {
        dbResultSet.close();
      }
      if (dbStatement != null) {
        dbStatement.close();
      }
      if (dbConnection != null) {
        dbConnection.close();
      }
    }
    catch (SQLException sqlex) {
      out.println("<p>SQL exception in finally block");
      sqlex.printStackTrace();
    }
  } // finally を終了します。

  // サーブレット出力を終了します。
  out.println("</body></html>");
} 
}

JDBC ドライバの使用

JDBC-ODBC ブリッジは ODBC ドライバを通じてデータベースにアクセスします。また、ネイティブの JDBC ドライバを使用することもできます。次の一覧は種々のタイプの JDBC ドライバを示しています。

JDBC ドライバを使用しているときに作成するコードは、JDBC-ODBC ブリッジで使用するコードと似ています。唯一の違いは、次のスニペットに示されているようにドライバ クラスとデータベース URL です。

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

public class DbTest extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws IOException,
  ServletException { 
  // JDBC ドライバ
  String dbDriverName = "intersolv.jdbc.sequelink.SequeLinkDriver";
  // 接続 URL
  String dbConnectionURL = "jdbc:sequelink://DBSRV:8300/
[SQL SERVER];Database=cfsnippets";
  // 残りのコードは、JDBC-ODBC ブリッジの例と同じです。
  // 接続オブジェクト
  Connection dbConnection = null;
  // ステートメント オブジェクト
  Statement dbStatement = null;
  // 実行する SQL ステートメント
  String sqlStatement = "Select * from Courses";
  // 結果セット オブジェクト
  ResultSet dbResultSet = null;
  ...
  // db アクセス コードを開始します。
  try {
    // JDBC ドライバ インスタンスを作成します。
    Class.forName(dbDriverName).newInstance();

    // db 接続を作成します。
    dbConnection = DriverManager.getConnection(dbConnectionURL);

    // ステートメント オブジェクトを作成します。
    dbStatement = dbConnection.createStatement();

    // クエリを実行します。
    dbResultSet = dbStatement.executeQuery(sqlStatement);
  ...

JRun データ ソース サービスの使用

JRun データ ソース サービスを使用すると、JRun 内の JDBC データソースを定義できます。コードでは、JDBC ドライバ情報をハードコード化する代わりに、データソース名を使用してデータベースを参照します。したがって、JRun でサーブレットを再コンパイルせずにデータ ソース情報を変更できます。JRun データソースでは、オプションの接続プールに加えて、サーブレットの移植性を強化します。これは、JRun でお勧めするデータベースへのアクセス方法です。

JRun でデータ ソースを定義する方法については、『JRun セットアップ ガイド』を参照してください。

次のコード例では、JRun データ ソース サービスを使用して JDBC データ ソース情報にアクセスします。

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

public class DbTest extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse resp)
  throws IOException, ServletException { 
  // JRun データ ソース サービスで定義された名前
  String dsName = "cfsnippetsJRun";

  // 接続オブジェクト
  Connection dbConnection = null;
  // ステートメント オブジェクト
  Statement dbStatement = null;
  // 実行する SQL ステートメント
  String sqlStatement = "Select * from Courses";
  // 結果セット オブジェクト
  ResultSet dbResultSet = null;  

  // サーブレット出力を開始します。
  PrintWriter out = resp.getWriter();
  resp.setContentType("text/html");
  out.println("<html><head><title>Database Test</title>");
  out.println("</head><body>");
  out.println("<h1>Database Test</h1>");

  // db アクセス コードを開始します。
  try {
    // JNDI InitialContext オブジェクトを定義します。
    InitialContext ctx = new InitialContext();
    // InitialContext でデータ ソースを検索します。
    DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/" + 
dsName);
    dbConnection = ds.getConnection();

    // ステートメント オブジェクトを作成します。
    dbStatement = dbConnection.createStatement();

    // クエリを実行します。
    dbResultSet = dbStatement.executeQuery(sqlStatement);

    // 列ヘッダを表示します。
    ResultSetMetaData rsMetaData = dbResultSet.getMetaData()
    int colCount = rsMetaData.getColumnCount();
    // 結果をテーブルに表示します。
    // テーブルを開始します。
    out.println("<table>");

    // 新しい行を開始します。
    String thisLine = "";
    for (int i = 0; i < colCount; i++) {
      thisLine += "<th>";
      // 1 を基準とした列ヘッダ
      thisLine += rsMetaData.getColumnLabel(i + 1);
      thisLine += "</th>";
    }
    // ヘッダを表示します。
    out.println("<tr>" + thisLine + "</tr>");

    // 結果セットを表示します。
    int rows = 0;

    // 結果セットをステップスルーします。
    while (dbResultSet.next()) {
      rows++;

      // 行の内容を表示します。
      thisLine = "";
      for (int i = 0; i < colCount; i++) {
        // 1 を基準とした列のインデックス
        thisLine += "<td>";
        thisLine += dbResultSet.getString(i +1);
        thisLine += "</td>";
        out.println("<tr>" + thisLine + "</tr>");
      }
      // テーブルを終了します。
      out.println("</table>");
    }
  }
  catch (Exception e){
    out.println("<p>Exception in main try block");
    e.printStackTrace();
  }
  // すべてにこの処理を実行します。
  finally {
    // クリーン アップ
    try {
      if (dbResultSet != null) {
        dbResultSet.close();
      }
      if (dbStatement != null) {
        dbStatement.close();
      }
      if (dbConnection != null) {
        dbConnection.close();
      }
    }
    catch (SQLException sqlex) {
      out.println("<p>SQL exception in finally block");
      sqlex.printStackTrace();
    }
  }

  // サーブレット出力を終了します。
  out.println("</body></html>");
} 
}