Oracle Javaロードマップ: JDBC

概要

目次

このJava Database Connectivity(JDBC)ドキュメントでは、JDBC API、Oracle JDBCドライバのアーキテクチャと機能、およびOracle JDeveloperでのJDBCの技術概要を記載します。 次の項については、詳しい技術説明を記載します。


  • 基本のJDBC APIとJDBC 2.0の利点についての概要
  • JDBCと他のデータベース・プログラミング・インターフェースとの比較、およびOracle JDBCドライバ間の比較と機能および利点のリスト
  • JDBC2.0を利用したSQL3データ型の処理、およびJDBCを使用したOracleオブジェクト型の処理についての詳細な説明
  • Oracle JDBCドライバを使用したパフォーマンス最適化
  • Oracle JDBCドライバを使用してアプリケーションを作成するためのコード・テンプレート
  • Oracle JDeveloperを使用してJDBCアプリケーションを構築する例

Java Database Connectivity(JDBC)について

Oracle JDBCドライバについて

基礎JDBCチュートリアルの参照

アドバンストJDBCチュートリアルの参照

パフォーマンスの最適化

Oracle JDeveloperでのJDBCの使用

リソースおよびリファレンス

著者について 

対象読者 

 
このドキュメントは、JDBCについての詳しい知識はないが、JDBCを使用したデータベース・アプリケーションの構築を計画している開発者を対象にしています。
必要な知識  次の知識が必要です。

  • 一般的なプログラミング概念
  • Javaなどのオブジェクト指向言語
  • グラフィカルな開発環境
ソフトウェア要件  システムには次のソフトウェアが必要です。

  • Oracle JDeveloper 3.0
  • Oracle JDBC 8.1.6ドライバ
  Java Database Connectivity(JDBC)について ページ・トップへ

Java Database Connectivity(JDBC)は、Javaからリレーショナル・データベースに接続するための標準Javaインタフェースです。 JDBC標準はSun Microsystems社によって定義されたものです。これによって、独自のJDBCドライバを使用して標準を実装および拡張できます。

JDBCにより、異なるDBMSにわたり、広範な種類の構造化問合せ言語(SQL)データベースに接続できます。 また、新しいJDBC 2.0アプリケーション・プログラム・インタフェース(API)を使用すると、その他の表形式データ・ソース(スプレッドシートやフラット・ファイルなど)にもアクセスできます。 JDBC APIによって、エンタープライズ・データへのアクセスが必要な競争力の高いクロスプラットフォームなアプリケーションを作成する際に、"1回書けばどこでも実行できる"というJavaプラットフォームの機能を利用できます。 JDBCテクノロジ対応のドライバを使用すると、異種混合環境においてもあらゆる企業データに接続できます。

JDBC 2.0 APIには、スクロール可能な結果セットや新しいSQL:1999(以前はSQL 3)データ型など、多くの新機能があります。 JDBC 2.0 APIは、次の2つの要素で構成されます。

JDBC 2.0 Core API

java.sqlパッケージには、Java 2 SDK Standard EditionとJDBCのコア機能が含まれています。 次の表に、JDBC 2.0 Core APIで採用された新機能のいくつかとその利点を一覧します。

機能  利点 

スクロール可能な結果セット 

結果セットのカーソルを特定の行に移動できる。 この機能は、GUIツール内部でプログラム更新を行う場合に使用します。 

更新可能な結果セット 

SQLではなくJavaプログラミング言語コマンドを使用できる。 

新しいデータ型のサポート 

パフォーマンスの改善。 たとえば、バイナリ・ラージ・オブジェクト(BLOB)やCLOBなどのラージ・オブジェクトを、DBサーバーからクライアントに渡さなくても操作できます。 

バッチ更新 

複数の更新内容をバッチ処理のためにDBサーバーに送信できる。 

JDBC 2.0 Optional Package API

JDBC 2.0 Optional Package APIは、個別に入手することも、Java 2 SDK Enterprise Editionの一部として入手することもできます。 javax.sqlパッケージ内の機能によって、JDBC APIは、クライアント側APIだけでなくサーバー側のテクノロジにもなります。 次の表に、JDBC 2.0 Optional APIで採用された新機能のいくつかとその利点を一覧します。

機能  利点 

Java Naming and Directory Interface(JNDI)サポート 

配布が容易。 これにより、JDBCドライバの独立性が実現され、JDBCアプリケーションを管理しやすくなります。 

接続プーリング 

パフォーマンスの改善。 接続プールは、メモリー内に保持されたデータベース接続のキャッシュであり、これによって接続を再利用できます。 

分散トランザクション 

分散トランザクション処理システムを実装する際に重要。 

JavaBeans(RowSetsオブジェクト) 

Webブラウザ、ラップトップおよびPDAなどのthinクライアントにネットワークを介してデータを送信できる。

