Oracle9iAS Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス
リリース9.0.3

部品番号 J06903-01
       

データ・アクセスJavaBeansとデータ・アクセス・タグ

このトピックでは、OC4Jが提供する、サーブレットおよびJSPページからデータベースへのアクセスに使用するJavaBeansとタグについて説明します。

このトピックの構成は、次のとおりです。

データ・アクセスに関するJavaBeans

OC4J製品には、データベースへのアクセスに使用できる一連のJavaBeansが含まれています。この項は、次の内容で構成され、Beanについて説明します。


注意: 

ここで説明するJavaBeansは、「データ・アクセス用SQLタグ」で説明されているタグで使用します。一般的に、これらのBeanとタグは、適切なJDBCドライバ・クラスがあることを前提として、Oracle以外のデータベースで使用できます。ただし、後述されている機能の多くは、注意にあるようにOracle固有の機能です。


データ・アクセスJavaBeansの概要

OC4Jには、データベースにアクセスするための一連のカスタムJavaBeansが用意されています。oracle.jsp.dbutilパッケージには、次のBeanが含まれています。

この項の説明は、Oracle JDBCの操作知識があることを前提にしています。必要に応じて、『Oracle9i JDBC開発者ガイドおよびリファレンス』を参照してください。

データ・アクセスJavaBeansを使用するには、ojsputil.jarファイルがインストール済で、クラスパスに存在していることを確認してください。このファイルは、OC4Jのインストール時にインストールされます。XML関連のメソッドおよび機能については、Oracle9iASで提供されるxsu12.jar(JDK 1.2.x)またはxsu111.jar(JDK 1.1.x)のファイルも必要です。

また、OracleデータベースおよびJDK 1.2以上の場合は、classes12.zipなどの適切なJDBCドライバ・クラスがインストールされ、クラスパスに存在している必要があります。

データ・ソースと接続プーリングを用いたデータ

データ・アクセスJavaBeansは、データ・アクセス・タグ・ライブラリと同様に、接続プロパティを指定するためのデータ・ソースの使用をサポートしています。接続プーリングのサポート手段も実装されます。この機能によって、Oracle接続オブジェクトおよびOC4J接続オブジェクトの両方がサポートされます。

JSPページでデータ・ソースを使用するには、データ・ソース、そのJNDI名およびその接続プロパティとプーリング・プロパティを定義する必要があります。OC4Jでは、data-sources.xmlファイルの<data-source>要素でこれらを定義します。次に例を示します。


<data-source
   class="oracle.jdbc.pool.OracleDataSource"
   name="jdbc/ejbpool/OracleDS"
   location="jdbc/ConnectionDS"
   ejb-location="jdbc/ejbpool/OracleDS"
   url="jdbc:oracle:thin:@myhost:1521:orcl"
   username="scott"
   password="tiger"
   min-connections="3"
   max-connections="50"
   wait-timeout="10"
   inactivity-timeout="30" />

データ・ソースの詳細は、『Oracle9iAS Containers for J2EEサービス・ガイド』を参照してください。

データ・アクセスJavaBeanの説明

この項では、データ・アクセスJavaBeans(ConnBeanConnCacheBeanDBBeanおよびCursorBean)の属性とメソッドについて、データ・ソースを使用する例を含めて説明します。

データベース接続用ConnBean

oracle.jsp.dbutil.ConnBean単純なデータベース接続(プーリングやキャッシングを使用しない接続)を確立します。


注意: 

データ・ソースを必要としない問合せのみの場合は、それ自体に接続機能があるDBBeanを使用するほうが簡単です。


ConnBeanには、次のプロパティがあります。データ・ソースを使用する場合、userpasswordおよびURLの各プロパティは不要です。


注意: 

文のキャッシング、バッチ更新および行のプリフェッチの詳細は、『Oracle9i JDBC開発者ガイドおよびリファレンス』を参照してください。


ConnBeanには、次のようなプロパティのsetterメソッドとgetterメソッドが用意されています。

次のメソッドを使用して、接続のオープンとクローズ、または接続の状態を確認します。

カーソルをオープンし、CursorBeanオブジェクトを戻すには、次のメソッドを使用します。

