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