由于 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.getObjectPreparedStatement.setObjectCallableStatement.getObjectjava.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 |
新聞熱點
疑難解答
圖片精選