または

CursorBean機能の詳細は、「DMLとストアド・プロシージャ用CursorBean」を参照してください。

接続キャッシング用ConnCacheBean

データベース接続には、oracle.jsp.dbutil.ConnCacheBeanを使用して、Oracle JDBCの接続キャッシング機能を使用し、JDBC 2.0の接続プーリングを使用します。接続キャッシングの詳細は、『Oracle9i JDBC開発者ガイドおよびリファレンス』を参照してください。


注意: 

  • データ・ソースや単純な接続オブジェクトを使用するには、かわりにConnBeanを使用します。

  • ConnCacheBeanは、OracleConnectionCacheImplを拡張します。これは、OracleDataSourceを拡張します(両方ともOracle JDBCパッケージoracle.jdbc.poolにあります)。


ConnCacheBeanには、次のプロパティがあります。

ConnCacheBeanクラスは、プロパティを取得および設定する次のメソッドも含め、Oracle JDBCのOracleConnectionCacheImplクラスに定義されているメソッドをサポートします。

ConnCacheBeanクラスは、oracle.jdbc.pool.OracleDataSourceクラスから、プロパティおよび関連するgetterメソッドとsetterメソッドも継承します。これによって、databaseNamedataSourceNamedescriptionnetworkProtocolportNumberserverNameおよびdriverTypeの各プロパティのgetterメソッドとsetterメソッドが提供されます。これらのプロパティおよびそのgetterメソッドとsetterメソッドの詳細は、『Oracle9i JDBC開発者ガイドおよびリファレンス』を参照してください。


注意: 

JSPページで使用するJavaBeanと同様に、ConnCacheBeanプロパティは、setterメソッドを直接使用しないで、jsp:setProperty操作で設定できます。


次のメソッドを使用して、接続をオープンおよびクローズします。

ConnCacheBeanクラスは、Oracle JDBCのバッチ更新および行のプリフェッチを直接サポートしていませんが、getConnection()メソッドで取得するConnectionオブジェクトのsetDefaultExecuteBatch(int)メソッドおよびsetDefaultRowPrefetch(int)メソッドをコールすることで、これらの機能を有効にできます。Connectionオブジェクトから作成したJDBCの文オブジェクトのsetExecuteBatch(int)メソッドおよびsetRowPrefetch(int)メソッドを使用することもできます。(バッチ更新は、プリコンパイルされたSQL文でのみサポートされます。)これらの機能の詳細は、『Oracle9i JDBC開発者ガイドおよびリファレンス』を参照してください。


注意: 

  • ConnCacheBeanには、OracleConnectionCacheImplクラスと同じ機能があります。詳細は、『Oracle9i JDBC開発者ガイドおよびリファレンス』を参照してください。

  • ConnBeanとは異なり、ConnCacheBeanを使用する場合は、標準のConnectionオブジェクトの機能を使用して、文オブジェクトを作成および実行します。


問合せ専用DBBean

問合せのみを実行するには、oracle.jsp.dbutil.DBBeanを使用します。


注意: 

  • DBBean自体にも接続機能がありますが、データ・ソースはサポートしません。データ・ソースが必要な場合は、ConnBeanを使用します。

  • その他のDML操作(UPDATEINSERTDELETEまたはストアド・プロシージャ・コール)については、CursorBeanを使用します。


DBBeanには、次のプロパティがあります。

DBBeanには、次のようなプロパティのsetterメソッドとgetterメソッドが用意されています。

次のメソッドを使用して、接続をオープンおよびクローズします。

次のいずれかのメソッドを使用して、問合せを実行します。

DMLとストアド・プロシージャ用CursorBean

単純な接続でのSELECTUPDATEINSERTまたはDELETEの各操作またはストアド・プロシージャ・コールには、oracle.jsp.dbutil.CursorBeanを使用します。接続には、事前定義のConnBeanオブジェクトが使用されます。

SQL操作は、ConnBeanオブジェクトのgetCursorBean()コールに指定するか、または後述のようにCursorBeanオブジェクトのcreate()execute()またはexecuteQuery()メソッドのいずれかをコールすることによって指定できます。

