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>");
}
}