結果セットのスクロールや更新が可能。 JDBCドライバは、結果セットのスクロール機能および更新機能をサポートしていません。 また、GUIツール内部で使用できるようにドライバをJavaBeansコンポーネントとしてカプセル化することもできます。 

任意の表形式データ・ソースへのアクセスによるレガシー・システム統合 

スプレッドシートやフラット・ファイルの情報など、異なるデータベースに格納された情報を使用および統合できる。 

単純な従業員JDBCアプリケーション

このJavaアプリケーションは、従業員表から従業員名を選択するものです。 このアプリケーションでは、次の処理が行われます。

マルチスレッドの従業員JDBCアプレット

このアプレットは、従業員表から従業員とその給与のリストを選択するものです。 このサンプル・プログラムでは、次の処理が行われます。

JDBCと他のデータベース・プログラミング・インタフェースとの比較

JDBC APIが開発される前は、ODBCやOLE DBなど、リレーショナル・データベースにアクセスするためのプログラミング・インタフェースはほとんどありませんでした。 JDBC APIには、次のような利点があります。

  Oracle JDBCドライバについて ページ・トップへ

オラクル社では、クライアント側およびサーバー側で使用できるJDBCドライバを開発しています。 これらのドライバで異なる点は、データベースへの接続方法とデータの転送方法のみです。

Oracle JDBCドライバに共通の機能は次のとおりです。

図1に、JDBC thinドライバ、OCIドライバおよびサーバー・ドライバのドライバ・データベース・アーキテクチャを示します。


図1 ドライバ・データベース・アーキテクチャ

JDBC thinクライアント側ドライバについて

Oracle JDBC thinドライバは、タイプIV、ネイティブ・プロトコル、そして100% Pure Javaの、JDBC 1.22標準に準拠した実装です。 JDBC thinドライバは、Javaソケットを使用してOracleサーバーに直接接続します。 このドライバは、Javaアプリケーションに使用することもできますが、通常は、2層アプリケーションか3層アプリケーション構成でのJavaアプレットに使用します。

3層構成では、クライアント側でブラウザ内部で実行されるJavaアプレットにJDBC thinドライバを使用できます。 thin JDBCドライバはダウンロード可能で、プラットフォームに依存しません。

ドライバのダウンロード

JDBC thinドライバの場合、クライアント側にOracleソフトウェアがなくてもかまいません。 JDBC thinドライバは、Javaアプレットの実行と同時にブラウザにダウンロードできます。 クライアント(通常はブラウザ)で、HyperText Markup Language(HTML)ページからJavaアプレット・タグを含むURLを選択します。 アプレット・アーカイブには、適切なJDBCクラス・ファイルが含まれている必要があります。 Webサーバーにより、JavaアプレットとJDBC thinドライバがクライアントにダウンロードされます。 すると、JDBC thinドライバにより、Javaソケットを介してデータベース・サーバーへの直接接続が確立されます。

プラットフォームに依存しない

JDBC thinドライバにより、その独自の実装としてTCP/IPバージョンのOracle SQL*Net/Net8が提供されます。 このドライバはすべてJavaで書かれているため、プラットフォームに依存しません。


注意

Oracle SQL*Net製品は、Oracle8ではNet8になります。 


JDBC OCIクライアント・ドライバについて

Oracle JDBC OCIドライバは、タイプII、ネイティブAPI、そして部分的にJavaの、JDBCインタフェースの実装です。 このドライバは、Oracleコール・インタフェース(OCI)を使用してOracleデータベースと対話します。

JDBC OCIドライバは、OCIを介してOracleデータベースと対話します。 このため、JDBC OCIドライバは、あらゆるバージョンのOracleデータベースとの互換性を持ちます。 IPC、Named Pipes、TCP/IPおよびSPX/IPXなど、インストールされているNet8アダプタをすべてサポートしています。

JDBC OCIドライバは、ネイティブ・メソッドを使用してOCIライブラリ内のCエントリ・ポイントをコールするため、プラットフォームに固有です。 ただし、JDBC/OCIドライバはダウンロードできません。 まず、OCIライブラリ、SQL*Net、COREライブラリおよびその他のサポート・ファイルを、JDBCドライバをインストールしたシステムにインストールする必要があります。 たとえば、各クライアント・マシンや中間層Javaアプリケーション・サーバーにこれらの要素をインストールします。 このドライバは、Javaアプリケーションや、Oracle Application Server(OAS)などのJava中間層には最適ですが、Javaアプレットには適していません。

JDBC OCIドライバは、次のような構成で使用できます。

JDBC OCIドライバとJDBC thinドライバとの比較

JDBC OCIとJDBC thinとの類似点

次の表に、JDBC OCIドライバとJDBC thinドライバに共通の機能を一覧します。