CursorBeanは、スクロール可能で更新可能なカーソル、バッチ更新、行のプリフェッチおよび問合せタイムアウト制限をサポートしています。Oracle JDBCのこれらの機能の詳細は、『Oracle9i JDBC開発者ガイドおよびリファレンス』を参照してください。


注意: 

接続キャッシングを使用するには、ConnCacheBeanと標準のConnectionオブジェクトの機能を使用します。CursorBeanは使用しないでください。


CursorBeanには、次のプロパティがあります。

必要に応じて、これらのプロパティを次のメソッドで設定し、Oracle JDBCの機能を有効にできます。

CursorBeanインスタンスをjsp:useBean文で定義した後に問合せを実行するには、CursorBeanメソッドを使用し、次の2つのいずれかの方法でカーソルを作成できます。カーソルを作成し、個別のステップで接続を指定するには、次のメソッドを使用します。

または、次のメソッドを使用してプロセスを単一のステップに組み込むこともできます。

ConnBeanオブジェクトの設定は、「データベース接続用ConnBean」を参照してください。

次に、次のメソッドを使用して、問合せを指定および実行します。これには、JDBCの単純なStatementオブジェクトが背後で使用されます。

結果セットをHTML表またはXML文字列としてフォーマットする場合は、executeQuery()のかわりに、次のいずれかのメソッドを使用します。

CursorBeanインスタンスをjsp:useBean操作で定義した後にUPDATE文、INSERT文またはDELETE文を実行するには、CursorBeanのメソッドを使用し、次の2つのいずれかの方法でカーソルを作成できます。次のメソッドを使用して、カーソルを作成(文のタイプを整数で、SQL文を文字列で指定)し、接続を指定します。

または、次のメソッドを使用してプロセスを単一のステップに組み込むこともできます。

ConnBeanオブジェクトの設定は、「データベース接続用ConnBean」を参照してください。

int型の入力は、次の定数のいずれかを取得して、JDBCの文のタイプを指定します。定数は、StatementオブジェクトにはCursorBean.PLAIN_STMTPreparedStatementオブジェクトにはCursorBean.PREP_STMTCallableStatementオブジェクトにはCursorBean.CALL_STMTです。Stringへの入力は、SQL文を指定します。

続いて、次のメソッドを使用して、INSERT文、UPDATE文またはDELETE文を実行します。(boolean戻り値は無視しても構いません。)

また、バッチ更新の場合は、次のメソッドを使用して影響を受けた行数を戻します。


注意: 

SQL操作は、文の作成時または実行時のいずれか(両方ではなく)に指定してください。execute()メソッドおよびexecuteUpdate()メソッドには、SQL操作を指定するための文字列を必要に応じて指定できます。この指定は、ConnBeangetCursorBean()メソッドおよびcreate()メソッドについても同様です。


さらに、CursorBeanは、コール可能文に対するregisterOutParameter()、プリコンパイルされたSQL文とコール可能文に対するsetXXX()、および結果セットとコール可能文に対するgetXXX()など、Oracle JDBCの機能をサポートします。

次のメソッドを使用して、データベース・カーソルをクローズします。

例: データ・ソースを利用したConnBeanとCursorBeanの使用

次のサンプルは、ConnBeanとデータ・ソースを使用して接続をオープンし、CursorBeanを使用して問合せを実行するJSPページを示しています。


<%@ page import="java.sql.*, oracle.jsp.dbutil.*" %>
<jsp:useBean id="cbean" class="oracle.jsp.dbutil.ConnBean" scope="session">
   <jsp:setProperty name="cbean" property="dataSource"
                    value="<%=request.getParameter("datasource")%>"/>
</jsp:useBean>
<% try {
      cbean.connect();
      String sql="SELECT ename, sal FROM scott.emp ORDER BY ename";
      CursorBean cb = cbean.getCursorBean (CursorBean.PREP_STMT, sql);
      out.println(cb.getResultAsHTMLTable());
      cb.close();
      cbean.close();
    } catch (SQLException e) {
      out.println("<P>" + "There was an error doing the query:");
      out.println("<PRE>" + e + "</PRE>\n<P>"); }
