JDBC 數(shù)據(jù)類型

2018-09-28 19:59 更新

數(shù)據(jù)類型

JDBC 驅(qū)動(dòng)程序在將 Java 數(shù)據(jù)類型發(fā)送到數(shù)據(jù)庫(kù)之前,會(huì)將其轉(zhuǎn)換為相應(yīng)的 JDBC 類型。對(duì)于大多數(shù)數(shù)據(jù)類型都采用了默認(rèn)的映射關(guān)系。例如,一個(gè) Java int 數(shù)據(jù)類型轉(zhuǎn)換為 SQL INTEGER。通過(guò)默認(rèn)的映射關(guān)系來(lái)提供驅(qū)動(dòng)程序之間的一致性。

當(dāng)你調(diào)用 PreparedStatement 中的 setXXX()方法或 CallableStatement 對(duì)象或 ResultSet.updateXXX()方法時(shí), Java 數(shù)據(jù)類型會(huì)轉(zhuǎn)換為默認(rèn)的 JDBC 數(shù)據(jù)類型,如下表概述。

SQLJDBC/JavasetXXXupdateXXX
VARCHARjava.lang.StringsetStringupdateString
CHARjava.lang.StringsetStringupdateString
LONGVARCHARjava.lang.StringsetStringupdateString
BITbooleansetBooleanupdateBoolean
NUMERICjava.math.BigDecimalsetBigDecimalupdateBigDecimal
TINYINTbytesetByteupdateByte
SMALLINTshortsetShortupdateShort
INTEGERintsetIntupdateInt
BIGINTlongsetLongupdateLong
REALfloatsetFloatupdateFloat
FLOATfloatsetFloatupdateFloat
DOUBLEdoublesetDoubleupdateDouble
VARBINARYbyte[ ]setBytesupdateBytes
BINARYbyte[ ]setBytesupdateBytes
DATEjava.sql.DatesetDateupdateDate
TIMEjava.sql.TimesetTimeupdateTime
TIMESTAMPjava.sql.TimestampsetTimestampupdateTimestamp
CLOBjava.sql.ClobsetClobupdateClob
BLOBjava.sql.BlobsetBlobupdateBlob
ARRAYjava.sql.ArraysetARRAYupdateARRAY
REFjava.sql.RefSetRefupdateRef
STRUCTjava.sql.StructSetStructupdateStruct

JDBC 3.0 增強(qiáng)了對(duì) BLOB,CLOB,ARRAY 和 REF 數(shù)據(jù)類型的支持。 ResultSet 對(duì)象現(xiàn)在有 UPDATEBLOB(),updateCLOB(), updateArray(),和 updateRef()方法,通過(guò)這些方法你可以直接操作服務(wù)器上的相應(yīng)數(shù)據(jù)。

你能用 setXXX()方法和 updateXXX()方法將 Java 類型轉(zhuǎn)換為特定的 JDBC 數(shù)據(jù)類型。你能用 setObject()方法和 updateObject()方法將絕大部分的 Java 類型映射到 JDBC 數(shù)據(jù)類型。

ResultSet 對(duì)象為任一數(shù)據(jù)類型提供相應(yīng)的 getXXX()方法,該方法可以獲取任一數(shù)據(jù)類型的列值。上述任一方法的使用需要列名或它的順序位置。

SQLJDBC/JavasetXXXgetXXX
VARCHARjava.lang.StringsetStringgetString
CHARjava.lang.StringsetStringgetString
LONGVARCHARjava.lang.StringsetStringgetString
BITbooleansetBooleangetBoolean
NUMERICjava.math.BigDecimalsetBigDecimalgetBigDecimal
TINYINTbytesetBytegetByte
SMALLINTshortsetShortgetShort
INTEGERintsetIntgetInt
BIGINTlongsetLonggetLong
REALfloatsetFloatgetFloat
FLOATfloatsetFloatgetFloat
DOUBLEdoublesetDoublegetDouble
VARBINARYbyte[ ]setBytesgetBytes
BINARYbyte[ ]setBytesgetBytes
DATEjava.sql.DatesetDategetDate
TIMEjava.sql.TimesetTimegetTime
TIMESTAMPjava.sql.TimestampsetTimestampgetTimestamp
CLOBjava.sql.ClobsetClobgetClob
BLOBjava.sql.BlobsetBlobgetBlob
ARRAYjava.sql.ArraysetARRAYgetARRAY
REFjava.sql.RefSetRefgetRef
STRUCTjava.sql.StructSetStructgetStruct

日期和時(shí)間數(shù)據(jù)類型

java.sql.Date 類映射 SQL DATE 類型,java.sql.Time 類和 java.sql.Timestamp 類也分別映射 SQL TIME 數(shù)據(jù)類型和 SQL TIMESTAMP 數(shù)據(jù)類型。

以下示例顯示了日期和時(shí)間類如何轉(zhuǎn)換成標(biāo)準(zhǔn)的 Java 日期和時(shí)間值,并匹配成 SQL 數(shù)據(jù)類型所要求的格式。

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

現(xiàn)在,讓我們用下面的命令編譯上面的代碼-

C:\>javac JDBCExample.java
C:\>

當(dāng)你運(yùn)行 JDBCExample 時(shí),它將展示下面的結(jié)果-

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 是不同的概念。那么,你可以使用三種策略來(lái)處理 Java 中的 SQL NULL 值-

  • 避免使用返回原始數(shù)據(jù)類型的 getXXX()方法。
  • 使用包裝類的基本數(shù)據(jù)類型,并使用 ResultSet 對(duì)象的 wasNull()方法來(lái)測(cè)試收到 getXXX()方法返回的值是否為 null,如果是 null,該包裝類變量則被設(shè)置為 null。
  • 使用原始數(shù)據(jù)類型和 ResultSet 對(duì)象的 wasNull()方法來(lái)測(cè)試通過(guò) getXXX()方法返回的值,如果是 null,則原始變量應(yīng)設(shè)置為可接受的值來(lái)代表 NULL。

下面是一個(gè)處理 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;
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)