機能  説明 

Oracle固有のデータ型サポート 

ROWIDやREFCURSORなどのOracle固有のデータ型がサポートされています。 

各国語サポート 

各国語キャラクタ・セットが完全にサポートされているため、Javaアプリケーションは任意のOracleキャラクタ・セットを使用してデータベースにアクセスできます。  

ファイアウォール・サポート 

任意のSQL*Net認定ファイアウォール(すなわち、Stateful InspectionとProxyベースの両方)と連携動作します。 

文字ストリーミング・サポート 

バイナリ、ASCIIおよびUnicode間のすべての変換を含む、両方向のストリーミングがサポートされています。 

パフォーマンス最適化 

次の点で、パフォーマンスが最適化されます。

バインド、定義および記述に必要なクライアントからサーバーへのラウンド・トリップ回数の低減

バッチ文の実行

行のプリフェッチ

配列インタフェース 

PL/SQLストアド・プロシージャ・サポート 

PL/SQLストアド・プロシージャと無名ブロックの実行、すなわちSQL92およびOracleエスケープ構文が両方ともサポートされています。 

Net8 Connection Manager 

サポートされています。 

BLOBサポート 

サポートされています。

バージョン8.1.5には、ネイティブBLOBサポートがあります。 それより前のバージョンでは、PL/SQLパッケージが必要です。  

JDBC OCIとJDBC thinの違い

次の表に、JDBC OCIドライバとJDBC thinドライバで異なる機能を一覧します。

機能  JDBC/OCIの説明  JDBC thinの説明 

Javaアプレット機能 

Javaアプレットを使用するように設計されていません。 

100% Pure Java。 Javaアプレットを使用できる機能があります。 ダウンロード・サイズは900K(圧縮サイズ)です。 クライアント・ソフトウェアを事前にインストールする必要はありません。 

SQL*Netバージョン・サポート 

SQL*Net Adapters、IPC、Named Pipes、DECNet、TCP/IPなど、すべてのSQL*Netアダプタがサポートされています。 

TCP/IPネットワークのみがサポートされています。 

暗号化およびAdvanced Networking Option(ANO) 

サポートされています。 データ暗号化は、Net8 Advanced Networking Option(ANO)を使用して行われます。 

サポートされていません。 

ドライバ・タイプ 

Javaアプレットを使用するように設計されていません。 

タイプ4ドライバ:

Javaソケットを使用してOracleデータベースに直接接続します。 

JDBCサーバー・ドライバについて

Oracle JDBCサーバー側内部ドライバ(KPRB)は、Oracle8i の緊密に統合されたサーバー側JavaエンジンであるOracle Jserver内に組み込まれています。 追加のインストールや構成の必要はありません。 JDBC KPRBサーバー・ドライバを使用できるのは、Oracle8i で実行されており、Javaストアド・プロシージャ、Enterprise Beans、Java サーブレットなどのSQLエンジンにアクセスする必要がある任意のJavaプログラムです。

JDBCサーバー・ドライバでは、Oracle8i で実行されているJavaプログラムにJDBCを使用して、SQLおよびPL/SQLにアクセスできます。 このドライバには、クライアント側のドライバと同じ機能および拡張機能があります。

サーバー側JDBCドライバの違い

サーバー側JDBCドライバはクライアント側ドライバと同じAPIをサポートしていますが、両者には次のような違いがあります。

デフォルトのセッションおよびトランザクションのコンテキスト

サーバー側のJDBCドライバは、クライアント側のJDBCドライバと異なり、デフォルトのセッションおよびトランザクションのコンテキストで実行されます。 JavaアプリケーションはJava仮想マシン(VM)上でデータベース内のデフォルト・コンテキストによって実行されるため、明示的にトランザクション管理を制御することはできません。

デフォルトの接続

SQLおよびPL/SQLへのアクセスはRDBMS内でローカルなので、サーバー側のJDBCドライバとのリモートNet8接続という概念はありません。 サーバー側にデフォルト接続文字列を指定する必要があります。 JDBCは、常に一定の"jdbc:oracle:kprb:"という引数を持ちます。

接続のクローズが不可

サーバー側JDBCドライバとのリモートNet8接続という概念がないため、この接続はクローズできません。

Oracle JDBCドライバの利点

OracleのJDBCドライバには、次のような利点があります。

  基礎JDBCチュートリアルの参照 ページ・トップへ

Javaを理解するには、Sun Microsystems社のオンラインJDBCチュートリアルを読むと効果的です。 「Sun Microsystems社のオンラインJDBCチュートリアル」では、様々な演習をウォークスルーします。 基礎のJDBCから始まって、高度なJDBCトピックへと進みます。

Oracle JDBCドライバのスタート・ガイド

インストールおよび構成