%>

データ・アクセス用SQLタグ

OC4Jには、データベースにアクセスするSQLコマンドを実行するために、JSPページで使用できる一連のタグがあります。この項は、次の内容で構成され、タグについて説明します。


注意: 

この項で説明するタグは、「データ・アクセスに関するJavaBeans」で説明されているBeanを使用します。一般的に、これらのBeanとタグは、適切なJDBCドライバ・クラスがあることを前提として、Oracle以外のデータベースで使用できます。ただし、後述されている機能の多くは、注意にあるようにOracle固有の機能です。



注意: 

JavaServer Pages標準タグ・ライブラリ(JSTL)と、すでにOC4Jが提供しているSQLカスタム・タグ・ライブラリには、重複する機能が含まれています。標準準拠で作業を進める場合は、原則として、カスタム・ライブラリではなく、JSTLの使用をお薦めします。「JavaServer Pages標準タグ・ライブラリのサポート」を参照してください。

ただし、既存のタグもサポート対象です。JSTLで使用できないカスタム・ライブラリの機能のうち、有効と判断される機能は、必要に応じて、将来JSTL標準に採用される予定です。


データ・アクセス・タグの概要

OC4Jには、SQL機能に関するカスタム・タグ・ライブラリが用意されています。次のタグで構成されます。

これらのタグについては、次の各項で説明します。例は、OC4Jのデモを参照してください。

SQLタグを使用する場合は、次の要件に注意してください。

JSPタグ・ライブラリの使用、タグ・ライブラリ・ディスクリプタ・ファイル、taglibディレクティブおよび予約済のタグ・ライブラリ・ディレクトリに関する一般情報は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。


注意: 

データ・アクセス・タグを使用するアプリケーションでは、dbSetParamタグを使用して、SQL文のテキストの全文ではなくパラメータ値のみを指定することを考慮してください。これによって、ユーザーが必要な値以外の追加のSQLを入力するSQLポイゾニングの可能性を回避できます。


データ・アクセス・タグの説明

この項では、データ・アクセス・タグの詳細な構文について説明し、データ・ソースでのdbOpenタグとdbQueryタグの使用例を紹介します。

これらのタグを使用した完全なサンプル・ページは、OC4Jのデモを参照してください。


注意: 

  • このタグ構文では、接頭辞「sql:」が使用されます。これは、表記規則に従っていますが、必須ではありません。任意の接頭辞をtaglibディレクティブに指定できます。

  • このヘルプのタグ構文規則の詳細は、「タグ構文の表記と意味」を参照してください。


SQL dbOpenタグ

dbOpenタグを使用し、dbQuerydbExecuteなどのタグを使用した後続のSQL操作のために、データベース接続をオープンします。オープンするには、データ・ソースの場所を指定(この場合、接続キャッシュがサポートされます)するか、ユーザー、パスワードおよびURLを個別に指定します。OC4Jでデータ・ソースを設定する方法の詳細は、「データ・ソースと接続プーリングを用いたデータ・アクセスのサポート」を参照してください。

実装には、oracle.jsp.dbutil.ConnBeanインスタンスを使用します。単純な接続で、接続のキャッシュを使用しない場合は、必要に応じて、stmtCacheSizepreFetchおよびbatchSizeなどのConnBeanのプロパティを設定し、Oracle JDBCの機能を有効にできます。詳細は、「データベース接続用ConnBean」を参照してください。

接続するためのConnBeanオブジェクトは、dbOpenタグのタグ補足情報クラスのインスタンスに作成されます。標準のJSPタグ・ライブラリのフレームワークとタグ補足情報クラスの詳細は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。

構文


<sql:dbOpen
   [ connId = "connection_id" ]
   [ scope = "page" | "request" | "scope" | "application" ]
   [ dataSource = "JNDI_name" ]
   [ user = "username"
     password = "password"
     URL = "databaseURL" ]
   [ commitOnClose = "true" | "false" ] >

   ...

</sql:dbOpen>

この接続を使用して実行するネストされたコードは、dbOpenの開始タグと終了タグ間のタグ・ボディに挿入できます。


