JDBC-データ型
JDBCドライバーは、Javaデータ型をデータベースに送信する前に、適切なJDBC型に変換します。ほとんどのデータ型にデフォルトのマッピングを使用します。たとえば、JavaintはSQLINTEGERに変換されます。デフォルトのマッピングは、ドライバー間の一貫性を提供するために作成されました。
次の表は、PreparedStatementまたはCallableStatementオブジェクトのsetXXX()メソッドまたはResultSet.updateXXX()メソッドを呼び出すときに、Javaデータ型が変換されるデフォルトのJDBCデータ型をまとめたものです。
SQL | JDBC / Java | setXXX | updateXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | updateString |
CHAR | java.lang.String | setString | updateString |
LONGVARCHAR | java.lang.String | setString | updateString |
ビット | ブール値 | setBoolean | updateBoolean |
数値 | java.math.BigDecimal | setBigDecimal | updateBigDecimal |
TINYINT | バイト | setByte | updateByte |
SMALLINT | ショート | setShort | updateShort |
整数 | int | setInt | updateInt |
BIGINT | 長いです | setLong | updateLong |
リアル | 浮く | setFloat | updateFloat |
浮く | 浮く | setFloat | updateFloat |
ダブル | ダブル | setDouble | updateDouble |
VARBINARY | バイト[] | setBytes | updateBytes |
バイナリ | バイト[] | setBytes | updateBytes |
日付 | java.sql.Date | setDate | 更新日 |
時間 | java.sql.Time | setTime | updateTime |
タイムスタンプ | java.sql.Timestamp | setTimestamp | updateTimestamp |
CLOB | java.sql.Clob | setClob | updateClob |
BLOB | java.sql.Blob | setBlob | updateBlob |
アレイ | java.sql.Array | setARRAY | updateARRAY |
REF | java.sql.Ref | SetRef | updateRef |
構造体 | java.sql.Struct | SetStruct | updateStruct |
JDBC 3.0では、BLOB、CLOB、ARRAY、およびREFデータ型のサポートが強化されています。ResultSetオブジェクトにupdateBLOB()、updateCLOB()、updateArray()、およびupdateRef()メソッドが追加され、サーバー上のそれぞれのデータを直接操作できるようになりました。
setXXX()メソッドとupdateXXX()メソッドを使用すると、特定のJavaタイプを特定のJDBCデータタイプに変換できます。メソッドsetObject()およびupdateObject()を使用すると、ほとんどすべてのJavaタイプをJDBCデータ型にマップできます。
ResultSetオブジェクトは、列値を取得するために、各データ型に対応するgetXXX()メソッドを提供します。各メソッドは、列名またはその序数位置で使用できます。
SQL | JDBC / Java | setXXX | getXXX |
---|---|---|---|
VARCHAR | java.lang.String | setString | getString |
CHAR | java.lang.String | setString | getString |
LONGVARCHAR | java.lang.String | setString | getString |
ビット | ブール値 | setBoolean | getBoolean |
数値 | java.math.BigDecimal | setBigDecimal | getBigDecimal |
TINYINT | バイト | setByte | getByte |
SMALLINT | ショート | setShort | getShort |
整数 | int | setInt | getInt |
BIGINT | 長いです | setLong | getLong |
リアル | 浮く | setFloat | getFloat |
浮く | 浮く | setFloat | getFloat |
ダブル | ダブル | setDouble | getDouble |
VARBINARY | バイト[] | setBytes | getBytes |
バイナリ | バイト[] | setBytes | getBytes |
日付 | java.sql.Date | setDate | getDate |
時間 | java.sql.Time | setTime | 時間をもらう |
タイムスタンプ | java.sql.Timestamp | setTimestamp | getTimestamp |
CLOB | java.sql.Clob | setClob | getClob |
BLOB | java.sql.Blob | setBlob | getBlob |
アレイ | java.sql.Array | setARRAY | getARRAY |
REF | java.sql.Ref | SetRef | getRef |
構造体 | java.sql.Struct | SetStruct | getStruct |
日付と時刻のデータ型
java.sql.DateクラスはSQLDATE型にマップされ、java.sql.Timeクラスとjava.sql.TimestampクラスはそれぞれSQLTIMEデータ型とSQLTIMESTAMPデータ型にマップされます。
次の例は、DateクラスとTimeクラスがSQLデータ型の要件に一致するように標準のJava日付と時刻の値をフォーマットする方法を示しています。
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.*;
public class SqlDateTime {
public static void main(String[] args) {
//Get standard date and time
java.util.Date javaDate = new java.util.Date();
long javaTime = javaDate.getTime();
System.out.println("The Java Date is:" +
javaDate.toString());
//Get and display SQL DATE
java.sql.Date sqlDate = new java.sql.Date(javaTime);
System.out.println("The SQL DATE is: " +
sqlDate.toString());
//Get and display SQL TIME
java.sql.Time sqlTime = new java.sql.Time(javaTime);
System.out.println("The SQL TIME is: " +
sqlTime.toString());
//Get and display SQL TIMESTAMP
java.sql.Timestamp sqlTimestamp =
new java.sql.Timestamp(javaTime);
System.out.println("The SQL TIMESTAMP is: " +
sqlTimestamp.toString());
}//end main
}//end SqlDateTime
ここで、上記の例を次のようにコンパイルしましょう-
C:\>javac SqlDateTime.java
C:\>
あなたが走るとき JDBCExample、次の結果が得られます-
C:\>java SqlDateTime
The Java Date is:Tue Aug 18 13:46:02 GMT+04:00 2009
The SQL DATE is: 2009-08-18
The SQL TIME is: 13:46:02
The SQL TIMESTAMP is: 2009-08-18 13:46:02.828
C:\>
NULL値の処理
SQLでのNULL値の使用とJavaでのnullの使用は異なる概念です。したがって、JavaでSQL NULL値を処理するには、次の3つの戦術を使用できます。
プリミティブデータ型を返すgetXXX()メソッドの使用は避けてください。
プリミティブデータ型にラッパークラスを使用し、ResultSetオブジェクトのwasNull()メソッドを使用して、getXXX()メソッドによって返される値を受け取ったラッパークラス変数をnullに設定する必要があるかどうかをテストします。
プリミティブデータ型とResultSetオブジェクトのwasNull()メソッドを使用して、getXXX()メソッドによって返される値を受け取ったプリミティブ変数を、NULLを表すために選択した許容値に設定する必要があるかどうかをテストします。
NULL値を処理する1つの例を次に示します-
Statement stmt = conn.createStatement( );
String sql = "SELECT id, first, last, age FROM Employees";
ResultSet rs = stmt.executeQuery(sql);
int id = rs.getInt(1);
if( rs.wasNull( ) ) {
id = 0;
}