開発および配布目的でOracle JDBCをインストールして構成するには、Oracle JDBCドライバを使用します。

Oracle JDBCは、次の方法で入手できます。

Oracle8i 以降のデータベースのインストールによりOracle JDBCを取得した場合、[Oracle Home]がインストールされます。 Oracle WebサイトからOracle JDBCを入手した場合は、tarまたはzipを解凍してJDBCディレクトリを生成してください。

Oracle JDBCドライバのインストールには、次のものが含まれます。

Oracle JDBCドライバ(Win95/Win98/NT)を使用する場合、次の設定ステップを行う必要があります。

Solarisを使用する場合、次の設定ステップを行う必要があります。

JDBCを使用するプログラムには、JDBCクラスをインポートする必要があります。 次のようにインポートしてください。

JDBCのOracle拡張機能を使用するには、次のパッケージを組み込んでください。

JDBCコードのテンプレート

JDBCコードのテンプレートでは、Oracle JDBCドライバを使用してアプリケーションを作成するためのコード・フラグメントが提供されます。 このテンプレートは、具体的なJDBCの構築例と使用例を提供することによって、JDBC仕様およびJDBCプログラミング・モデルの理解を助けることを目的に設計されたものです。

JDBCコードのテンプレートは、次のようなJDBC操作を対象としています。

  アドバンストJDBCチュートリアルの参照 ページ・トップへ

この項では、SQL3データ型などの拡張データ型を使用するためのJDBC APIについて詳細に説明します。 また、JDBCによりサポートされるOracleオブジェクト型についても説明します。

JDBCでのSQL3データ型サポート

一般にSQL3型と呼ばれるデータ型は、次期バージョンのANSI/ISO SQL標準で採用される新しいデータ型です。 JDBC 2.0 APIにより、これらのSQL3データ型からJavaプログラミング言語へのマッピングを表すインタフェースが提供されます。 JDBC 2.0 Core APIでは拡張データ型の使用が新たにサポートされるため、単純データ型と同じくらい簡単に拡張データ型を使用できるようになります。 このサポートには、本質的にオブジェクトである新しいSQLデータ型を格納、取得および更新する機能が含まれます。 このため、オブジェクト・データべースとリレーショナル・データベースの違いが少なくなります。

SQL3データ型の分類

SQL3データ型は、次のように分類できます。

新しい組込み型

これらの型は、ラージ・オブジェクトの格納に使用されるSQL3データ型です。 CHAR、FLOATおよびDATEなどの標準の組込みデータ型以外にも、バイナリ・ラージ・オブジェクト(BLOB)およびCLOB(キャラクタ・ラージ・オブジェクト)というデータ型があります。

構築型

これらの型は、次の型を基礎にしたSQL3データ型です。

ユーザー定義型(UDT)

これらの型は、SQLコマンドCREATE TYPEで作成される新しい型です。 ユーザー定義型は、単一の組込み型の表記を基礎にしています。

構造化型

複数の属性を含む新しい型。 組込みデータ型かユーザー定義データ型のいずれかになります。

ロケータ型

この型は、データベース・サーバーに常駐するデータへの論理ポインタです。 次のような型です。

SQL3データ型のマッピング

次のマッピングにより、SQL3型をマップするJDBC 2.0インタフェースが提供されます。

SQL3データ型の使用

SQL3データ型を取得、格納および更新する方法は、他のデータ型の場合と同じです。 SQL3データ型の取得にはResultSet. getXXXメソッドまたはCallableStatement. getXXXメソッドを、格納にはPreparedStatement. setXXXメソッドを、更新にはupdateXXXを使用します。

次の表に、JDBC 2.0 SQL3データ型へのアクセスに使用するメソッドを示します。

SQL3型  getXXXメソッド  SetXXXメソッド  updateXXXメソッド 

BLOB 

getBlob  

setBlob  

updateBlob 

CLOB 

getClob 

setClob  

updateClob 

ARRAY 

getArray  

setArray  

updateArray 

構造化型 

getObject  

setObject 

updateObject 

REF(構造化型) 

getRef  

SetRef 

updateRef 

コード・フラグメント
// BLOBデータを読み取る
BLOB blob = rset.getBLOB (1);
// CLOBデータを読み取る
CLOB clob = rset.getCLOB (2);
// Arrayデータを取得
ARRAY obj = rset.getARRAY (1);
// Ref列を取得
REF obj = rset.getREF (1);

これらは、Oracle JDBC 8.1.6ドライバで使用可能です。 Oracleデータベース・バージョンとOracle8i は、本質的にSQL3型のサポートを提供しています。

ラージ・オブジェクト(LOB)の使用

