目次 | 前の項目 | 次の項目 JDBCTM ガイド: 入門


10 その他の新しい機能

この章では、JDBC 2.0 API で行われた新しい変更について説明します。

10.1     java.sql.ResultSet の変更

全精度の値を返す仕様の ResultSet.getBigDecimal() メソッドが追加されました。

10.2     java.sql.ResultSetMetaData の変更

ResultSetMetaData.getColumnType() メソッドからは、SQL 型の新しいコードの STRUCTDISTINCTBLOB などが返されるようになっています。使われているマッピングがデフォルトかカスタムかにかかわらず、構造化された値には STRUCT 型のコードが、重複を取り除いた値には DISTINCT 型のコードが、必ず返されます。

新しい SQL 型に対し、ResultSetMetaData.getColumnTypeName() メソッドからは次の値が返されます。

列の型 列の型の名前
JAVA_OBJECT Java 型の SQL 名
DISTINCT 弁別型の SQL 名
STRUCT 構造化型の SQL 名
ARRAY データソースに依存する型の名前
BLOB データソースに依存する型の名前
CLOB データソースに依存する型の名前
REF データソースに依存する型の名前

ResultSet.getObject() を呼び出して列から値を取得する場合に、インスタンスが生成された Java クラスの絶対名を返すため、ResultSetMetaData.getColumnClassName() メソッドが追加されました。詳細については、別途提供されている API ドキュメントを参照してください。

型コードが STRUCT、DISTINCT、または JAVA_OBJECT の場合、ResultSetMetaData.getColumnTypeName() メソッドからは SQL 型の完全な名前が返されます。

10.3     DatabaseMetaData の変更

DatabaseMetaData.getColumns() メソッドからは、BLOB や CLOB など、SQL3 の新しい型の DATA_TYPE 値が返されるようになります。このメソッドからは、10.2 項の一覧で示した SQL3 のデータ型と同じ名前が返されます。

メタデータオブジェクトを生成した Connection オブジェクトを返す DatabasemetaData.getConnection() メソッドが追加されました。

DatabasemetaData.getUDTs() メソッドが追加されました。詳細については、別途提供されている API ドキュメントを参照してください。

supportsResultSetConcurrency()supportsBatchUpdates() など、新しい ResultSet とバッチ更新機能をサポートするメソッドが追加されました。詳細については、別途提供されている API ドキュメントを参照してください。

10.4     java.sql.DriverManager の変更

java.io.PrintWriter オブジェクトを入力として受け取る DriverManager.setLogWriter() メソッドが追加されました。また、新しい DriverManager.getLogWriter() メソッドは PrintWriter オブジェクトを返します。setLogStream() メソッドと getLogStream() メソッドは推奨されなくなりました。

10.5     Date、Time、および Timestamp

Java プラットフォームでは、グリニッジ標準時の 1970 年 1 月 1 日 00:00:00 を基準とするミリ秒単位の値で日付と時刻を表す方式が使われていますが、JDBC の API もこの方法に従っています。ほとんどのデータベースはタイムゾーンの概念をサポートしていないので、JDBC 2.0 の API には、JDBC ドライバのために新しいメソッドが追加されています。このメソッドを使うと、Calendar を利用して、特定のタイムゾーンに対する DateTime、および Timestamp の値を取得または設定できます。次はその例です。

ResultSet rs;
...
Date date1 = rs.getDate(1);

このメソッドからは Date オブジェクトが返されますが、このオブジェクトは、デフォルトのタイムゾーンでの特定の日付 (1999 年 1 月 3 日など) と正規化された時刻 00:00:00 を表すミリ秒単位の値をラップしています。SQL の DATE 型の値には時刻の要素がないので、Date オブジェクトの時刻要素にはデフォルトのタイムゾーンでの 0 が設定されます。getDate() に対して Calendar が明示的に指定されなかったため、背後のデータベースにはタイムゾーンの情報が格納されていないと見なされて、JDBC ドライバの内部では、デフォルトのタイムゾーン (実際にはデフォルトの Calendar) を使って適切なミリ秒の値が作成されます。

次の例では、グリニッジ標準時 (GMT) で表した日付を取得しています。

ResultSet rs;
...

TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
Calendar cal = Calendar.getInstance();
Date date2 = rs.getDate(1, cal);

上の例では、CalendargetDate() メソッドに明示的に渡し、適切なミリ秒の値を計算する方法を JDBC ドライバに通知しています。デフォルトのタイムゾーンを変更し、JDBC ドライバに Calendar を明示的に渡さないようにしても、同じ結果を得ることができます。タイムゾーンを指定しないと、JDBC ドライバはデフォルトのタイムゾーンを使います。

上の例で作成される 2 つの Date オブジェクトが「同じ」日付を示す場合でも、デフォルトのタイムゾーンが GMT でないとすると、2 つのオブジェクトは等しくなりません。

if (date1.equals(date2))
	//never get here

これは、Java 言語の Date オブジェクトのそれぞれは、実際には正規化されたミリ秒単位の時刻の値をラップしているだけで、この値はタイムゾーンによって異なります。アプリケーションで異なるタイムゾーンの日付を比較する場合は、Calendar に変換してから行う必要があります。

アプリケーションでは、Calendar を使って Date オブジェクトを作成する必要があります。Calendar を使うときは、目的の日付の時刻として 00:00:00 を指定しなければなりません。これは、JDBC がこのような規則を使っているためです。さらに、Time の値を作成するときは、Time のミリ秒値を作成するために使う Calendar に、1970 年 1 月 1 日という日付を指定する必要があります。JDBC では時刻に対してこのような規則が指定されているためです。



目次 | 前の項目 | 次の項目
jdbc@eng.sun.com または jdbc-business@eng.sun.com
Copyright © 1996, 1997 Sun Microsystems, Inc. All rights reserved.