JRun データベースには、Java database connectivity API (JDBC) を使用してアクセスします。JDBC は、Sun のドライバ マネージャと、JDBC ドライバ (JDBC-ODBC ブリッジは Sun により提供、ほかの JDBC ドライバはサードパーティ ベンダにより提供) を使用します。JDBC によるデータベース アクセスに慣れていない場合は、ご使用の JDBC ドライバのマニュアル、または JDBC に関する解説書をお読みください。
JDBC を使用してデータベースにアクセスするには、ユーザ アプリケーションに次のものが必要です。
Class.forName
メソッドを使用してデータベース ドライバのインスタンスを生成します。
DriverManager.getConnection
メソッドを使用して、Connection
オブジェクトを確立します。jdbc
)、ドライバ サブプロトコル (例 : odbc
、sequelink
)、およびデータベースを識別するドライバ依存のデータが含まれています。データベースの URL のフォーマットおよび内容については、ご使用のデータベース ドライバのマニュアルを参照してください。Statement
オブジェクト内のメソッドを使用して SQL ステートメントを実行します。ResultSet
オブジェクトを使用してデータベースから取得したデータを保存したり、そのデータにアクセスします。ここでは、次の手段でデータベースにアクセスする方法について説明します。
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-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 内の 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>"); } }