ラージ・オブジェクト(LOB)は、内部オブジェクトにも外部オブジェクトにもなります。 内部LOBは、データベース表領域内部に格納されます。 これにより、領域が最適化され、効率的なアクセスが実現します。 内部LOBのデータ型は、バイナリ・ラージ・オブジェクト(BLOB)かキャラクタ・ラージ・オブジェクト(CLOB)のいずれかになります。 外部LOB(BFILES)は、データベース表領域外部のオペレーティング・システム・ファイルに格納された大きなバイナリ・データ・オブジェクトです。

BLOB、CLOBおよびBFILEオブジェクトの重要な機能は、データベース・サーバーからクライアント・マシンにデータ全部を移さなくても操作できるということです。 このような型のインスタンスは、実際にはインスタンスが表すデータベース内のオブジェクトへの論理ポインタです。 SQLのBLOB、CLOBまたはBFILEオブジェクトは非常に大きい場合があるため、この機能によってパフォーマンスを大幅に改善できます。

LOBデータを使用する場合、まず、表からそのロケータを取得する必要があります。 次に、LOBからデータを読み取るか、LOBにデータを書き込み、様々な種類のデータ操作を実行できるようになります。

JDBCドライバは、BLOB、CLOBおよびBFILEに対して次のクラスをサポートしています。

java.sql.BLOB(JDBC 2.0 Spec、JDBC 816 SDKまたは816ドライバでサポート)

java.sql.CLOB(JDBC 2.0 Spec、JDBC 816 SDKまたは816ドライバでサポート)

oracle.sql.BFILE

LOBにアクセスするには、次のようにします。

  1. LOBロケータを取得して、BLOBオブジェクトを作成します。

  2. LOBロケータからデータを取得して、Blobデータを表示します。

  3. BLOBオブジェクトを作成します。

RDBMSのLOB列からSQL問合せフォームを使用してLOBロケータを取得するには、次のようにします。

コード・フラグメント
// LOBロケータを選択して結果セット内に取得
ResultSet rs = stmt.executeQuery (
"select blob_col, clob_col from lob_table");
while (rs.next ())
{
// LOBロケータをLOBのJavaラッパー・クラス内に取得
Blob blob = rs.getBlob (1);
Clob clob = rs.getClob (2);
[...]
}
Blobデータの表示

LOBロケータからデータをフェッチします。 LOBデータは、Javaストリームとして表示されます。 メソッドはJavaストリーム・クラス上で使用します。 Blobインタフェースには、BLOBオブジェクトを表示するための2つのメソッドがあります。 これらのメソッドを次に示します。

メソッド  説明 

getBinaryStream: getBinaryStream 

BLOB値を入力ストリームとして表示する。 

getBytes: getBytes 

BLOB値の全部または一部をバイト配列として表示する。 

コード・フラグメント
// BLOBロケータからBLOBデータを読み取る
Java.io.InputStream byte_stream = my_blob.getBinaryStream();
byte [] byte_array = new byte [10];
int bytes_read = byte_stream.read(byte_array);
...
// CLOBロケータからReader charストリーム内にCLOBデータを読み取る
Java.10 Reader char_stream = my_clob.getCharacterStream();
char [] char_array = new char [10];
int chars_read = char_stream.read (char_array, 0, 10);

Oracleオブジェクト型の使用

Oracleでは、Oracleオブジェクトの特徴とJDBCの機能を緊密な統合を提供しています。

Oracle8i オブジェクト型の使用

Oracle8i は、オブジェクト・リレーショナル・データベース管理システム(ORDBMS)です。 追加のデータ型を定義するには、データの構造と操作のメソッドを指定します。 定義したデータ型は、リレーショナル・モデル内部で使用できるようになります。

たとえば、Oracle7では、CHAR、NUMBERおよびDATEなどの様々なSQLプリミティブ型の表を定義できます。

Oracle8オブジェクトでは、この機能がさらに拡張されているため、複合変数を定義して操作することができます。(たとえば、TYPE PERSONなど。型の名前にvarCHAR2、電話番号の型にvarchar2を使用。)

create type EMPLOYEE as object
 (
EmpName VARCHAR2(50),
EmpNo INTEGER ,
				SAL	 FLOAT
);

OracleのJDBCドライバには、アプリケーション・プログラム内でユーザー定義データ型を使用するための多くの機能があります。 OracleのJDBCドライバを使用すると、データベース内に定義されているオブジェクトおよび収集型にアクセスできます。 この操作は、動的SQLを介してJavaプログラム内部で行われます。 また、データベース内に定義されている型を、デフォルト・マッピングまたはカスタマイズ可能マッピングによってJavaクラスに変換することもできます。

SQL型からJavaクラスへのマッピングは、カスタマイズできます。 Oracleでのクラスのマッピングは非常に柔軟性に富んでいます。 この項では、使用可能なオプションについて説明します。 自分のニーズに最も適したオプションを選択するためには、次の事項を検討して、Oracle8オブジェクトをJavaで使用できるかどうかを確認する必要があります。

