14 ダイナミックデータベースアクセス
JDBC のプログラミングでは、通常、ターゲットデータベースの構造はすでにわかっています。したがって第 7 章で説明されているように、データアクセスには、強く型付けされた JDBC インタフェースを使うことができます。ただし、非常に重要なデータベースアクセスのクラスがもう 1 つあります。このクラスでは、アプリケーション (つまりアプリケーションの開発者) は、データベースの形式についての情報を動的に調査し、その情報を使って適切なダイナミックデータアクセスを行います。ここでは、JDBC がサポートするダイナミックアクセスについて説明します。
14.1 メタデータ情報
JDBC では、結果の行、文のパラメータ、データベースのプロパティなどについてのさまざまなメタデータにアクセスできます。当初、メタデータへのアクセスは、java.sql.Connection や java.sql.ResultSet など JDBC のコアクラスに属する専用のメソッドを使って行うようになっていました。しかし、メタデータメソッドが複雑であることと、少数の JDBC プログラマだけしかこのメソッドを使わないことから、メタデータメソッドを 2 つの独立した Java インタフェースに分けることにしました。
一般に、1 つのメタデータ情報ごとに、必要な引数を受け取って適切な Java 型の結果を返す専用の JDBC メソッドが用意されています。ただし、Connection.getProcedures() のようにメソッドから複数の値が返される場合は、java.sql.ResultSet を使って結果が格納されます。アプリケーションでは、通常の ResultSet メソッドを使って、結果に対する繰り返し処理を行えます。
メタデータを参照した結果の集合を取得するために列挙型を定義することも検討されましたが、実質をほとんど伴わない負担をインタフェースに加えるものであるという結論になりました。JDBC のプログラマは ResultSet の使用にはすでに慣れていると考えられるので、メタデータの取得結果に ResultSet を使うこともそれほどの負荷にはならないはずです。
メタデータメソッドの多くは、引数として String 型の検索パターンを受け取ります。検索パターンの形式は ODBC の場合と同じです。「_」は任意の 1 文字との一致を表し、「%」は 0 個以上の文字との一致を表します。カタログとスキーマの値については、空の文字列は「名前なし」の値との一致を意味し、NULL String はその検索条件の無視を意味します。
java.sql.ResultSetMetaData 型では、特定の java.sql.ResultSet オブジェクトの列の型とプロパティを調べるためのメソッドが数多く提供されています。
java.sql.DatabaseMetaData インタフェースでは、データベースに関するさまざまなメタデータを取得するメソッドが提供されています。データベースのストアドプロシージャ、データベースのテーブル、データベースのスキーマ、有効なテーブルの型、有効なカタログなどを列挙するメソッド、テーブルの列の情報、列のアクセス権、テーブルのアクセス権、最小の行 ID などを検索するメソッドが含まれています。
14.2 動的な型指定によるデータアクセス
第 8 章では、SQL のデータ型と Java のデータ型の間の標準的なマッピングについて説明しました。たとば、SQL の INTEGER 型は、通常、Java の int 型にマッピングされます。これにより、SQL の値 Java の単純なデータ型として読み書きできる簡単なインタフェースがサポートされます。
一方で、汎用的なデータアクセスをサポートするため、一般的な Java オブジェクトとしてデータを取得できるメソッドも提供されています。つまり、ResultSet.getObject メソッド、PreparedStatement.setObject メソッド、および CallableStatement.getObject メソッドです。2 種類の getObject メソッドのいずれの場合も、値を取り出す前に、結果の java.lang.Object を特定のデータ型にナロー変換する必要があります。
boolean や int など Java の組み込み型は Object のサブタイプではないので、getObject メソッドや setObject メソッドの場合は、SQL 型と Java のオブジェクト型のマッピングが少し異なります。表 4 にこのマッピングを示します。
表 4: SQL 型から Java オブジェクト型へのマッピング
SQL 型
| Java オブジェクト型
|
---|
CHAR
| String
|
VARCHAR
| String
|
LONGVARCHAR
| String
|
NUMERIC
| java.math.BigDecimal
|
DECIMAL
| java.math.BigDecimal
|
BIT
| Boolean
|
TINYINT
| Integer
|
SMALLINT
| Integer
|
INTEGER
| Integer
|
BIGINT
| Long
|
REAL
| Float
|
FLOAT
| Double
|
DOUBLE
| Double
|
BINARY
| byte[]
|
VARBINARY
| byte[]
|
LONGVARBINARY
| byte[]
|
DATE
| java.sql.Date
|
TIME
| java.sql.Time
|
TIMESTAMP
| java.sql.Timestamp
|
Java オブジェクト型から SQL 型へのデフォルトのマッピングを、表 5 に示します。
表 5: Java オブジェクト型から SQL 型へのマッピング
通常、String は VARCHAR にマッピングされますが、ドライバが対応する VARCHAR の値の範囲を超える値の場合は、LONGVARCHAR にマッピングされます。byte[] から VARBINARY と LONGVARBINARY へのマッピングについても同様です。
Java オブジェクト型
| SQL 型
|
---|
String
| VARCHAR または LONGVARCHAR
|
java.math.BigDecimal
| NUMERIC
|
Boolean
| BIT
|
Integer
| INTEGER
|
Long
| BIGINT
|
Float
| REAL
|
Double
| DOUBLE
|
byte[]
| VARBINARY または LONGVARBINARY
|
java.sql.Date
| DATE
|
java.sql.Time
| TIME
|
java.sql.Timestamp
| TIMESTAMP
|
getObject メソッドまたは setObject メソッドを使って、Java の入力ストリームの送受信を行うことはできません。ストリームとして値を送信するには、PreparedStatement.setXXXStream または ResultSet.getXXXStream を明示的に使う必要があります。
14.2.1 ResultSet.getObject
ResultSet.getObject メソッドからは、表 4 のマッピング規則に従って、ResultSet の列の SQL 型に対応する型の Java オブジェクトが返されます。
したがって、たとえば、ResultSet の a 列が SQL の CHAR 型で、b 列が SQL の SMALLINT 型の場合、getObject メソッドの呼び出しから返される型は次のようになります。
ResultSet rs = stmt.executeQuery("SELECT a, b FROM foo");
while (rs.next()) {
Object x = rs.getObject("a");
// gets a String
Object y = rs.getObject("b");
// gets an Integer
}
14.2.2 PreparedStatement.setObject
PreparedStatement.setObject メソッドの場合、必要に応じて最終的な SQL 型を指定できます。この場合、引数の Java オブジェクトはまずデフォルトの SQL 型に変換されて (表 5 を参照)、次に指定された SQL 型に変換されてから (表 6 を参照)、データベースに送信されます。
最終的な SQL 型の指定を省略することもできます。その場合、指定した Java オブジェクトは単にデフォルトの SQL 型に変換されただけで (表 5 を参照)、データベースに送信されます。
14.2.3 CallableStatement.getObject
CallableStatement.getObject メソッドを呼び出す場合は、その前に、CallableStatement.registerOutParameter メソッドを呼び出してパラメータの SQL 型を指定する必要があります。CallableStatement.getObject メソッドを呼び出すと、表 4 のマッピングに従って SQL 型から変換された Java オブジェクト型が、ドライバから返されます。
目次 | 前の項目 | 次の項目
jdbc@wombat.eng.sun.com
または
jdbc-odbc@wombat.eng.sun.com
Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved.