注: この章の内容は、Addison Wesley 社より Java シリーズの 1 巻として出版された『JDBCTM API Tutorial and Reference, Second Edition: Universal Data Access for the JavaTM 2 Platform』(ISBN 0-201-43328-1) に基づいて作成したものです。
JDBCTM API は、JavaTM プログラミング言語のための一般的なデータアクセスを提供するアプリケーションプログラミングインタフェースです。データアクセスの基本的な機能を提供する JDBC 1.0 API を含んでいます。JDBC 2.0 API は、より進歩した技術で基本 API を補います。 また、今日のリレーショナルデータベース管理システムによってサポートされている、最新のオブジェクトリレーショナル機能にアクセスする標準的な方法を提供します。さらに、この新しい API には、スクロールおよび更新が可能な結果セットの機能が追加され、パフォーマンスの向上が加えられています。また、JDBC 技術をクライアントだけでなくサーバにも適用できるように、接続プールおよび分散トランザクションの機能が追加されました。
JDBC 2.0 API には、J2SE の一部である API のすべてと、JDBC 標準拡張機能 API に含まれる API が含まれます。次の一覧では、JDBC API の説明に使用されるさまざまな用語について定義します。
java.sql
パッケージ (JDBC 2.0 コア API) および javax.sql
パッケージ (JDBC 標準拡張機能 API) を含んでいます。J2EE には完全な JDBC 2.0 API が含まれています。
java.sql
(J2SE に含まれる JDBC API)。このパッケージには、JDBC 1.0 API に加え、java.sql
パッケージに新たに追加された JDBC API が含まれています。このパッケージには、スクロール可能な結果セット、バッチ更新、プログラムによる更新、SQL3 の新しいデータ型のサポートなどの新機能が追加されています。
javax.sql
パッケージ。 http://java.sun.com/products/jdbc
からダウンロードできます。このパッケージは、接続プーリングおよび複数データベースサーバにまたがる分散トランザクションをサポートするオープンアーキテクチャの提供により、Java プラットフォームを使用したサーバ側アプリケーションの構築を容易にします。DataSource
API はこれらの機能の中核であり、Java Naming and Directory InterfaceTM (JNDI) と連携することで、移植性を高め、コードの保守を容易にします。また、javax.sql
パッケージでは、RowSet
API も提供されます。 このパッケージを使用すると、ほとんどすべてのデータソースのデータセットを、JavaBeansTM コンポーネントとして簡単に操作できます。
java.sql
パッケージ - JDBC 2.0 コア API。 JDBC 1.0 API、および J2SE に追加された新しい API が含まれます。
javax.sql
パッケージ - JDBC 標準拡張機能 API。
下位互換性が確保されているため、JDBC 1.0 API を使用して作成されたアプリケーションは、これまでと同様に、J2SE、および J2EE 上で実行することができます。JDBC 1.0 API は、最初から設計が優れていたため、基本的には変更されていません。ただし、JDBC 2.0 API に追加された機能を使用しているアプリケーションは、それらの機能がサポートされているドライバを使用して実行する必要があります。
コア API の一部である java.sql
パッケージは、J2SE のダウンロード時に自動的に取り込まれます。javax.sql
パッケージをドライバのベンダーがドライバにバンドルすることもあります。 ドライバにパッケージがバンドルされていない場合は、次の URL の JDBC の Web サイトからダウンロードできます。
http://java.sun.com/products/jdbc
また、javax.sql
パッケージは、J2EE をダウンロードして取得することもできます。J2EE には、java.sql
および javax.sql
パッケージが含まれています。Enterprise JavaBeanstm (EJB) のコンポーネントまたはその他のサーバコードを作成していない場合は、使用するディスク容量を制限するために、J2EE ではなく J2SE をダウンロードすることをお勧めします。
JDBC API は、ほとんどすべてのテーブル形式のデータにアクセスできる Java API です。(なお、JDBC は、略号ではなく商標ですが、「Java Database Connectivity」の略だと思われることがよくあります。) JDBC API は、Java プログラミング言語で記述されたクラスおよびインタフェースのセットで構成されます。 JDBC API によって、ツールおよびデータベース開発者のための標準 API が提供されるため、すべて Java で記述された API を使用して、業界で強力なデータベースアプリケーションを作成することができます。
JDBC API は、SQL 文をリレーショナルデータベースシステムに簡単に送信することができ、また、すべての SQL 構文をサポートしています。しかし、SQL 以外でも、テーブル形式のデータを含むファイルなど、その他の種類のデータソースと対話できます。
JDBC API の価値は、アプリケーションからほとんどすべてのデータソースにアクセスでき、Java Virtual Machine が稼動しているすべてのプラットフォーム上でアプリケーションを実行できることです。すなわち、JDBC API を使用すれば、Sybase データベース、Oracle データベース、IBM DB2 データベースなどにアクセスするためのプログラムを個別に作成する必要がありません。JDBC API を使用したプログラムを 1 つ作成しさえすれば、そのプログラムを使って SQL またはその他の文を適切なデータソースに送信できます。その上、Java プログラミング言語で書かれたアプリケーションを使用すると、異なるプラットフォームで実行する場合にも、異なるアプリケーションを作成を考慮する必要はありません。Java プラットフォームと JDBC API を組み合わせれば、プログラマは一度作成したプログラムを任意の場所で実行することができます。
Java プログラミング言語は、強固で安全、使いやすく理解しやすい上に、ネットワーク上で自動的にダウンロードできる、データベースアプリケーションのための非常に優れた基盤言語です。必要なのは、Java アプリケーションが異なる多様なデータソースとやり取りするための方法です。JDBC は、これを行うための機構です。
JDBC 2.0 API によって、Java プラットフォームの機能が拡張されます。たとえば、JDBC API では、リモートデータソースから取得した情報を使用するアプレットが含まれる Web ページを発行することができます。また、企業は JDBC API を使用して、社員全員をイントラネット経由で 1 つ以上の内部データベースに接続することができます (Windows、Macintosh、および UNIX マシンが混在している場合でも同様)。Java 言語を使用するプログラマが増加するにつれて、Java から汎用性のあるデータアクセスを容易に行う必要が増え続けています。
Java プラットフォームと JDBC テクノロジを組み合わせると、情報の配布が容易かつ経済的になるので、MIS マネージャは Java と JDBC テクノロジの組み合わせを好みます。企業は、自社でインストール済みのデータベースを引き続き使用しながら、異なるデータベース管理システムまたはその他のデータソースに格納されている場合でも、情報に容易にアクセスすることができます。新規アプリケーションの開発時間も短縮されます。インストールとバージョン管理は大幅に簡素化されます。プログラマがアプリケーションの作成や更新を一度だけ行なってサーバに置くだけで、誰もが最新バージョンにアクセスできるようになります。また、情報サービスを販売する企業にとって、Java と JDBC テクノロジの組み合わせは、外部のカスタマに最新情報を配布する、よりよい方法を提供します。
簡単にまとめると、JDBC テクノロジベースのドライバ (「JDBC ドライバ」) を使用して次の 3 つの操作を行うことができます。
Connection con = DriverManager.getConnection(}"jdbc:myDriver:wombat", "myLogin", "myPassword"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c");
JDBC API は、SQL コマンドを直接呼び出すときに使用します。その点で非常によく機能しているので、その他のデータベース接続 API よりも使いやすくなっていますが、さらに代替のインタフェースおよびツールを作成するための基礎となるようにも設計されています。代替のインタフェースは、内部で JDBC API へ変換される、よりわかりやすく便利な API を使用することによって「ユーザフレンドリ」になっています。JDBC API は基盤用として十分に完全かつ強力であるため、さまざまな種類の代替 API が、この JDBC API に基づいて開発されています。たとえば次の代替 API があります。
JDBC API が開発されるまでは、Microsoft の ODBC (Open DataBase Connectivity) API が、リレーショナルデータベースにアクセスするためにもっとも広く使用されていたプログラミングインタフェースでした。これは、ほとんどすべてのプラットフォームのほとんどすべてのデータベースに接続する能力を備えています。では、Java から直接 ODBC を使用しないのはなぜでしょうか。
それは、ODBC を Java から使用することは「可能」ですが、JDBC-ODBC ブリッジの形式で JDBC API を使用して行うのが最良の方法であるからです。そこで、次に出てくる質問は、「なぜ JDBC API が必要なのか」ということです。
Microsoft は、OLE (Object Linking and Embedding) DB、ADO (ActiveX Data Objects)、RDS (Remote Data Service) など、ODBC よりも優れた新しい API を導入しています。これらの API と JDBC API には、多くの共通点があります。たとえば、OLE DB および ADO も、データベース用のオブジェクト指向のインタフェースで、SQL 文を実行できます。ただし、OLE DB は、ツールのために設計された低レベルのインタフェースで、開発者向けではありません。ADO は、より新しいインタフェースで、JDBC API との共通点も多く存在しますが、Pure Java ではありません。RDS は、JDBC API の RowSet
機能に類似した機能を提供していますが、Java プログラミング言語で記述されておらず、移植性はありません。
最近、Microsoft は、OLE DB、ADO、RDS、および ODBC を包含する用語として、UDA (Universal Data Access) を導入しました。JDBC 2.0 API には、UDA の重要な機能がすべて含まれており、SQL3 サポートなどの UDA にはない機能が含まれています。
JDBC API は、データベースアクセスの 2 層モデルと 3 層モデルの両方をサポートします。
図 1.1: は、2 層アーキテクチャのデータアクセスを示します。
2 層モデルでは、Java のアプレットまたはアプリケーションはデータソースと直接やり取りします。これには、アクセスしている特定のデータソースとやり取りできる JDBC ドライバが必要です。ユーザのコマンドはデータベースまたはその他のデータソースに配信され、それらの文の結果がユーザに送り返されます。その際、データソースを、ネットワーク経由でユーザが接続しているほかのマシンに置くことも可能です。これは、クライアント/サーバ構成と呼ばれ、ユーザのマシンがクライアント、データソースを持つマシンがサーバと呼ばれます。ネットワークは、たとえば社内で社員同士をつなぐイントラネットでも、インターネットでもかまいません。
3 層モデルでは、コマンドがサービスの「中間層」に送信され、中間層がコマンドをデータソースに送信します。データソースは、コマンドを処理して結果を中間層に送り返し、中間層がそれをユーザに送ります。3 層モデルでは中間層が企業データに対して行えるアクセスおよび更新の種類について制御を維持することができるので、MIS の責任者はこのモデルを非常に魅力的だと考えています。また、アプリケーションの開発が簡単になります。最後に、多くの場合、3 層アーキテクチャの方がパフォーマンス上の利点があります。
図 1.2: は、3 層アーキテクチャのデータアクセスを示します。
最近まで、中間層は通常 C または C++ のような高速なパフォーマンスを提供する言語で作成されてきました。しかし、Java バイトコードを効率的なマシン固有コードに変換する最適化コンパイラ、および Enterprise JavaBeansTM などのテクノロジが導入されたため、Java プラットフォームが中間層の開発用の標準プラットフォームとして急速に普及しつつあります。これは、Java の堅牢さ、マルチスレッド処理、およびセキュリティ機能を利用できるという点で、大きな進歩です。
サーバコードを作成するときに Java プログラミング言語を使用する企業が増加しており、JDBC API が 3 層アーキテクチャの中間層で使用されることが多くなっています。JDBC をサーバテクノロジとして使えるのは、接続プール、分散トランザクション、切断行セットなどの機能がサポートされているからです。そして当然ながら、JDBC API を使用すれば、Java の中間層からデータソースにアクセスすることができます。
SQL は、リレーショナルデータベースにアクセスするための標準言語です。しかし、SQL はまだ当初予測された標準として扱われていません。
困難な一面は、異なる DBMS (DataBase Management System) で使用されるデータ型がときにはさまざまであり、その違いが重大になり得ることです。JDBC では、この問題に対して、java.sql.Types
クラス内で汎用的な SQL の型識別子のセットを定義することにより対処しています。本書で使用されるように、「JDBC SQL 型」、「JDBC 型」、および「SQL 型」は、すべて同じ意味で使われており、これらの用語は、java.sql.Types
で定義されている汎用的な SQL の型識別子を表しています。データ型の適合性の詳細については、「SQL と Java の型のマッピング」を参照してください。
SQL 適合性についてのもう 1 つの問題は、ほとんどの DBMS (データベース管理システム) では、基本機能については、標準形式の SQL を使用していますが、より高度な機能については、最近定義された標準 SQL 構文やセマンティクスに適合していない、という点です。たとえば、すべてのデータベースがストアドプロシージャや外部結合をサポートしているわけではなく、またサポートしているもの同士に互いに一貫性が保証されていません。また、SQL3 の機能およびデータ型のサポートも大きく異なります。SQL の真の標準的な部分が、より多くの機能を持つように拡張されることが望まれます。しかし、当分の間は、JDBC API が SQL をそのままサポートする必要があります。
JDBC API がこの問題に対処する方法の 1 つは、対象の DBMS ドライバにすべてのクエリー文字列をそのまま渡せるようにすることです。すなわち、アプリケーションは、望む限りの SQL 機能を自由に使用することができますが、DBMS からエラーを受け取る危険があります。実際、アプリケーションのクエリーは SQL 以外のものでもよく、特定の DBMS のために設計された SQL の特別な形式 (ドキュメントまたは画像クエリーなど) でもかまいません。
JDBC が SQL の適合性の問題に対処する 2 番目の方法は、ODBC スタイルのエスケープ句を使用することです。エスケープ構文は、標準の JDBC 構文に、より一般的に利用される SQL の拡張機能をいくつか提供します。たとえば、日付リテラルおよびストアドプロシージャ呼び出しのためのエスケープがあります。
複雑なアプリケーションでは、JDBC は 3 番目の方法で SQL の適合性に対処します。JDBC は、アプリケーションが各 DBMS の必要条件や機能に適合するように、DatabaseMetaData
インタフェースを使用して DBMS についての記述情報を提供します。ただし、標準的なエンドユーザは、メタデータについて心配する必要はありません。
JDBC API はデータベースアクセスツールおよびその他の API を開発するための基本 API として使用されるので、それらの適合性の問題にも言及する必要があります。JDBC ドライバは少なくとも、ANSI SQL-92 のエントリレベルをサポートしていなければなりません (ANSI SQL-92 は、1992 年に米国規格協会が採用した標準です。エントリレベルは、特定の SQL 機能)。ただし、JDBC 2.0 API では SQL3 および SQLJ がサポートされていますが、JDBC ドライバでのサポートは要求されません。
JDBC API は、データベースベンダー、接続ベンダー、インターネットサービスベンダー、およびアプリケーション作成者にますます広く受け入れられるようになったため、すでに Java プログラミング言語によるデータアクセスの標準になっています。
JDBC API を使用すると、Java のアプリケーションおよびアプレットからデータベースに対して簡単にアクセスできるため、JDBC API は Java プラットフォームを使用しているユーザにとって自然な選択となります。
このドキュメントが作成された時点では、いくつかの JDBC ベースの製品がすでに出荷済みまたは開発中です。これらの製品の状態は頻繁に変化するので、最新の情報については、JDBC の Web ページを参照してください。この Web サイトは次の URL にあります。
http://java.sun.com/products/jdbc
Java ソフトウェアは、以下の 3 つの JDBC 製品コンポーネントを提供しています。
DriverManager
クラスは伝統的に JDBC アーキテクチャのバックボーンとなっています。これは非常に小さくて簡単なクラスであり、 その主な機能は、Java アプリケーションを正しい JDBC ドライバに接続したあと、アプリケーションに制御を移すことです。標準拡張機能パッケージの javax.naming
および javax.sql
を使用できるため、Java Naming and Directory InterfaceTM (JNDI) ネームサービスに登録された DataSource
オブジェクトを使用してデータソースとの接続を確立できるようになりました。いずれの方法でも接続できますが、可能な場合には DataSource
オブジェクトの使用をお勧めします。
JDBC ドライバテストスイートにより、JDBC ドライバがユーザのプログラムを実行する際の信頼性がある程度得られます。このテストは、総合テストまたは詳細テストではありませんが、JDBC API の重要な機能の大部分をテストできます。
JDBC-ODBC ブリッジにより、ODBC ドライバを JDBC ドライバとして使用できます。このブリッジは、JDBC をすぐに使い始めるための方法として実装されましたが、長期的には、JDBC ドライバが実装されていないデータソースのいくつかにアクセスする方法としても使えます。
図 1.3: は、さまざまなドライバ実装の例です。
JDBC テクノロジベースのドライバは、一般に、次の 4 つのカテゴリのどれかにあたります。
ドライバのカテゴリ 3 と 4 は、JDBC API を使用してデータベースにアクセスするのに適しています。カテゴリ 1 と 2 のドライバは、直接 Pure Java ドライバがまだ使用可能でない間の過渡的なソリューションです。カテゴリ 1 と 2 には (以下のテーブルには示していない) ミドルウェアを必要とする種類のものが可能ですが、一般的には望ましいソリューションのレベルには到達していません。カテゴリ 3 と 4 が、自動インストールを始めとした、Java テクノロジのすべての利点を提供します (たとえば、JDBC ドライバを、それを使用するアプレットとともにダウンロードするなど)。
表 1.1 に、4 つのカテゴリとそのプロパティを示します。この表では、ネットワーク接続の種類について、次の定義を使用しています。
このドキュメントが作成された時点では、Java ソフトウェアのブリッジとともに使用できるカテゴリ 1 の ODBC ドライバが数多くあります。DBMS 用のネイティブ API の上に構築されているカテゴリ 2 のドライバは約 12 あります。カテゴリ 3 のドライバは、多数利用できます。 主要な DBMS には、カテゴリ 4 のドライバが存在します。
ドライバについての最新の情報を取得するには、次に示す JDBC の Web ページを参照してください。
http://java.sun.com/products/jdbc
Java ソフトウェアおよび主要なデータベース接続ベンダーである Intersolv は、協力して JDBC-ODBC ブリッジと JDBC ドライバのテストスイートの開発にあたっています。
Java リレーショナル DBMS と呼ばれる、Java 対応の次世代 DBMS が発表される予定です。この新しい DBMS には、新しいデータ型が組み込まれており、Java プログラミング言語のオブジェクトをデータベーステーブルの列の値として使用することができます。JDBC 2.0 の新機能では、この次世代の DBMS がサポートされています。 また、複数のデータベースベンダーが、Java リレーショナル機能を使用した製品を開発中です。ただし、この 2.0 の機構はオプションです。DBMS でこの機能がサポートされていない場合、JDBC 2.0 ドライバではこの機能を実装する必要はありません。
さまざまな JDBC アプリケーションの開発が進行中です。最新情報については、Java ソフトウェアのページを参照してください。