Javaクラスの作成と移入

OracleオブジェクトのJavaクラスを作成して移入する場合、次のようなオプションがあります。

Oracleデフォルト・マッピング(カスタマイズなし)

これは、Oracle8オブジェクト型をJavaにマップする方法についてカスタマイズを指定しなかった場合にOracleによって提供されるデフォルト・マッピングです。 この場合、JDBCはオブジェクトをSTRUCTとして表示します。

カスタムJavaクラスの作成

これは、OracleオブジェクトとJavaクラスの間のマッピングを明示的に指定することです。 JDBCドライバには、指定したカスタムJavaクラスを移入する機能が必要です。 このため、Javaクラスは一連の制約を受けることになります。 SQLDataインタフェースまたはCustomDatumインタフェースを基礎にしてクラスを定義すると、クラスをこれらの制約に適合させることができます。

Oracleデフォルト・マッピングの表示

Oracle8オブジェクト型からJavaクラスへのマッピングを明示的に指定しなかった場合、Oracleデフォルト・マッピングが提供されます。 Oracle8オブジェクトは、oracle.sql.STRUCTのインスタンスとして表示されます。


注意

コードをJDBC 2.0に完全準拠させる場合は、java.sql.Structインタフェース内の機能を使用してください。 oracle.sql.STRUCTクラスは、java.sql.Structインタフェースを実装し、JDBC 2.0標準の機能をさらに拡張しています。 


oracle.sql.STRUCTクラスには、属性値を保持するoracle.sql.Datumオブジェクトの値配列が含まれます。 oracle.sql.Datumは、オブジェクトを拡張する抽象クラスであり、Oracleネイティブ・データ型階層のルートです。 oracle.sql.Datumのサブクラスはいずれも、ネイティブOracleカーネル・データ型のいずれかを表します。 これにより、SQLとJava間のデータ・コピーを最適化できます。

また、このクラスには、サーバー内の対応するオブジェクト型のSQL型名が含まれます。 ネストされたオブジェクトは、型oracle.sql.STRUCTのエントリとして値配列内に表示されます。Oracle8オブジェクト型の属性は、いずれのJavaクラスにもマップされません。 これは、プリミティブSQL型またはネイティブJava型と対応していますが、oracle.sql.Datumオブジェクトの一部として保持されます。

Oracleデフォルト・マッピングの使用

Oracleデフォルト・マッピングを使用すると、次のような利点があります。

次のような場合は、デフォルト・マッピングを使用してください。

Oracleオブジェクト用のカスタムJavaクラスの作成

OracleオブジェクトにカスタムJavaクラスを定義するには、次のようにします。

  1. ドライバにより該当のOracleオブジェクトに対して生成するカスタムJavaクラスを指定する型マップを定義します。

  2. データ変換インタフェースを実装するカスタムJavaクラスを作成して、カスタム・クラスを作成および移入します。 これにより、読取り/書込み機能が提供されます。

次のデータ変換インタフェースにより、JDBCでは実行時にデータを正確にアンパックできます。

TypeMap仕様の表示

TypeMapは、SQLオブジェクト型と、対応するJavaクラス・マッピングを備えた単純なハッシュ表です。 TypeMapにより、SQLデータをJava形式にアンパックする方法がJDBCに指定されます。 これによって、JDBC接続を備えたTypeMapが提供されます。 TypeMap内に登録されているクラスは、データ変換インタフェースのセットを実装します。

CustomDatumインタフェースとSQLDataインタフェースの比較

CustomDatumには、次のような利点があります。

SQLDataの利点は、JDBC標準であることです。 このため、コードの移植性が高くなります。

SQLDataインタフェースを使用したOracleオブジェクトへのアクセス

SQLDataインタフェースを使用してOracleオブジェクトにアクセスするには、次のようにします。

  1. SQLでユーザー定義型を定義します。

  2. SQLDataインタフェースを実装するクラスを作成します。

  3. 型マップにエントリを挿入します。

  4. オブジェクトをフェッチします。

  5. Java関数を使用してデータを操作します。

SQLでのユーザー定義型の定義

コード・フラグメント:

CREATE TYPE EMPLOYEE
(
				EMPNO NUMBER,
 				EMPNAME		VARCHAR2(100),
);
SQLDataインタフェースを実装するクラスの作成

Sun Microsystems社のJavaBlendなどのツールを使用すると、このステップが自動的に実行されます。

このコードは、次の3つのメソッドによって実装されます。

型マップへのエントリの挿入