注意: 

dataSource属性を設定するか、またはuserpasswordおよびURLの各属性を設定する必要があります。必要に応じて、データ・ソースを使用してURLを指定し、次にdbOpenタグのuser属性とpassword属性を個別に使用できます。

データ・ソースを接続のキャッシュに使用すると、最初のキャッシュの使用で、データ・ソースが初期化されます。dbOpenタグのuser属性とpassword属性を使用してユーザーとパスワードを指定すると、そのユーザーとパスワードに関するキャッシュが初期化されます。後続のキャッシュは、同じユーザーとパスワードに対して使用されます。


属性


注意: 

以前のリリースでは、この動作は、接続のクローズ時に、常に自動的にコミットされます。commitOnClose属性には、移行を簡素化するための下位互換性があります。


SQL dbCloseタグ

dbCloseタグを使用して、dbOpenタグに指定したオプションのconnIdパラメータに関連付けられている接続をクローズします。dbOpenタグでconnIdが使用されていない場合、接続は、dbOpen終了タグに達したときに自動的にクローズされます。この場合、dbCloseタグは不要です。

構文


<sql:dbClose connId = "connection_id"
           [ scope = "page" | "request" | "scope" | "application" ] />

属性

SQL dbQueryタグ

dbQueryタグを使用して問合せを実行し、JDBC 結果セット、HTML表、XML文字列またはXML DOMオブジェクトのいずれかで、結果を出力します。dbQuery開始タグと終了タグの間のタグ・ボディに、SELECT文(1文のみ)を指定します。

このタグは、カーソルにoracle.jsp.dbutil.CursorBeanオブジェクトを使用するため、必要に応じて、結果セットのタイプ、結果セットの並行性、バッチ・サイズおよびプリフェッチ・サイズなどのプロパティを設定できます。CursorBean機能の詳細は、「DMLとストアド・プロシージャ用CursorBean」を参照してください。

XMLで使用する場合、このタグはXMLプロデューサとして動作します。詳細は、「XMLプロデューサとXMLコンシューマ」を参照してください。「transformタグとdbQueryタグの使用例」も参照してください。

構文


<sql:dbQuery
           [ queryId = "query_id" ]
           [ connId = "connection_id" ]
           [ scope = "page" | "request" | "scope" | "application" ]
           [ output = "HTML" | "XML" | "JDBC" ]
           [ maxRows = "number" ]
           [ skipRows = "number" ]
           [ bindParams = "value" ]
           [ toXMLObjName = "objectname" ] >

    ...SELECT statement (one only)...

 </sql:dbQuery>


重要: 

  • Oracle9iASリリース2では、SELECT文をセミコロンで終了しないでください。構文エラーになります。

  • Oracle9iASリリース2では、dbQueryタグは、現在LOB列をサポートしていません。


属性

SQL dbCloseQueryタグ

dbCloseQueryタグを使用して、dbQueryタグに指定したオプションのqueryIdパラメータに関連付けられているカーソルをクローズします。dbQueryタグでqueryIdが使用されていない場合、カーソルは、dbQuery終了タグに達したときに自動的にクローズされます。この場合、dbCloseQueryタグは不要です。

構文


<sql:dbCloseQuery queryId = "query_id" />

属性

SQL dbNextRowタグ

dbNextRowタグを使用して、dbQueryタグで取得し、指定したqueryIdに関連付けられている結果セットの各行を処理します。dbNextRow開始タグと終了タグの間のタグ・ボディに、処理コードを指定します。このボディは、結果セットの各行に対して実行されます。

dbNextRowタグを使用するには、dbQueryタグで、outputを「JDBC」に設定し、queryIdを、参照するdbNextRowタグに指定する必要があります。

結果セット・オブジェクトは、dbQueryタグのタグ補足情報クラスのインスタンスに作成されます。標準のJSPタグ・ライブラリのフレームワークとタグ補足情報クラスの詳細は、『Oracle9iAS Containers for J2EE JavaServer Pages開発者ガイド』を参照してください。

構文


<sql:dbNextRow queryId = "query_id" >
...Row processing...
</sql:dbNextRow >

属性

