注: この章の内容は、Addison Wesley 社より Java シリーズの 1 巻として出版された『JDBCTM API Tutorial and Reference, Second Edition: Universal Data Access for the JavaTM 2 Platform』(ISBN 0-201-43328-1) に基づいて作成したものです。
この付録は、JDBC 2.1 コア API の新しい特徴を要約しています。
JDBC 2.1 コア API は、JDBC 1.0 API を含み、さらに拡張機能および新しい機能を追加しています。 これらの追加された機能により、汎用的なデータアクセスと向上したパフォーマンスの提供によって、データベースコンピューティングの最前線に Java プログラミング言語を位置付けます。
「下位互換性の目標」に従っているので、旧バージョンの JDBC API を使用するアプリケーションは、Java 2 プラットフォームを使って問題なく実行できます。 しかし、2.0 の新しい特徴を利用するアプリケーションは、それらの特徴を実装しているドライバとともに実行しなければなりません。
JDBC 2.1 コア API の新しい特徴は、新しい機能のサポートと SQL3 データ型のサポートの 2 つに大きく分類されます。
データの検索、保存、操作が便利になり、さらに、新しい特徴によりJDBC アプリケーションの効率がより良くなります。 たとえば、バッチ更新により性能が大幅に向上します。 新しい Blob
、Clob
、Array
インタフェースにより、アプリケーションはクライアント上にデータを実体化する必要なく、大量のデータを操作することができるので、転送時間と必要なメモリ容量の大きな節約につながります。 また、フェッチサイズとフェッチ方向の設定のための新しいメソッドにより、プログラマはアプリケーションを微調整して、より効率的なデータ検索と処理を達成できます。
JDBC 2.1 コア API は、重要な新機能を追加しています。 ここでは、それぞれの新しい機能範囲について簡単に説明し、サポートしている API をまとめます。
スクロール可能な結果セットは、現在のカーソル位置からの相対位置または指定の位置に、カーソルを進めたり戻したりできます。 次のインタフェースには、スクロール可能な結果セットをサポートする新しいメソッドがあります。
新しいバッチ更新機能により、更新を個別に送信せずに、データベースに複数の更新を一度に送信してバッチ実行することができます。 次のインタフェースには、バッチ更新をサポートするメソッドが追加されています。 BatchUpdateException
例外は新規です。
プログラム的な更新により、SQL 文ではなく JDBC API を使って更新を行うことができます。 次のインタフェースには、プログラム的な更新をサポートする新しいメソッドと定数があります。
updateXXX
メソッド
JDBC 2.1 コア API には、上記の他に、さまざまな新しい特徴があります。 この特徴を以下にまとめます。
ResultSet
メソッド
Statement
、PreparedStatement
、および CallableStatement
メソッド。 このデフォルトの設定は、クエリーの実行により結果セットが最初に作成されるときにその結果セットに設定されます。
getUnicodeStream
と setUnicodeStream
の 2 つのメソッドを置き換えています。
ResultSet.getCharacterStream
CallableStatement.getCharacterStream
PreparedStatement.setCharacterStream
java.math.BigDecimal
値の完全な精度 - java.math.BigDecimal
値を完全な精度で扱う、新しいバージョンのメソッド。 推奨されていないバージョンとは異り、新しいバージョンでは精度の指定を受け取りません。
Calendar
オブジェクトを受け取る新しいバージョンのメソッド。 ドライバにおいて、日付、時間、タイムスタンプの値を計算するとき、デフォルトではなく指定されたタイムゾーンを使用できます。
JDBC 2,1 コア API には進化したデータ型のサポートが追加され、単純なデータ型と同様に簡単に進化したデータ型を使用できます。 このサポートには、本質的にはオブジェクトである新しい SQL データ型の保存、検索、更新の機能も含まれるので、オブジェクトデータベースとリレーショナルデータベースの明確な区別をなくすことができます。 以下の 4 つの節 (「A.3.1 SQL3 データ型とは何か」、「A.3.2 SQL3 データ型のサポートの概要」、「A.3.3 新しい SQL3 データ型のマッピング」、「A.3.4 SQL ロケータ」) で、JDBC 2.0 コア API の進化したデータ型のサポートについて説明します。
SQL で定義されているオブジェクトをデータベーステーブル内の値として保存できるだけではなく、Java アプリケーションを作成するプログラマは、Java プログラミング言語で定義されているオブジェクトをデータベーステーブル内の値として保存することができます。 「A.3.5 Java オブジェクト保存のサポート」 で、この機能について説明します。
ドライバは、そのドライバの DBMS がサポートしていない機能を実装するようには、要求されていません。 そのため、すべてのドライバが、ここで説明している機能を実装する必要はありません。 getTypeInfo
、getColumns
、getUDTs
などの DatabaseMetaData
メソッドを呼び出して、ドライバがサポートしているデータ型の情報を取得することができます。
ここでは新しい SQL3 データ型について説明します。 Java プログラミング言語のデータ型へのこれらのデータ型のマッピングについては、「A.3.3 新しい SQL3 データ型のマッピング」で説明します。
CHAR
、FLOAT
、DATE
などの標準の組み込みデータ型に追加されます。
CREATE TYPE
により作成される新しいデータ型
JDBC 2,1 コア API は、次の新しいインタフェース、メソッド、フィールドによって、新しい SQL3 データ型をサポートします。
ResultSet
インタフェースの新しい getXXX
メソッド。 結果セットから SQL3 型の列値を取得する
CallableStatement
インタフェースの新しい getXXX
メソッド。 出力パラメータ内の SQL3 型の値を取得する
PreparedStatement
インタフェースの新しい setXXX
メソッド。 SQL3 型の列値を設定する
ResultSet
インタフェースの新しい updateXXX
メソッド。 プログラムにより値を更新する
DatabaseMetaData
と ResultSetMetaData
インタフェースの新しいメソッド。 新しいデータ型に関するメタデータを取得する
java.sql.Types
クラスに追加された新しいフィールド (定数)。 新しいデータ型と永続的な保存をサポートする
JDBC 2.1 コア API では、SQL3 データ型の正確な複製を試みるのではなく、それらのデータ型を Java プログラミング言語の型にマッピングすることにより、それらのデータ型の機能性を維持し、使用の便宜をはかることを目標とします。 たとえば、SQL3 には「ロケータ型」と呼ばれるデータ型があり、データベースサーバに保存されているデータを指すためにクライアント上で使用されます。 ロケータではクライアントマシン上にデータを実体化しなくてもデータを操作できるので、大きなデータを扱う場合に役立ちます。 SQL3 には、ARRAY
、BLOB
、CLOB
型と構造化型のためのロケータが含まれています。 JDBC 2.1 コア API には、これらのデータ型のためのロケータが直接含まれてはいません (構造化型のためのロケータはまったくありません) が、ドライバと DBMS が状況に合わせて適切なロケータを使用するように実装されたインタフェースがあります。 その結果、JDBC API を使って SQL の ARRAY
、BLOB
、CLOB
型の値にアクセスする場合、開発者はロケータについて考える必要はありません。 ロケータの詳細については、「A.3.4 SQL ロケータ」 を参照してください。
JDBC 2.1 コア API では、次の SQL3 データ型は Java プログラミング言語のインタフェースにマッピングされます。
ARRAY
- java.sql.Array
へマッピングされる
BLOB
- java.sql.Blob
へマッピングされる
CLOB
- java.sql.Clob
へマッピングされる
REF
- java.sql.Ref
へマッピングされる
java.sql.Struct
へマッピングされる
個別型は単一の組み込み型を基にしているため、単純にその組み込み型への標準的なマッピングにマッピングされ、インタフェースにはマッピングされません。 たとえば、次の SQL 文は新しいデータ型 MONEY
を作成します。
CREATE TYPE MONEY AS NUMERIC(10, 2)
この新しい UDT は java.math.BigDecimal
にマッピングされるデータ型 NUMERIC
を基にしています。そのため、データ型 MONEY
は java.math.BigDecimal
にマッピングされます。
したがって、MONEY
型の値は getBigDecimal
メソッドで取得され、setBigDecimal
メソッドで保存され、updateBigDecimal
メソッドで更新されます。
SQL LOCATOR
は、データベースサーバ上のデータへの論理ポインタです。 一般に、画像やオーディオなど、クライアント上に生成するには大きすぎるデータを参照します。 ロケータはクライアント環境にのみ存在し、一時的な存在です。 JDBC 2.1 コア API の標準的な実装では Blob
、Clob
、Array
の各インタフェースのインスタンス用に内部的にロケータを使用します。 つまり、Blob
、Clob
、Array
オブジェクトにはデータそのものが含まれているのではなく、サーバ上のデータを指すロケータが含まれています。 Blob
、Clob
、Array
インスタンスを操作するということは、実際には、それらが表すデータベースオブジェクトを操作していることになります。 クライアントにデータを持ち込まずに大きなデータベースオブジェクトを操作するこの機能は、性能に大きく貢献します。
JDBC 2.1 コア API では SQL LOCATOR(
構造化型)
の使用は必要ではありません。 標準的な実装では、Struct
オブジェクトには、それがマッピングされる構造化型のデータが含まれていて、Blob
、Clob
、Array
オブジェクトのような内部的なロケータとしては実装されていません。
JDBC API では、Java プログラミング言語定義されている永続的な保存を、 getObject
、setObject
メソッドを通じて、常にサポートしきています。 もちろん、Java オブジェクトの永続的な保存は、DBMS がそれをサポートしていない限り実際には起り得ません。 このためサポートには制限がありますが、Java オブジェクトをデータ型として認識する新世代の DBMS が出現しつつあります。 Java リレーショナル DBMS と呼ばれるこれらの DBMS では、Java クラスのインスタンスをデータベーステーブル内の列の値として保存できます。