由于 SQL 數據類型和 java 數據類型是不同的,因此需要某種機制在使用 Java 類型的應用程序和使用 SQL 類型的數據庫之間來讀寫數據。
為此,JDBC 提供了 getXXX
和 setXXX
方法集、方法 registerOutParameter
和類 Types
。
JDBC 定義了一個從 JDBC 數據庫類型到 Java 類型的標準映射。例如,JDBC 的 INTEGER
類型通常映射為 Java 的 int
類型。這可支持簡單的接口,將 JDBC 值讀寫為簡單的 Java 類型。
Java 類型不必與 JDBC 類型完全形同;它們只須能夠用足夠的類型信息來代表 JDBC 類型,從而能正確地存儲和取出參數和從 SQL 語句恢復結果就可以了。例如,Java String
對象可能并不能精確地與任何 JDBC CHAR
類型匹配,但它卻可給出足夠的類型信息來成功地表示 CHAR
、 VARCHAR
或 LONGVARCHAR
類型。
CHAR、 VARCHAR 和 LONGVARCHAR
JDBC 類型 CHAR
表示固定長度的小字符串,VARCHAR
表示長度可變的小字符串,而 LONGVARCHAR
表示長度可變的大字符串。
與 JDBC CHAR
對應的是 SQL CHAR
類型,所有主要的數據庫都支持它。支持長度達 254 個字符,
例如 CHAR(12)
即定義了一個長度為 12 個字符的字符串。
與 JDBC VARCHAR
對應的是 SQL VARCHAR
類型,所有的主要數據庫都支持它。支持長度達 254 個字符,當把字符串的值賦給 VARCHAR
變量時,數據庫就記住該字符串的長度,使用 SELECT 時,它可以
返回準確的原始字符串。
不幸的是,對于 JDBC LONGVARCHAR
類型,目前并沒有一致的 SQL 映射。
CHAR
、VARCHAR
和 LONGVARCHAR
可映射為 String
或 char[]
,但 String
更適合于一般用法。String
類能使 String
和 char[]
之間的轉換更為容易:它有一個用于將 String
對象轉換為 char[]
的方法,還有一個將 char[]
轉換為 String
對象的構造函數。
方法 ResultSet.getString
用于從 CHAR
、VARCHAR
和LONGVARCHAR
域中檢索數據。但如果用LONGVARCHAR
儲存好幾兆字節的字符串時,應將 LONGVARCHAR
值作為 Java 輸入流進行檢索,之后從流中以任意大小的塊來讀取數據。使用方法getAsciiStream
和 getUnicodeStream
把儲存在 LONGVARCHAR
列的數據作為 Ascii 或 Unicode 字符流來傳送。
BINARY、VARBINARY 和 LONGVARBINARY
JDBC 類型BINARY
表示固定長度的小二進制值, VARBINARY
表示長度可變化的小二進制值,而 LONGVARBINARY
表示長度可變化的大二進制值。
不幸的是,這些不同 BINARY
類型的使用還未被標準化,因而在各種主要數據庫提供的支持有很大的不同。
在 Java 中,BINARY
、VARBINARY
和 LONGVARBINARY
都可用同一 byte
數組來表示。
檢索 BINARY
和 VARBINARY
值時,建議使用 ResultSet.getBytes
。如果類型為 JDBC LONGVARBINARY
的某列儲存的是幾兆字節長度的字節數組,則建議用方法getBinaryStream
來檢索,為 Java 輸入流檢索,然后可從該流中以更小的塊來讀取。
JDBC 類型 BIT
代表一個位值,可為 0 或 1。目前只有一部份主流數據庫支持它。
JDBC BIT
類型的 Java 映射的推薦類型是 Java 布爾型。
JDBC 類型 TINYINT
代表一個 8 位無符號整數,其值在 0 到 255 之間。 目前只有一部份的數據庫支持它。
JDBC 類型SMALLINT
代表一個 16 位的有符號整數,其值在 -32768 和 32767 之間。所有主流數據庫所廣為支持。
JDBC SMALLINT
類型的 Java 映射的推薦類型是16位的 Java short
類型。
JDBC 類型 INTEGER
代表一個 32 位的有符號整數,其值在 - 2147483648 和 2147483647 之間。所有的主流數據庫都至少支持 32 位。
INTEGER
類型 Java 映射的推薦類型是 Java int
類型。
JDBC 類型 BIGINT
代表一個 64 位的有符號整數,其值在 -9223372036854775808 和 9223372036854775807 之間。目前還沒有任何數據庫實現 SQL BIGINT
類型。
BIGINT
類型的 Java 映射的推薦類型是 Java long 類型。
JDBC 類型 REAL
代表一個有 7 位尾數的“單精度”浮點數。對應的 SQL 類型 REAL
,主流數據庫都支持。
REAL
類型的 Java 映射的推薦類型為 Java float
類型。
JDBC 類型 DOUBLE
代表一個有 15 位尾數的“雙精度”浮點數。對應的 SQL 類型是 DOUBLE
PRECISION
,主流數據庫都支持。
DOUBLE
類型的 Java 映射的推薦類型為 Java double
類型。
JDBC 類型 FLOAT
基本上與DOUBLE
相同,對應的 SQL 類型 FLOAT
。FLOAT
代表一個有 15 位尾數的“雙精度”浮點數。同時提供了 FLOAT
和 DOUBLE
,其目的是與以前的 API 實現一致。但這卻有可能產生誤導。由于 SQL FLOAT
和單精度的 Java float
類型間可能產生混淆,因此建議選用 JDBC DOUBLE
類型而不用 FLOAT
。
FLOAT
類型的 Java 映射的推薦類型為 Java double
類型。
JDBC 類型 DECIMAL
和 NUMERIC
兩者非常相似。它們都表示固定精度的十進制值。
相應的 SQL 類型 DECIMAL
和 NUMERIC
,得到廣泛支持。這些 SQL 類型都帶有精度和比例參數。精度是所支持的十進制數字的總位數,比例是小數點后的數字位數。比例必須永遠小于或等于精度。例如,值 "12.345" 有 5 位精度和 3 位比例,而值 ".11" 有 2 位精度和 2 位比例。JDBC 要求所有 DECIMAL
和 NUMERIC
類型都必須支持至少 15 位的精度和比例。
DECIMAL
和 NUMERIC
之間的唯一區別是NUMERIC
類型必須以確切指定的精度來表示,而 DECIMAL
類型允許動態添加額外的精度。因此,創建為類型 NUMERIC(12,4)
的列將總是用 12 位數來表示,而創建為類型 DECIMAL(12,4)
的列則可用更大的位數來表示。
DECIMAL
和 NUMERIC
類型的 Java 映射的推薦類型是 java.math.BigDecimal
,該 Java 類型也用絕對精度來表示定點數。java.math.BigDecimal
類型提供了一些數學操作,可對BigDecimal
類型與其它的 BigDecimal
類型、整數類型和浮點數類型進行加、減、乘、除的運算。
用于檢索 DECIMAL
和 NUMERIC
值的推薦方法是 ResultSet.getBigDecimal
。也可用getString
來檢索 DECIMAL
或 NUMERIC
結果,也可用 Java 數值型類型。
有三種 JDBC 類型與時間有關:
JDBCDATE
類型表示一個由年、月、日組成的日期。對應的是 SQL DATE
類型,但只有一部份主流數據庫實現它。JDBC TIME
類型表示一個由小時、分鐘和秒組成的時間。對應的是 SQL TIME
類型,但只有一部份主流數據庫實現它。JDBC TIMESTAMP
類型表示 DATE
加上 TIME
,外加一個納秒域。對應的 TIMESTAMP
類型,但只有少數幾個數據庫實現它。由于標準的 Java 類 java.util.Date
并不與這三個 JDBC 日期—時間類型完全匹配(它含有 DATE
和 TIME
的信息但不含納秒信息),因此 JDBC 定義了三個 java.util.Date
的子類與 SQL 類型對應。它們是:
java.sql.Date
,對應于 SQL DATE
信息。java.util.Date
基本類中的小時、分鐘和秒都設為 0。java.sql.Time
,對應于 SQL TIME
信息。java.util.Date
基本類中的年、月、日域設為 1970 年 1 月 1 日。這是 Java 紀元的“零”日期。java.sql.Timestamp
,對應于 SQL TIMESTAMP
信息。該類擴展了 java.util.Date
,添加了納秒域。下述代碼段將 java.sql.Timestamp
對象轉換為精度達到毫秒量級的 java.util.Date
對象:
Timestamp t = new Timestamp(100, 0, 1, 15, 45, 29, 987245732); java.util.Date d; d = new java.util.Date(t.getTime() + (t.getNanos() / 1000000));動態數據存取
大多數時候,用戶要存取的結果和參數其數據類型在編譯時是已知的。然而,有些應用程序(例如普通的瀏覽器或查詢工具)在編譯時對它們所要存取的數據庫的機制并不知曉。
有三種方法和一個常量可用于訪問那些在編譯時其數據類型尚屬未知的值:
ResultSet.getObject
PreparedStatement.setObject
CallableStatement.getObject
java.sql.Types.OTHER
(用作CallableStatement.registerOutParameter
的一個變量)例如,如果應用程序想要接受多種類型作為其
ResultSet
對象中的結果,它可以使用ResultSet.getObject
方法。
ResultSet.getObject
和CallableStatement.getObject
方法將值檢索為 JavaObject
。由于Object
是所有 Java 對象的基本類,因此可將任何 Java 類的實例檢索為Object
的實例。然而,以下 Java 類型是內置的“基本”類型,它們不是類Object
的實例:boolean
、char
、byte
、short
、int
、long
、float
和double
。因此,不能用getObject
方法來檢索它們。然而,這些基本類型每種都有相應的可用作 wrapper 的類。這些類的實例是對象,這意味著可用ResultSet.getObject
和CallableStatement.getObject
方法來檢索它們。顯示了從 JDBC 類型到 JavaObject
類型的映射。該表與 JDBC 類型到 Java 類型的標準映射不同:在該表中,除了 JDBCTINYINT
和 JDBCSMALLINT
類型映射為 Java 類Integer
之外,每一個基本的 Java 類型都被替換為它們的 wrapper 類。方法
getObject
還可用于檢索用戶定義的 Java 類型。隨著抽象數據類型(ADT)和其它用戶定義的類型在某些數據庫系統中的出現,一些提供者可能會發現用getObject
來檢索這些類型將更方便。數據類型映射表
從 JDBC 類型映射到 Java 類型
JDBC 類型 | Java 類型 |
---|---|
CHAR | String |
VARCHAR | String |
LONGVARCHAR | String |
NUMERIC | java.math.BigDecimal |
DECIMAL | java.math.BigDecimal |
BIT | boolean |
TINYINT | byte |
SMALLINT | short |
INTEGER | int |
BIGINT | long |
REAL | float |
FLOAT | double |
DOUBLE | double |
BINARY | byte[] |
VARBINARY | byte[] |
LONGVARBINARY | byte[] |
DATE | java.sql.Date |
TIME | java.sql.Time |
TIMESTAMP | java.sql.Timestamp |
從 Java 類型映射到 JDBC 類型
Java 類型 | JDBC 類型 |
---|---|
String | VARCHAR 或 LONGVARCHAR |
java.math.BigDecimal | NUMERIC |
boolean | BIT |
byte | TINYINT |
short | SMALLINT |
int | INTEGER |
long | BIGINT |
float | REAL |
double | DOUBLE |
byte[] | VARBINARY 或 LONGVARBINARY |
java.sql.Date | DATE |
java.sql.Time | TIME |
java.sql.Timestamp | TIMESTAMP |
JDBC 類型 | Java Object 類型 |
---|---|
CHAR | String |
VARCHAR | String |
LONGVARCHAR | String |
NUMERIC | java.math.BigDecimal |
DECIMAL | java.math.BigDecimal |
BIT | Boolean |
TINYINT | Integer |
SMALLINT | Integer |
INTEGER | Integer |
BIGINT | Long |
REAL | Float |
FLOAT | Double |
DOUBLE | Double |
BINARY | byte[] |
VARBINARY | byte[] |
LONGVARBINARY | byte[] |
DATE | java.sql.Date |
TIME | java.sql.Time |
TIMESTAMP | java.sql.Timestamp |
Java Object 類型 | JDBC 類型 |
---|---|
String | VARCHAR 或 LONGVARCHAR |
java.math.BigDecimal | NUMERIC |
Boolean | BIT |
Integer | INTEGER |
Long | BIGINT |
Float | REAL |
Double | DOUBLE |
byte[] | VARBINARY 或 LONGVARBINARY |
java.sql.Date | DATE |
java.sql.Time | TIME |
java.sql.Timestamp | TIMESTAMP |
TINYINT | SMALLINT | INTEGER | BIGINT | REAL | FLOAT | DOUBLE | DECIMAL | NUMERIC | BIT | CHAR | VARCHAR | LONGVARCHAR | BINARY | VARBINARY | LONGVARBINARY | DATE | TIME | TIMESTAMP | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
String | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x |
java.math.BigDecimal | x | x | x | x | x | x | x | x | x | x | x | x | x | ||||||
Boolean | x | x | x | x | x | x | x | x | x | x | x | x | x | ||||||
Integer | x | x | x | x | x | x | x | x | x | x | x | x | x | ||||||
Long | x | x | x | x | x | x | x | x | x | x | x | x | x | ||||||
Float | x | x | x | x | x | x | x | x | x | x | x | x | x | ||||||
Double | x | x | x | x | x | x | x | x | x | x | x | x | x | ||||||
byte[] | x | x | x | ||||||||||||||||
java.sql.Date | x | x | x | x | x | ||||||||||||||
java.sql.Time | x | x | x | x | |||||||||||||||
java.sql.Time- stamp | x | x | x | x | x | x |
"x" 表示該方法可以檢索 JDBC 類型。"X" 表示建議使用該方法來檢索該 JDBC 類型。
TINYINT | SMALLINT | INTEGER | BIGINT | REAL | FLOAT | DOUBLE | DECIMAL | NUMERIC | BIT | CHAR | VARCHAR | LONGVARCHAR | BINARY | VARBINARY | LONGVARBINARY | DATE | TIME | TIMESTAMP | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
getByte | X | x | x | x | x | x | x | x | x | x | x | x | x | ||||||
getShort | x | X | x | x | x | x | x | x | x | x | x | x | x | ||||||
getInt | x | x | X | x | x | x | x | x | x | x | x | x | x | ||||||
getLong | x | x | x | X | x | x | x | x | x | x | x | x | x | ||||||
getFloat | x | x | x | x | X | x | x | x | x | x | x | x | x | ||||||
getDouble | x | x | x | x | x | X | X | x | x | x | x | x | x | ||||||
getBigDecimal | x | x | x | x | x | x | x | X | X | x | x | x | x | ||||||
getBoolean | x | x | x | x | x | x | x | x | x | X | x | x | x | ||||||
getString | x | x | x | x | x | x | x | x | x | x | X | X | x | x | x | x | x | x | x |
getBytes | X | X | x | ||||||||||||||||
getDate | x | x | x | X | x | ||||||||||||||
getTime | x | x | x | X | x | ||||||||||||||
getTimestamp | x | x | x | x | X | ||||||||||||||
getAsciiStream | x | x | X | x | x | x | |||||||||||||
getUnicodeStream | x | x | X | x | x | x | |||||||||||||
getBinaryStream | x | x | X | ||||||||||||||||
getObject | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x | x |
新聞熱點
疑難解答
圖片精選