Oracle Application Server Containers for J2EE JSPタグ・ライブラリおよびユーティリティ・リファレンス
10g

部品番号: A97678-01
       

データ・アクセスJavaBeansおよびタグについて

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

この章の内容は、次のとおりです。

データ・アクセス用JavaBeans

OC4J製品には、データベースへのアクセスに使用できるように一連のJavaBeansが組み込まれています。この項では、Beanについて説明します。この項の内容は、次のとおりです。


注意:

ここで説明するJavaBeansは、「データ・アクセス用SQLタグ」で説明するタグで使用されます。通常、これらのBeanとタグは、適切なJDBCドライバ・クラスがあればOracle以外のデータベースで使用できます。ただし、後述する多数の機能はOracle固有のものです。


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

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

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

データ・アクセスJavaBeansを使用するには、ファイルojsputil.jarがインストール済でCLASSPATHに指定されていることを確認します。このファイルはOC4Jインストールとともに提供されます。XML関連のメソッドと機能には、ファイルxsu12.jar(JDK 1.2.xの場合)またはxsu111.jar(JDK 1.1.xの場合)も必要になりますが、どちらもOracle Application Serverとともに提供されます。

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

データソースおよびプールされた接続に対するデータ・アクセスのサポート

データ・アクセス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" />
 
    

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

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

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

データベース接続用のConnBean

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


注意:

問合せの場合のみ、データソースを必要としない場合は、独自の接続メカニズムを持つDBBeanを使用する方が簡単です。


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


注意:

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


ConnBeanは、前述したプロパティについて次のsetterメソッドとgetterメソッドを提供します。

次のメソッドを使用して、接続をオープンまたはクローズしたり、接続ステータスを検証します。

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

または

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

接続キャッシュ用のConnCacheBean

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


注意:

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

  • ConnCacheBeanによりOracleConnectionCacheImplが拡張され、それによりOracleDataSourceが拡張されます(どちらもOracle JDBCパッケージoracle.jdbc.poolにあります)。


ConnCacheBeanのプロパティは、次のとおりです。

ConnCacheBeanクラスは、Oracle JDBCのOracleConnectionCacheImplクラスに定義されているメソッドをサポートしています。これには、対応するプロパティの次のgetterメソッドとsetterメソッドが含まれます。

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


注意:

JSPページで使用するJavaBeanの場合と同様に、setterメソッドを直接使用するかわりに、すべてのConnCacheBeanプロパティをjsp:setPropertyアクションで設定できます。


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

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


注意:

  • ConnCacheBeanには、OracleConnectionCacheImplクラスと同じ機能があります。詳細は、Oracle 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機能の詳細は、Oracle JDBC開発者ガイドおよびリファレンスを参照してください。


注意:

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


CursorBeanのプロパティは、次のとおりです。

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

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

または、次のメソッドを使用して、プロセスを組み合せて1つのステップにします。

「データベース接続用のConnBean」の説明に従ってConnBeanオブジェクトを設定します。

それから、次のメソッドを使用して問合せを指定し、実行します。背後でJDBCのプレーンStatementオブジェクトを使用します。

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

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

または、次のメソッドを使用して、プロセスを組み合せて1つのステップにします。

「データベース接続用のConnBean」の説明に従ってConnBeanオブジェクトを設定します。

intの入力では、定数(Statementオブジェクトの場合はCursorBean.PLAIN_STMTPreparedStatementオブジェクトの場合はCursorBean.PREP_STMTCallableStatementオブジェクトの場合はCursorBean.CALL_STMT)を使用して、必要なJDBC文のタイプを指定します。Stringの入力ではSQL文を指定します。

それから、次のメソッドを使用してINSERTUPDATEまたはDELETE文を実行します(booleanの戻り値は無視してかまいません)。

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


注意:

SQL操作は、文の作成時または文の実行時のどちらかに指定します。execute()およびexecuteUpdate()メソッドでは、オプションでSQL操作を指定する文字列を使用できます。これは、create()メソッドの場合や、ConnBeangetCursorBean()メソッドの場合も同じです。


さらに、CursorBeanは、コール可能な文に対するregisterOutParameter()、プリコンパイルされた文とコール可能な文に対する 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には、JSPページで使用してデータベースにアクセスするためのSQLコマンドを実行できるように、一連のタグが用意されています。この項では、各タグについて説明します。この項の内容は、次のとおりです。


注意:

この項で説明する各タグでは、「データ・アクセス用JavaBeans」で説明するBeanを使用します。通常、これらのBeanとタグは、適切なJDBCドライバ・クラスがあればOracle以外のデータベースで使用できます。ただし、後述する多数の機能はOracle固有のものです。



注意:

OC4Jで提供されるカスタムSQLタグ・ライブラリはJavaServer Pages標準タグ・ライブラリ(JSTL)に先立つものであり、機能が重複する領域があります。規格準拠のため、今後は原則としてカスタム・ライブラリのかわりにJSTLを使用することをお薦めします。「JavaServer Pages標準タグ・ライブラリのサポート」を参照してください。

ただし、既存のタグがサポート対象外になったわけではありません。カスタム・ライブラリにあってJSTLでは使用できないが、一般的に役立つと思われる機能は、必要に応じて将来的にJSTL標準に採用されていく予定です。


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

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

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

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

JSPタグ・ライブラリの使用方法の概要(タグ・ライブラリ・ディスクリプタ・ファイル、taglibディレクティブおよび既知のタグ・ライブラリ・ディレクトリなど)は、Oracle Containers for J2EE Support for JavaServer Pages開発者ガイド 10gを参照してください。


注意:

データ・アクセス・タグを使用するアプリケーションの場合は、 dbSetParamタグを使用して、SQL文自体のテキスト補完ではなくパラメータ値のみを入力することを検討してください。これにより、SQLポイズニングと呼ばれる状況が回避されます。これは、ユーザーが予想される値のみでなく他のSQLも入力できる状況です。


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

この項では、データ・アクセス・タグの構文詳細と、データソースでのdbOpenタグとdbQueryタグの使用例を示します。

これらのタグを使用するサンプル・ページの全セットについては、OC4Jのデモを参照してください。


注意:

  • ここでは、タグの構文に接頭辞「sql:」を使用しています。これは規則によるものですが、必須ではありません。taglibディレクティブで必要な接頭辞を指定できます。

  • このマニュアルで使用しているタグ構文の表記規則の概要は、「タグ構文の記号と注意」を参照してください。


SQL dbOpenタグ

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

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

接続用のConnBeanオブジェクトは、dbOpenタグのtag-extra-infoクラスのインスタンスに作成されます。標準JSPタグ・ライブラリ・フレームワークとtag-extra-infoクラスの詳細は、Oracle Containers for J2EE Support for JavaServer Pages開発者ガイド 10gを参照してください。

構文

 <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オブジェクトとして出力できます。SELECT文(1つのみ)をdbQueryの開始タグと終了タグの間のタグ本体に挿入します。

このタグではカーソルに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>
 
    


重要:

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

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


属性

SQL dbCloseQueryタグ

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

構文

 <sql:dbCloseQuery queryId = "query_id" />
 
    
属性

SQL dbNextRowタグ

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

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

結果セット・オブジェクトは、dbQueryタグのtag-extra-infoクラスのインスタンスに作成されます。標準JSPタグ・ライブラリ・フレームワークとtag-extra-infoクラスの詳細は、Oracle Containers for J2EE Support for JavaServer Pages開発者ガイド 10gを参照してください。

構文

 <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文を1つ実行できます。文は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 > 
 
    


重要:

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

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


属性

SQL dbSetParamタグ

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


注意:

データ・アクセス・タグを使用するアプリケーションの場合は、 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>