JDBC驅動程式將Java數據類型轉換為適當的JDBC類型,然後將其發送到資料庫。 它為大多數數據類型提供並使用默認映射。 例如,Java int類型會被轉換為SQL INTEGER。 創建默認映射以提供到驅動程式時保持一致性。
下表總結了當調用PreparedStatement或CallableStatement對象或ResultSet.updateXXX()方法的setXXX()方法時,將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 | updateXXX |
|---|---|---|---|
| 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) {
//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
編譯並執行上面代碼,得到以下結果 -
F:\worksp\jdbc>javac SqlDateTime.java
F:\worksp\jdbc>java SqlDateTime
The Java Date is:Wed May 31 23:54:57 CST 2017
The SQL DATE is: 2017-05-31
The SQL TIME is: 23:54:57
The SQL TIMESTAMP is: 2017-05-31 23:54:57.937
F:\worksp\jdbc>
處理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;
}
