JDBC - 数据类型
JDBC 驱动程序将 Java 数据类型转换为适当的 JDBC 类型,然后再将其发送到数据库。 它对大多数数据类型使用默认映射。 例如,Java int 被转换为 SQL INTEGER。 创建默认映射以提供驱动程序之间的一致性。
下表总结了在调用 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 |
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 数据类型。
以下示例显示日期和时间类如何格式化标准 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) { //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 值,可以使用三种策略 −
避免使用返回原始数据类型的 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; }