JDBC驱动程序在将Java数据类型发送到数据库之前,先将其转换为适当的JDBC类型。它对大多数数据类型使用默认映射。例如,将Java int转换为SQL INTEGER。创建了默认映射以提供驱动程序之间的一致性。
当调用 PreparedStatement 或 CallableStatement 对象的 setXXX ()方法或 ResultSet.updateXXX ()方法时,下表总结了 Java 数据类型转换为的默认 JDBC 数据类型。
| 的SQL | JDBC / Java | setXXX | 更新XXX | 
|---|---|---|---|
| VARCHAR | java.lang.String | setString | updateString | 
| CHAR | java.lang.String | setString | updateString | 
| LONGVARCHAR | java.lang.String | setString | updateString | 
| BIT | boolean | setBoolean | updateBoolean | 
| NUMERIC | java.math.BigDecimal | setBigDecimal | updateBigDecimal | 
| TINYINT | byte | setByte | updateByte | 
| SMALLINT | short | setShort | updateShort | 
| INTEGER | int | setInt | updateInt | 
| BIGINT | long | setLong | updateLong | 
| REAL | float | setFloat | updateFloat | 
| FLOAT | float | setFloat | updateFloat | 
| DOUBLE | double | setDouble | updateDouble | 
| VARBINARY | byte[ ] | setBytes | updateBytes | 
| BINARY | byte[ ] | setBytes | updateBytes | 
| DATE | java.sql.Date | setDate | updateDate | 
| TIME | java.sql.Time | setTime | updateTime | 
| TIMESTAMP | java.sql.Timestamp | setTimestamp | updateTimestamp | 
| CLOB | java.sql.Clob | setClob | updateClob | 
| BLOB | java.sql.Blob | setBlob | updateBlob | 
| ARRAY | java.sql.Array | setARRAY | updateARRAY | 
| REF | java.sql.Ref | SetRef | updateRef | 
| STRUCT | 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 | 
| BIT | boolean | setBoolean | getBoolean | 
| NUMERIC | java.math.BigDecimal | setBigDecimal | getBigDecimal | 
| TINYINT | byte | setByte | getByte | 
| SMALLINT | short | setShort | getShort | 
| INTEGER | int | setInt | getInt | 
| BIGINT | long | setLong | getLong | 
| REAL | float | setFloat | getFloat | 
| FLOAT | float | setFloat | getFloat | 
| DOUBLE | double | setDouble | getDouble | 
| VARBINARY | byte[ ] | setBytes | getBytes | 
| BINARY | byte[ ] | setBytes | getBytes | 
| DATE | java.sql.Date | setDate | getDate | 
| TIME | java.sql.Time | setTime | getTime | 
| TIMESTAMP | java.sql.Timestamp | setTimestamp | getTimestamp | 
| CLOB | java.sql.Clob | setClob | getClob | 
| BLOB | java.sql.Blob | setBlob | getBlob | 
| ARRAY | java.sql.Array | setARRAY | getARRAY | 
| REF | java.sql.Ref | SetRef | getRef | 
| STRUCT | java.sql.Struct | SetStruct | getStruct | 
java.sql.Date类映射到SQL DATE类型,而java.sql.Time和java.sql.Timestamp类分别映射到SQL TIME和SQL TIMESTAMP数据类型。
下面的示例显示Date和Time类如何格式化标准Java日期和时间值以匹配SQL数据类型要求。
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.*;
public class SqlDateTime {
   public static void main(String[] args) {
      //获取标准日期和时间
      java.util.Date javaDate = new java.util.Date();
      long javaTime = javaDate.getTime();
      System.out.println("The Java Date is:" + 
             javaDate.toString());
      //获取并显示SQL DATE
      java.sql.Date sqlDate = new java.sql.Date(javaTime);
      System.out.println("The SQL DATE is: " + 
             sqlDate.toString());
      //获取并显示SQL TIME
      java.sql.Time sqlTime = new java.sql.Time(javaTime);
      System.out.println("The SQL TIME is: " + 
             sqlTime.toString());
      //获取并显示SQL TIMESTAMP
      java.sql.Timestamp sqlTimestamp =
      new java.sql.Timestamp(javaTime);
      System.out.println("The SQL TIMESTAMP is: " + 
             sqlTimestamp.toString());
     }//结束main
}//结束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:\>
SQL对NULL值的使用和Java对null的使用是不同的概念。因此,要在Java中处理SQL NULL值,可以使用三种策略-
避免使用getXXX( )返回原始数据类型的方法。
对原始数据类型使用包装类,并使用 ResultSet 对象的 wasNull ()方法来测试接收 getXXX ()方法返回的值的包装类变量是否应该设置为 null。
使用原始数据类型和ResultSet对象的wasNull( )方法测试接收getXXX( )方法返回的值的原始变量是否应设置为您选择的代表NULL的可接受值。
这是处理NULL值的一个示例-
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;
}