新規の型マップを作成するには、次のようにします。

  1. 空のマップ・オブジェクトを作成します。 空のマップ・オブジェクトは、java.util.Dictionaryクラスを実装するものであれば何でもかまいません。 たとえば、java.util.HashtableクラスはDictionaryクラスを実装します。

  2. マップ・オブジェクトのput()メソッドを使用して、エントリをマップに追加します。 たとえば、CORPORATEデータベース内にEMPLOYEEというSQL型が定義されている場合、次の文を使用して、その型をEmployeeObj.javaにより定義されたEmployeeクラスにマップします。
    newMap.put("CORPORATE.EMPLOYEE", class.forName("EmployeeObj"));

  3. マップにエントリを追加し終わったら、ConnectionオブジェクトのsetTypeMap()メソッドを使用して、接続の既存の型マップを上書きします。

この例では、setTypeMap()により、接続の元のマップがnewMapで上書きされます。

oraconn.setTypeMap(newMap);
オブジェクトのフェッチ

標準のSQL SELECT文を使用して、データベース内の列からResultSet内にオブジェクト型をフェッチします。 getObjectを使用して、ResultSetまたはCallableStatementから、TypeMap内で指定されているJavaクラスへとデータを取り出します。 setObjectを使用して、オブジェクト型を更新します。

ResultSet rs = stmt.executeQuery ("select * from employee_table");
rs.next ();
EmployeeObj ee = (EmployeeObj) rs.getObject(1);5.
データの操作

データを操作するには、Java関数を使用します。 ここでは、SQLDataインタフェースを使用してOracleオブジェクトにアクセスする例を示します。

ウォークスルーを参照

コードをダウンロード

CustomDatumインタフェースを使用したOracleオブジェクトへのアクセス

Oracleオブジェクトとその属性データをJavaアプリケーションに対して使用可能にするには、そのオブジェクトにoracle.sql.CustomDatumおよびoracle.sql.CustomDatumFactoryインタフェースを実装するJavaクラスを作成します。

CustomDatumインタフェースおよびCustomDatumFactoryインタフェースは、Oracleにより提供されます。JDBC標準の一部ではありません。

OracleのOracle JPublisherユーティリティは、CustomDatumおよびCustomDatumFactoryインタフェースを実装するクラスの生成をサポートします。

Oracle JPublisherは、OracleオブジェクトにマップするJavaクラスを作成するためにJDBCとあわせて使用できるOracleユーティリティです。 Oracle JPublisherにより、カスタムJavaクラスの完全なクラス定義が生成されます。これをインスタンス化して、Oracleオブジェクトからのデータを保持できます。 Oracle JPublisherにより生成されたクラスには、SQLからJava、およびJavaからSQLにデータを変換するためのメソッドが含まれています。 また、クラスの属性のためのgetterおよびsetterメソッドも含まれています。

Oracle JPublisherには、マッピングのためのオプションがあります。 Oracle JPublisherを使用してカスタムJavaクラスを実装した場合、属性のマッピングを選択できます。 次のマッピングから選択します。

CustomDatumインタフェースを使用してOracleオブジェクトにアクセスするには、次のようにします。

  1. SQLでユーザー定義型を定義します。

  2. CustomDatumおよびCustomDatumFactoryインタフェースを実装するクラスを作成します。

  3. Oracle JPublisherクラスのgetFactory()メソッドを使用して、カスタムJavaクラス内にCustomDatumFactoryインスタンスを生成します。

  4. SQL問合せとgetCustomDatum()メソッドを使用して、オブジェクト型を結果セットに取得します。

  5. 適切なアクセス・メソッドを使用して、Javaでデータにアクセスまたは修正します。  
    コードを参照

    コードをダウンロード

  パフォーマンスの最適化 ページ・トップへ

現在のOracleドライバには広範囲にわたった改良が施されており、パフォーマンスが向上するとともにメモリーの使用効率も上がりました。 一連のテストで、Oracle8i JDBCドライバは他製品との競争に勝ち続け、その卓越した性能を証明しました。 これらのドライバを操作して、構成をよりいっそう最適化できます。

有益なヒントと推奨事項

自動コミット・モードの無効化

自動コミット・モードは、各SQL文の後にコミットを発行するかどうかをデータベースに指示します。 自動コミット・モードが設定されていると、時間が長くかかります。クライアントから大量の文をサーバーに送られた場合などは特に、処理に長時間を要します。

JDBC仕様に準拠して、デフォルトでは、接続は自動コミット・モードでオープンされます。

 
ウォークスルーを参照
 

行のプリフェッチ

Oracle JDBCドライバを使用すると、問合せ時に結果セットが移入されている間に、クライアントにプリフェッチする行の数を設定できます。 プリフェッチする行数のデフォルトは10です。行データをクライアントにプリフェッチすると、サーバーへのラウンドトリップ回数が減ります。 行のプリフェッチの値は、個々の文について設定することも、接続内のすべての文について設定することもできます。

 
ウォークスルーを参照
 