次の例では、dbOpenタグ、dbQueryタグおよびdbNextRowタグを組み合せて使用しています。


<sql:dbOpen connId="con1" URL="jdbc:oracle:thin:@myhost:1521:816"
            user="scott" password="tiger">
</sql:dbOpen>
<sql:dbQuery connId="con1" output="jdbc" queryId="myquery">
             select * from EMP
</sql:dbQuery>
<sql:dbNextRow queryId="myquery">
             <%= myquery.getString(1) %>
</sql:dbNextRow>
<sql:dbCloseQuery queryId="myquery" />
<sql:dbClose connId="con1" />

SQL dbExecuteタグ

dbExecuteタグを使用して、単一のDML文またはDDL文を実行します。dbExecute開始タグと終了タグの間のタグ・ボディに、文を指定します。

このタグでは、カーソルにoracle.jsp.dbutil.CursorBeanオブジェクトが使用されます。CursorBean機能の詳細は、「DMLとストアド・プロシージャ用CursorBean」を参照してください。

構文


<sql:dbExecute
           [ connId = "connection_id" ]
           [ scope = "page" | "request" | "scope" | "application" ]
           [ output = "yes" | "no" ]
           [ bindParams = "value" ] >

   ...DML or DDL statement (one only)...

</sql:dbExecute >


重要: 

  • Oracle9iASリリース2では、DML文またはDDL文をセミコロンで終了しないでください。構文エラーになります。

  • Oracle9iASリリース2では、dbExecuteタグは、現在LOB列をサポートしていません。


属性

SQL dbSetParamタグ

このタグを使用すると、問合せにバインド(dbQueryタグを使用)またはその他のSQL操作にバインド(dbExecuteタグを使用)するパラメータ値を設定できます。


注意: 

データ・アクセス・タグを使用するアプリケーションでは、dbSetParamタグを使用して、SQL文のテキストの全文ではなくパラメータ値のみを指定することを考慮してください。これによって、ユーザーが必要な値以外の追加のSQLを入力するSQLポイゾニングの可能性を回避できます。


構文


<sql:dbSetParam name = "param_name"
                value = "param_value"
              [ scope = "page" | "request" | "scope" | "application" ] />

属性

次の例では、dbSetParamタグを使用して、id2という名前のパラメータの値を設定します。この値は、dbExecuteタグでSQL文にバインドされます。


<sql:dbSetParam name="id2" value='<%=request.getParameter("id")%>'
                scope="session" />
Result:
   <HR>
   <sql:dbOpen URL="<%= connStr %>" user="scott" password="tiger">
        <sql:dbExecute output="yes" bindParams="id2 name job sal">
             insert into emp(empno, ename, deptno, job, sal)
                    values (?, ?, 20, ?, ?)
        </sql:dbExecute>
    </sql:dbOpen>
    <HR>

SQL dbSetCookieタグ

このタグを使用すると、Cookieを設定できます。dbSetCookieタグは、標準のjavax.servlet.http.Cookieクラスの機能をラップします。

構文


<sql:dbSetCookie name = "cookie_name"
               [ value = "cookie_value" ]
               [ domain = "domain_name" ]
               [ comment = "comment" ]
               [ maxAge = "age" ]
               [ version = "protocol_version" ]
               [ secure = "true" | "false" ]
               [ path = "path" ] />

属性


<sql:dbSetCookie name="cId" value='<%=request.getParameter("id")%>'
                 maxAge='800000' />

例: データ・ソースを利用したdbOpenとdbQueryの使用

次のサンプルは、データ・ソースでdbOpenタグを使用して接続をオープンしてから、dbQueryタグを使用して問合せを実行するJSPページを示しています。


<%@ taglib uri="/WEB-INF/sqltaglib.tld" prefix="sql" %>
<HTML>
<BODY>
   <sql:dbOpen dataSource='<%=request.getParameter("datasource") %>'
               connId="con1">
   </sql:dbOpen>
   <sql:dbQuery connId="con1">
      SELECT * FROM emp ORDER BY ename
   </sql:dbQuery>
   <sql:dbClose connId="con1" />
</BODY>
</HTML>