JDBC資料型別


JDBC驅動程式將Java資料型別轉換為適當的JDBC型別,然後將其傳送到資料庫。 它為大多數資料型別提供並使用預設對映。 例如,Java int型別會被轉換為SQL INTEGER。 建立預設對映以提供到驅動程式時保持一致性。

下表總結了當呼叫PreparedStatementCallableStatement物件或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增強了對BLOBCLOBARRAYREF資料型別的支援。 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.Timejava.sql.Timestamp類分別對映到SQL TIME和SQL TIMESTAMP資料型別。

以下範例顯示了DateTime類如何格式化為標準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;
}