バッチの更新

Oracle JDBCドライバを使用すると、クライアント側で挿入数と更新数を累積しておくことができます。 累積数が指定のバッチ値に到達したら、それをバッチでサーバーに送信できます。 デフォルトのバッチ値は1です。

行のプリフェッチと同様に、バッチを行うと、サーバーへのヒット数を大幅に削減できます。 バッチ値は、一連の文について設定するか、接続内のすべての文について設定できます。

 
ウォークスルーを参照
 

列型の定義

標準のJDBCにより問合せが実行される場合、まず、データベースへのラウンドトリップによって、結果セット列に使用する型が判別されます。 JDBCは問合せからデータを受け取ると、必要に応じてデータを変換し、同時に結果セットを移入します。

Oracle JDBCドライバを使用すると、次の問合せでの列型をドライバに通知できます。 これにより、データベースへのラウンドトリップを節約できます。 通知しない場合は、表を記述することが必要になります。 最適化されたサーバーにより、必要な型変換がすべて実行されます。

コード・フラグメント

import oracle.jdbc.driver.*

Connection conn =

DriverManager.getConnection("jdbc:oracle:thin:","scott","tiger");

Statement stmt = conn.createStatement();

/*列を文字列として要求: 列型を取得するためのラウンド・トリップを回避

*サーバー上で数値から文字列に変換

*/

((OracleStatement)stmt).defineColumnType(1, Types.VARCHAR);

ResultSet rset = stmt.executeQuery("select empno from emp");

while (rset.next() )

System.out.println(rset.getString(1));

stmt.close();

defineColumnType()メソッドを起動するために、文(stmt)を型OracleStatementにキャストする必要があります。

接続のcreateStatement()メソッドにより、defineColumnType()を持たないオブジェクトのjava.sql.Statement型が返されます。 これらのメソッドは、OracleStatement実装でのみ提供されます。

エスケープ処理の無効化

SQL92構文のエスケープ処理は、デフォルトでは有効になっています。 JDBCドライバでは、SQLコードをデータベースに送る前に、エスケープ置換が実行されます。 JDBCコードにはPure Oracle構文が含まれているため、JDBCエスケープ文字パーサーを無効化し、その使用を回避できます。

stmt.setEscapeProcessing(false);

Bequeath

JDBCクライアントとOracleサーバーが同じマシン上で実行されている場合、BequeathメカニズムへのOCIドライバを使用してデータベースに接続できます。 Bequeath接続のほうが、TCP/IP接続よりも高速です。

プリコンパイルされた文とバインド変数の使用

頻繁に実行する文には、バインド変数とあわせてPreparedStatementを使用すると効率が上がります。 PreparedStatementはStatementから継承されたものですが、次の2つの点でStatementとは異なります。

  Oracle JDeveloperでのJDBCの使用 ページ・トップへ

Oracle JDeveloper Suiteは、Oracleインターネット・プラットフォーム用にコンポーネント・ベースのデータベース・アプリケーションを構築、デバッグおよび配布するための統合された1つの製品セットです。

Oracle JDeveloper環境には、100% Pure JavaやネイティブOracle8ドライバなど、JDBCの統合サポートが含まれています。 Oracle JDeveloperのデータベース・コンポーネントは、JDBCドライバを使用して、クライアントおよびサーバー上で実行されるアプリケーション間の接続を管理します。

JDBCを使用したOracle JDeveloperの統合の例

Oracle JDeveloperでJDBCドライバがどのように使用されるかを理解してJavaコードの開発および配布に役立てるには、次の例を参照してください。

Oracle JDeveloper Connection Manager

ここでは、Oracle JDeveloper統合開発環境とConnection Managerによって、複数の作業領域とプロジェクトにわたって名前付きの再利用可能な接続が提供される仕組みを示します。 次の項目について説明します。

JDeveloper JPublisher統合

ここでは、Oracle JPublisherウィザードを示します。 また、Oracleオブジェクト型にラッパー・クラスを生成する方法も示します。 次の項目について説明します。

  リソースおよびリファレンス ページ・トップへ

次に示したリンクから、JDBCおよびOracle JDeveloperに関する詳細な情報が記載されたWebを参照できます。

JDBC言語

Oracle JDBC

Oracle JDeveloper

Oracle JDeveloperの詳細は、次のURLでOracle Technology NetworkのWebサイトを参照してください。
http://technet.oracle.com/products/jdev

  著者について ページ・トップへ

Sudhir Durejaは、オラクル社のInternet Computing group of Partner Servicesの主任コンサルタントです。 Oracle Alliances内でJavaおよびOracleテクノロジを基礎にしたコンサルティングと指導に携わっています。


Oracle
Copyright © 2000 Oracle Corporation.

All Rights Reserved.

Javaロードマップ

目次