16.3.3 追加されたデータ型
JDBC2.0基本規格では,幾つかの新たなJDBC SQLタイプが追加されました。追加されたJDBC SQLタイプを次に示します。
-
BLOB
-
CLOB
-
ARRAY
-
REF
-
DISTINCT
-
STRUCT
-
JAVA OBJECT
ただし,JDBCドライバではARRAY以外のJDBC SQLタイプは使用できません。
(1) 検索データ取得時のデータマッピング
ResultSetクラス及びCallableStatementクラスのgetXXXメソッドと各JDBC SQLタイプとのマッピングを次の表に示します。
マッピングできないJDBC SQLタイプに対してgetXXXメソッドが呼び出された場合,SQLExceptionを投入します。接続DBがどのJDBC SQLタイプを使用できるかについては「データ型,文字コード」を参照してください。
なお,getUnicodeStreamメソッドがJDBC2.0基本規格で推奨されないメソッドとなったため,代わりにgetCharacterStreamが追加されました。
getXXXメソッド |
JDBC SQLタイプ |
|||||
---|---|---|---|---|---|---|
SMALLINT |
INTEGER |
FLOAT |
REAL |
DECIMAL |
CHAR |
|
getByte |
○ |
○ |
○ |
○ |
○ |
○※2 |
getShort |
◎ |
○ |
○ |
○ |
○ |
○※2 |
getInt |
○ |
◎ |
○ |
○ |
○ |
○※2 |
getLong |
○ |
○ |
○ |
○ |
○ |
○※2 |
getFloat |
○ |
○ |
○ |
◎ |
○ |
○※2 |
getDouble |
○ |
○ |
◎ |
○ |
○ |
○※2 |
getBigDecimal |
○ |
○ |
○ |
○ |
◎ |
○※2 |
getBoolean |
○ |
○ |
○ |
○ |
○ |
○ |
getString |
○ |
○ |
○ |
○ |
○ |
◎ |
getBytes |
× |
× |
× |
× |
× |
× |
getDate |
× |
× |
× |
× |
× |
○※2 |
getTime |
× |
× |
× |
× |
× |
○※2 |
getTimestamp |
× |
× |
× |
× |
× |
○※2 |
getAsciiStream |
× |
× |
× |
× |
× |
○ |
getUnicodeStream |
× |
× |
× |
× |
× |
○ |
getBinaryStream |
× |
× |
× |
× |
× |
× |
getObject |
○ |
○ |
○ |
○ |
○ |
○ |
getCharacterStream |
× |
× |
× |
× |
× |
○ |
getArray |
× |
× |
× |
× |
× |
× |
getBlob |
× |
× |
× |
× |
× |
× |
getClob※1 |
× |
× |
× |
× |
× |
× |
getRef※1 |
× |
× |
× |
× |
× |
× |
- (凡例)
-
◎:マッピングすることを推奨します。
○:マッピングできます。
×:マッピングできません。
- 注※1
-
JDBCドライバでは使用できません。
- 注※2
-
文字列データからのデータ変換で,データベースから取得した文字列データの前後に半角スペースが存在する場合は,半角スペースを取り除いた後,getXXXメソッドが返却するJavaのデータ型に変換します。
Javaのデータ型に変換する場合の注意事項を次に示します。
-
文字列データに小数点以下の表現がある場合,getByte,getInt,getShort,又はgetLongのどれかのメソッドを実行すると,小数点以下を切り捨てて整数だけを変換し,返却します。
-
文字列データに全角文字が含まれている場合は,SQLExceptionを投入します。全角文字には,NCHAR型の列に列の定義長よりも短い文字列を格納している場合に補完する全角スペースも含みます。
-
文字列データをJavaのデータ型に変換した結果,オーバフローが発生する場合は,SQLExceptionを投入します。
-
UAPの実行環境がJDK又はJRE 1.2で,文字列データが指数の表記法(1.23E-23など)の場合,getLongメソッド,又はgetBigDecimalメソッドのどちらかを実行すると,SQLExceptionを投入します。
-
getXXXメソッド |
JDBC SQLタイプ |
|||||
---|---|---|---|---|---|---|
VARCHAR |
DATE |
TIME |
TIMESTAMP |
LONGVARBINARY |
ARRAY |
|
getByte |
○※2 |
× |
× |
× |
× |
× |
getShort |
○※2 |
× |
× |
× |
× |
× |
getInt |
○※2 |
× |
× |
× |
× |
× |
getLong |
○※2 |
× |
× |
× |
× |
× |
getFloat |
○※2 |
× |
× |
× |
× |
× |
getDouble |
○※2 |
× |
× |
× |
× |
× |
getBigDecimal |
○※2 |
× |
× |
× |
× |
× |
getBoolean |
○ |
× |
× |
× |
× |
× |
getString |
◎ |
○ |
○ |
○ |
○ |
× |
getBytes |
× |
× |
× |
× |
○ |
× |
getDate |
○※2 |
◎※3 |
× |
○ |
× |
× |
getTime |
○※2 |
× |
◎ |
○ |
× |
× |
getTimestamp |
○※2 |
○ |
× |
◎ |
× |
× |
getAsciiStream |
○ |
× |
× |
× |
○ |
× |
getUnicodeStream |
○ |
× |
× |
× |
○ |
× |
getBinaryStream |
× |
× |
× |
× |
◎ |
× |
getObject |
○ |
○ |
○ |
○ |
○ |
○ |
getCharacterStream |
○ |
× |
× |
× |
○ |
× |
getArray |
× |
× |
× |
× |
× |
◎ |
getBlob |
× |
× |
× |
× |
○ |
× |
getClob※1 |
× |
× |
× |
× |
× |
× |
getRef※1 |
× |
× |
× |
× |
× |
× |
- (凡例)
-
◎:マッピングすることを推奨します。
○:マッピングできます。
×:マッピングできません。
- 注※1
-
JDBCドライバでは使用できません。
- 注※2
-
文字列データからのデータ変換で,データベースから取得した文字列データの前後に半角スペースがある場合は,半角スペースを取り除いた後,getXXXメソッドが返却するJavaのデータ型に変換します。
Javaのデータ型に変換する場合の注意事項を次に示します。
-
文字列データに小数点以下の表現がある場合,getByte,getInt,getShort,又はgetLongのどれかのメソッドを実行すると,小数点以下を切り捨てて整数だけを変換し,返却します。
-
文字列データに全角文字が含まれている場合は,SQLExceptionを投入します。全角文字には,NCHAR型の列に列の定義長よりも短い文字列を格納している場合に補完する全角スペースも含みます。
-
文字列データをJavaのデータ型に変換した結果,オーバフローが発生する場合は,SQLExceptionを投入します。
-
UAPの実行環境がJDK又はJRE 1.2で,文字列データが指数の表記法(1.23E-23など)の場合,getLongメソッド,又はgetBigDecimalメソッドのどちらかを実行すると,SQLExceptionを投入します。
-
- 注※3
-
JDBC SQLタイプがDATE型の場合,setDateメソッドにjava.util.Calendarオブジェクトを指定して実行すると,指定したjava.util.Calendarオブジェクトを使用してデータを変換し,時刻データを切り捨てて日付データだけをデータベースに格納します。このとき,時刻データを切り捨てるため,getDateメソッドにjava.util.Calendarオブジェクトを指定して,setDateメソッドで格納したデータを取得しても,setDateメソッドに指定した日付と異なる日付を取得する場合があります。
- (例)
-
日本標準時をデフォルトのタイムゾーンとするUAPで,setDateメソッド,及びgetDateメソッドに世界標準時のタイムゾーンを持つjava.util.Calendarオブジェクトを指定した場合の例を次に示します。
setDateメソッドに「2005-10-03」を表すjava.sql.Dateオブジェクトを指定して実行した場合,JDBCドライバは時刻部分に「00:00:00」を補完した後,タイムゾーンの違いによって9時間遅らせて「2005-10-02 15:00:00」とし,日付部分「2005-10-02」をデータベースに格納します。このデータをgetDateメソッドで取得した場合,データベースから日付部分「2005-10-02」を取得し,時刻部分に「00:00:00」を補完した後,タイムゾーンの違いによって9時間進めて「2005-10-02 09:00:00」とします。これによって,getDateメソッドの戻り値のjava.sql.Dateオブジェクトには,「2005-10-02」が設定されるため,setDateメソッドに指定した「2005-10-03」とは異なります。
(2) ?パラメタ設定時のデータマッピング
PreparedStatementクラス及びCallableStatementクラスのsetXXXメソッドと,マッピングされるJDBC SQLタイプを次の表に示します。使用できないJDBC SQLタイプの場合,setXXXメソッドはSQLExceptionを投入します。接続DBがどのJDBC SQLタイプを使用できるかについては「データ型,文字コード」を参照してください。
なお,setUnicodeStreamメソッドがJDBC2.0基本規格で推奨されないメソッドとなったため,代わりにsetCharacterStreamが追加されました。
PreparedStatementクラスのsetXXXメソッド |
マッピングされるJDBC SQLタイプ |
---|---|
setCharacterStream |
CHAR,VARCHAR,又はLONGVARCHAR |
setRef※ |
REF |
setBlob |
LONGVARBINARY |
setClob※ |
CLOB |
setArray |
ARRAY |
- 注※
-
JDBCドライバでは使用できません。
PreparedStatementクラス及びCallableStatementクラスのsetXXXメソッドと各JDBC SQLタイプとのマッピングを次の表に示します。
setXXXメソッド |
JDBC SQLタイプ |
|||||
---|---|---|---|---|---|---|
SMALLINT |
INTEGER |
FLOAT |
REAL |
DECIMAL |
CHAR |
|
setByte |
○ |
○ |
○ |
○ |
○ |
○ |
setShort |
◎ |
○ |
○ |
○ |
○ |
○ |
setInt |
○ |
◎ |
○ |
○ |
○ |
○ |
setLong |
○ |
○ |
○ |
○ |
○ |
○ |
setFloat |
○ |
○ |
○ |
◎ |
○ |
○ |
setDouble |
○ |
○ |
◎ |
○ |
○ |
○ |
setBigDecimal |
○ |
○ |
○ |
○ |
◎ |
○ |
setBoolean |
○ |
○ |
○ |
○ |
○ |
○ |
setString |
○ |
○ |
○ |
○ |
○ |
◎ |
setBytes |
× |
× |
× |
× |
× |
× |
setDate |
× |
× |
× |
× |
× |
○ |
setTime |
× |
× |
× |
× |
× |
○ |
setTimestamp |
× |
× |
× |
× |
× |
○ |
setAsciiStream |
× |
× |
× |
× |
× |
○ |
setUnicodeStream |
× |
× |
× |
× |
× |
○ |
setBinaryStream |
× |
× |
× |
× |
× |
× |
setObject |
○ |
○ |
○ |
○ |
○ |
○ |
setCharacterStream |
× |
× |
× |
× |
× |
○ |
setArray |
× |
× |
× |
× |
× |
× |
setBlob |
× |
× |
× |
× |
× |
× |
setClob※ |
× |
× |
× |
× |
× |
× |
setRef※ |
× |
× |
× |
× |
× |
× |
- (凡例)
-
◎:マッピングすることを推奨します。
○:マッピングできます。なお,変換元データの形式によっては,データの欠落や変換エラーとなることがあるため,注意してください。
×:マッピングできません。
- 注※
-
JDBCドライバでは使用できません。
表16‒10 PreparedStatementクラス及びCallableStatementのsetXXXメソッドと各JDBC SQLタイプとのマッピング(2/2) setXXXメソッド
JDBC SQLタイプ
VARCHAR
DATE
TIME
TIMESTAMP
LONGVARBINARY
ARRAY
setByte
○
×
×
×
×
×
setShort
○
×
×
×
×
×
setInt
○
×
×
×
×
×
setLong
○
×
×
×
×
×
setFloat
○
×
×
×
×
×
setDouble
○
×
×
×
×
×
setBigDecimal
○
×
×
×
×
×
setBoolean
○
×
×
×
×
×
setString
◎
○
○
○
○
×
setBytes
×
×
×
×
○
×
setDate
○
◎※2
×
○
×
×
setTime
○
×
◎
○
×
×
setTimestamp
○
○
×
◎
×
×
setAsciiStream
○
×
×
×
○
×
setUnicodeStream
○
×
×
×
○
×
setBinaryStream
×
×
×
×
◎
×
setObject
○
○
○
○
○
○
setCharacterStream
○
×
×
×
○
×
setArray
×
×
×
×
×
◎
setBlob
×
×
×
×
○
×
setClob※1
×
×
×
×
×
×
setRef※1
×
×
×
×
×
×
- (凡例)
-
◎:マッピングすることを推奨します。
○:マッピングできます。なお,変換元データの形式によっては,データの欠落や変換エラーとなることがあるため,注意してください。
×:マッピングできません。
- 注※1
-
JDBCドライバでは使用できません。
- 注※2
-
JDBC SQLタイプがDATE型の場合,setDateメソッドにjava.util.Calendarオブジェクトを指定して実行すると,指定したjava.util.Calendarオブジェクトを使用してデータを変換し,時刻データを切り捨てて日付データだけをデータベースに格納します。このとき,時刻データを切り捨てるため,getDateメソッドにjava.util.Calendarオブジェクトを指定して,setDateメソッドで格納したデータを取得しても,setDateメソッドに指定した日付と異なる日付を取得する場合があります。
- (例)
-
日本標準時をデフォルトのタイムゾーンとするUAPで,setDateメソッド,及びgetDateメソッドに世界標準時のタイムゾーンを持つjava.util.Calendarオブジェクトを指定した場合の例を次に示します。
setDateメソッドに「2005-10-03」を表すjava.sql.Dateオブジェクトを指定して実行した場合,JDBCドライバは時刻部分に「00:00:00」を補完した後,タイムゾーンの違いによって9時間遅らせて「2005-10-02 15:00:00」とし,日付部分「2005-10-02」をデータベースに格納します。このデータをgetDateメソッドで取得した場合,データベースから日付部分「2005-10-02」を取得し,時刻部分に「00:00:00」を補完した後,タイムゾーンの違いによって9時間進めて「2005-10-02 09:00:00」とします。これによって,getDateメソッドの戻り値のjava.sql.Dateオブジェクトには,「2005-10-02」が設定されるため,setDateメソッドに指定した「2005-10-03」とは異なります。