JDBC(Java data Base Connectivity)是Java語言為了支持SQL功能而提供的與數(shù)據(jù)庫相聯(lián)的用戶接口,JDBC中包括了一組由Java語言書寫的接口和類,它們都是獨(dú)立于特定的DBMS,或者說它們可以和各種數(shù)據(jù)相關(guān)聯(lián)。有了JDBC以后,程序員可以方便地在Java語言中使用SQL語言,從而使Java應(yīng)用程序或Java applet可以實(shí)現(xiàn)對分布在網(wǎng)絡(luò)上的各種關(guān)系數(shù)據(jù)庫的訪問。使用了JDBC以后,程序員可以將精力集中于上層的功能實(shí)現(xiàn),而不必關(guān)心底層與具體的DBMS的連接和訪問過程。
11.1
關(guān)系數(shù)據(jù)庫簡介
關(guān)系數(shù)據(jù)庫系統(tǒng)的思想是由IBM公司的E.F.Codd于1970年率先提出的。
關(guān)系數(shù)據(jù)庫支持的數(shù)據(jù)模型是關(guān)系模型。關(guān)系模型的基本條件是其關(guān)系模式中每個屬性值必須是一個不可分割的數(shù)據(jù)量。簡單地說,在關(guān)系數(shù)據(jù)庫中數(shù)據(jù)結(jié)構(gòu)一般是張兩維表,這張兩維表的每一列的值必須是不可分割的數(shù)據(jù)項(xiàng),而任兩行應(yīng)互不相同。
關(guān)系模型的主要特點(diǎn)是:
⑴結(jié)構(gòu)簡單,表示力強(qiáng),易于掌握。
⑵語言一體化,非過程化的操作,方便用戶使用。
⑶有一定的數(shù)學(xué)理論作基礎(chǔ),利于進(jìn)一步研究和發(fā)展。
?、炔僮骱臅r,執(zhí)行效率低。
關(guān)系數(shù)據(jù)庫管理系統(tǒng)一般向用戶提供數(shù)據(jù)檢索、數(shù)據(jù)插入、數(shù)據(jù)刪除、數(shù)據(jù)修改四種基本操作功能
。
11.2JDBC
概述
JDBC由一組Java語言編寫的類和接口組成,使用內(nèi)嵌式的SQL,主要實(shí)現(xiàn)三方面的功能:建立與數(shù)據(jù)庫的連接,執(zhí)行SQL聲明以及處理SQL執(zhí)行結(jié)果。JDBC支持基本的SQL功能,使用它可方便地與不同的關(guān)系型數(shù)據(jù)庫建立連接,進(jìn)行相關(guān)操作,并無需再為不同的DBMS分別編寫程序。下面我們先介紹JDBC與SQL及ODBC的關(guān)系,再介紹JDBC支持的兩種模型,最后介紹JDBC的抽象接口和數(shù)據(jù)庫驅(qū)動器Driver。
11.2.1 JDBC與SQL
盡管一般數(shù)據(jù)庫系統(tǒng)在很大范圍內(nèi)支持SQL的語義語法,但它們在復(fù)雜的高層次功能如存儲功能調(diào)用和外部連接等方面往往不盡一致。為了解決這一矛盾,JDBC采用以下的幾種措施:
(1)JDBC允許使用從屬于DBMS的系統(tǒng)的任何詢問語句,這些詢問語句都將被傳送給后臺的DBMS實(shí)際執(zhí)行。這樣增加了使用的靈活性,一個應(yīng)用程序的詢問可以不是SQL形式的,而是SQL的特定引出形式,如為特定的DBMS提供的文件或圖片查詢。這樣做的風(fēng)險則在某些DBMS中可以會出現(xiàn)錯誤。
(2)一般認(rèn)為ANSI SQL Entry Level的功能比較完備,而且是被廣泛支持的。因此為了使JDBC與SQL一致,要求用戶使用至少ANSI SQL 92 Entry Level以上的版本,這樣就給那些要求廣泛的可攜帶性的應(yīng)用程序提供了共同命名的保證。
(3)對較復(fù)雜的應(yīng)用,JDBC提供了接口類DatabaseMetadata,用戶可通過這個類獲取相應(yīng)DBMS的描述信息,再根據(jù)所得信息采取特定的查詢操作方式。
11.2.2 JDBC與ODBC
Microsoft的ODBC(Open DataBase Connectivity)是當(dāng)前與關(guān)系型數(shù)據(jù)庫連接最常用的接口。JDBC是建立在ODBC的基礎(chǔ)上的,實(shí)際上可視為ODBD的Java語言翻譯形式。當(dāng)然兩者都是建立在X/Open SQL CLI(Call Level Interface)的抽象定義之上的。而JDBC與ODBC相比,在使用上更為方便。
既然ODBC已經(jīng)是成型的通用接口,我們可在Java程序中直接使用ODBC卻要建立JDBC接口,這樣做的原因和好處包括以下幾點(diǎn):
(1)ODBC使用的是C語言界面,而從Java直接調(diào)用C源碼容易在安全性、健壯性和可移植性等方面產(chǎn)生問題,運(yùn)行功效也受到影響。
(2)將ODBC的C語言API逐字譯為Java也并不理想。比如,Java沒有指針,ODBC的一種面向?qū)ο笫降姆g界面,對Java的程序員來說更為自然方便。
(3)ODBC難于學(xué)習(xí)掌握,經(jīng)常將簡單的特性與復(fù)雜的特性混合使用。而JDBC相對簡單明了許多,容易理解掌握。
(4)JDBC有助于實(shí)現(xiàn)“純Java“的方案。當(dāng)使用ODBC時,每一臺客戶機(jī)都要求裝入ODBC的驅(qū)動器和管理器。而當(dāng)使用JDBC,驅(qū)動器完全由Java語言編寫時,JDBC代碼可以在所有的Java平臺上自動裝入、移植,而且是安全的。
當(dāng)然,在JDBC也可以使用ODBC,但是要通過中介JDBC-ODBC Bridge使用。
11.2.3 JDBC支持的兩種模型
在與數(shù)據(jù)庫的連接操作中,JDBC支持兩種不同的模型。這兩川模型根據(jù)用戶與數(shù)據(jù)庫的關(guān)系層次不同,分別稱為兩模型和三層模型。
兩層模型中,Java的應(yīng)用程序(Applet或Application)直接與數(shù)據(jù)庫聯(lián)系。用戶的SQL聲明被提交給數(shù)據(jù)庫,執(zhí)行的結(jié)果回送給用戶,如下圖所示。這種模型具有客戶機(jī)/服務(wù)器結(jié)構(gòu),用戶的機(jī)器如同客戶機(jī),存放數(shù)據(jù)庫的機(jī)器則如同服務(wù)器,連接兩者的可以是局域網(wǎng),也可以是廣域網(wǎng)。
┌─────────┐
│Java Application │
│ Java Applet │ Clinet Machine
├─────────┤
│ ?。剩模拢谩 々?
└─────────┘
↑
↓
┌─────────┐
│ ?。模拢停印 々?Database Serve
└─────────┘
圖11.1 JDBC支持的兩層模型
│Java Application │
│ Java Applet │ Clinet Machine
├─────────┤
│ ?。剩模拢谩 々?
└─────────┘
↑
↓
┌─────────┐
│ ?。模拢停印 々?Database Serve
└─────────┘
圖11.1 JDBC支持的兩層模型
在三層模型中,用戶不直接與數(shù)據(jù)庫聯(lián)系。用戶的命令首先發(fā)送給一個所謂“中間層”,中間層再將SQL聲明發(fā)給DMBS。執(zhí)行的結(jié)果也同樣由中間層轉(zhuǎn)交,如圖11.2所示。三層模型的好處是,可以通過中間層保持對存取權(quán)限和公有數(shù)據(jù)允許修改類型的控制,便于安全管理。同時,用戶可以使用一種較為友善的高層API,由中間層轉(zhuǎn)化為恰當(dāng)?shù)牡蛯用?,保證較好地運(yùn)行功效。到目前為止,中間層多用C或C++語言編寫。隨著Java語言的逐步推廣,將出現(xiàn)用Java編寫的中間層,更好地利用它的健壯性、多線程,安全性等特點(diǎn)。
┌──────────┐
│ Java Applet │
│ HTML Browse │
└──────────┘
↑
↓
┌──────────┐
│Application Server │
│ ?。↗ava) │
├──────────┤
│ JDBC │
└──────────┘
↑
↓
┌──────────┐
│ ?。模拢停印 々?
└──────────┘
圖11.2 JDBC支持的三層模型
│ Java Applet │
│ HTML Browse │
└──────────┘
↑
↓
┌──────────┐
│Application Server │
│ ?。↗ava) │
├──────────┤
│ JDBC │
└──────────┘
↑
↓
┌──────────┐
│ ?。模拢停印 々?
└──────────┘
圖11.2 JDBC支持的三層模型
11.2.4 JDBC的抽象接口
JDBC中最重要的部分是定義了一系列的抽象接口,通過這些接口,JDBC實(shí)現(xiàn)了三個基本的功能:建立與數(shù)據(jù)的連接、執(zhí)行SQL聲明和處理執(zhí)行結(jié)果。
這些接口都存在Java的sql包中,它們的名稱和基本功能是:
*java.sql.DriverMagnager
管理驅(qū)動器,支持驅(qū)動器與數(shù)據(jù)連接的創(chuàng)建。
*java.sql.Connection
代表與某一數(shù)據(jù)庫的連接,支持SQL聲明的創(chuàng)建。
*java.sql.Statement
在連接中執(zhí)行一靜態(tài)的SQL聲明并取得執(zhí)行結(jié)果。
*java.sql.PreparedStatement
Statement的子類,代表預(yù)編譯的SQL聲明。
*java.sql.CallableStatement
Statement的子類,代表SQL的存儲過程。
java.sql.ResultSet
代表執(zhí)行SQL聲明后產(chǎn)生的數(shù)據(jù)結(jié)果。
11.2.5 JDBC的數(shù)據(jù)庫驅(qū)動器Driver
Java的應(yīng)用程序員通過sql包中定義的一系列抽象類對數(shù)據(jù)庫進(jìn)行操作,而實(shí)現(xiàn)這些抽象類,實(shí)際完成操作,則是由數(shù)據(jù)庫驅(qū)動器Driver運(yùn)行的。它們之間的層次關(guān)系如圖11.3所示
┌─────────┐
│Java Application │
└─────────┘
JDBC API ————————
┌─────────┐
│JDBC Manager │
└─────────┘
——————————————
┌─────┐┌───-─--─┐┌─────┐┌───────-┐
DJBC │JDBC-Net││JDBC-ODBC | │Native-API││Native-Protocol |
│Java Application │
└─────────┘
JDBC API ————————
┌─────────┐
│JDBC Manager │
└─────────┘
——————————————
┌─────┐┌───-─--─┐┌─────┐┌───────-┐
DJBC │JDBC-Net││JDBC-ODBC | │Native-API││Native-Protocol |
Drivers│ Driver ││Bridge Driver││Driver │ |Driver |
└─────┘└───-──--┘└─────┘└─────-──┘
↓ ↓ ↓ ↓
┌───────────────────────────────────┐
│ D B M S |
───────────────────────────────────-┘
圖11.3 JDBC Drivers
└─────┘└───-──--┘└─────┘└─────-──┘
↓ ↓ ↓ ↓
┌───────────────────────────────────┐
│ D B M S |
───────────────────────────────────-┘
圖11.3 JDBC Drivers
JDBC的Driver可分為以下四種類型:
(1)JDBC-ODBC Bridge和ODBC Driver
這種驅(qū)動器器通過ODBC驅(qū)動器提供數(shù)據(jù)庫連接。使用這種驅(qū)動器,要求每一臺客戶機(jī)都裝入ODBC的驅(qū)動器。
(2)Native-API partly-Java Driver
這種驅(qū)動器將JDBC指令轉(zhuǎn)化成所連接使用的DBMS的操作形式。各客戶機(jī)使用的數(shù)據(jù)庫可能是Oracle,可能是Sybase,也可能是Access,都需要在客戶機(jī)上裝有相應(yīng)DBMS的驅(qū)動程序。
(3)JDBC-Net All-Java Driver
這種驅(qū)動器將JDBC指令轉(zhuǎn)化成獨(dú)立于DBMS的網(wǎng)絡(luò)協(xié)議形式,再由服務(wù)器轉(zhuǎn)化為特定DBMS的協(xié)議形式。有關(guān)DBMS的協(xié)議由各數(shù)據(jù)庫廠商決定。這種驅(qū)動器可以聯(lián)接到不同的數(shù)據(jù)庫上,最為靈活。目前一些廠商已經(jīng)開始添加JDBC的這種驅(qū)動器到他們已有的數(shù)據(jù)庫中介產(chǎn)品中。要注意的是,為了支持廣域網(wǎng)存取,需要增加有關(guān)安全性的措施,如防火墻等等。
(4)Native-protocol All-Java Driver
這種驅(qū)動器將JDBC指令轉(zhuǎn)化成網(wǎng)絡(luò)協(xié)議后不再轉(zhuǎn)換,由DBMS直接使用。相當(dāng)于客戶機(jī)直接與服務(wù)器聯(lián)系,對局域網(wǎng)適用。
在這四種驅(qū)動器中,后兩類“純Java”(All-Java)的驅(qū)動器效率更高,也更具有通用性。但目前第一、第二類驅(qū)動器比較容易獲得,使用也較普遍。
16.3 JDBC
編程
11.3.1 程序基本結(jié)構(gòu)
一般的
JDBC程序都完成三項(xiàng)功能:
與數(shù)據(jù)庫建立連接;傳送SQL 聲明以及對返回結(jié)果進(jìn)行處理
。下面我們通過一個具體例子說明這三項(xiàng)功能的實(shí)現(xiàn)過程。
例11.1 Creage.java給出了一個簡單的JDBC程序,此程序執(zhí)行后創(chuàng)建一張名為testTable的表,表中包括兩個域,域名分別為id和name。
1: import java.net.URL;
2: import java.sql.*;
3:
4: class Create{
5: public static void main (String[] args){
6: String url="jdbc:odbc:demo";
7: String query="CREATE TABLE testTable" + "(id INT,name CHAR(10))";
8:
9: try{
10: //下載jdbc-odbc bridge 驅(qū)動器
11: Class.forName (" sun.jdbc.odbc.JdbcOdbcDriver ");//關(guān)于此句參見下面Cyclone的注釋
//與驅(qū)動器建立連接 ,這里可使用不同的特定驅(qū)動,如jdbcfororacle或jdbcforsqlserver
14: Connection con=DriverManager.getConnection (url,"user","password");
15:
16: //創(chuàng)建一個Statement對象
17: Statement stmt=con.createStatement();
18:
19: //執(zhí)行SQL聲明
20: stmt.executeUpdate(query);
21: System.out.println("Create successfully!");
22:
23: //關(guān)閉 stm
24: stmt.close();
25:
26: //關(guān)閉連接
27: con.close();
28: }catch(SQLException ex){
//SQL異常信息
29:System.out.println("\n***SQLException caught ***\n");
30: while(ex!=null){
31: System.out.println("SQLState:"+ex.getSQLState());
32: System.out.println("Message:"+ex.getMessage());
33: System.out.println("Vendor:"+ex.getErrorCode());
34: ex=ex.getNextException();
35: System.out.println("");
}
36:}catch(java.lang.Exception ex){
37:ex.printStackTrace();
38:}
39:}
40:}
2: import java.sql.*;
3:
4: class Create{
5: public static void main (String[] args){
6: String url="jdbc:odbc:demo";
7: String query="CREATE TABLE testTable" + "(id INT,name CHAR(10))";
8:
9: try{
10: //下載jdbc-odbc bridge 驅(qū)動器
11: Class.forName (" sun.jdbc.odbc.JdbcOdbcDriver ");//關(guān)于此句參見下面Cyclone的注釋
//與驅(qū)動器建立連接 ,這里可使用不同的特定驅(qū)動,如jdbcfororacle或jdbcforsqlserver
14: Connection con=DriverManager.getConnection (url,"user","password");
15:
16: //創(chuàng)建一個Statement對象
17: Statement stmt=con.createStatement();
18:
19: //執(zhí)行SQL聲明
20: stmt.executeUpdate(query);
21: System.out.println("Create successfully!");
22:
23: //關(guān)閉 stm
24: stmt.close();
25:
26: //關(guān)閉連接
27: con.close();
28: }catch(SQLException ex){
//SQL異常信息
29:System.out.println("\n***SQLException caught ***\n");
30: while(ex!=null){
31: System.out.println("SQLState:"+ex.getSQLState());
32: System.out.println("Message:"+ex.getMessage());
33: System.out.println("Vendor:"+ex.getErrorCode());
34: ex=ex.getNextException();
35: System.out.println("");
}
36:}catch(java.lang.Exception ex){
37:ex.printStackTrace();
38:}
39:}
40:}
11.3.2 Statement類及其子類
1)Statement接口
Statement stmt=con.createStatement();
//執(zhí)行SQL聲明
int count1=stmt.executeUpdate("INSERT INTO testTable(id,name) VALUES(1,'wu')");
int count2=stmt.executeUpdate("INSERT INTO testTable(id,name) VALUES(2,'wang')");
//執(zhí)行SQL聲明
int count1=stmt.executeUpdate("INSERT INTO testTable(id,name) VALUES(1,'wu')");
int count2=stmt.executeUpdate("INSERT INTO testTable(id,name) VALUES(2,'wang')");
2)
PreparedStatement接口
String data[][]={{"5","xu"},{"6","yan"}};
PreparedStatement pstmt=con.prepareStatement("INSERT INTO testTable (id,name) VALUES(?,?)");
//參數(shù)賦值,執(zhí)行SQL聲明
for (int i=0;i<data.length;i++){
pstmt.setInt(1,Integer.parseInt(data[i][0]));
pstmt.setString(2,data[i][1]);
pstmt.executeUpdate();
}
//參數(shù)賦值,執(zhí)行SQL聲明
for (int i=0;i<data.length;i++){
pstmt.setInt(1,Integer.parseInt(data[i][0]));
pstmt.setString(2,data[i][1]);
pstmt.executeUpdate();
}
3)
CallableStatement接口
CallableStatement cstmt=con.prepareCall("{call Search(?)}");
//參數(shù)賦值
cstmt.setInt(1,934678);
//執(zhí)行儲存過程。
cstmt.execute();
//參數(shù)賦值
cstmt.setInt(1,934678);
//執(zhí)行儲存過程。
cstmt.execute();
11.3.3 結(jié)果集ResultSet及ResultSetMetaData
String query = "SELECT * FROM testTable";
Statement stmt=con.createStatement();
//發(fā)出查詢要求,獲得結(jié)果集
ResultSet rs=stmt.executeQuery(query);
//顯示結(jié)果集各行各列
System.out.println("The detail of testTable is:");
ResultSetMetaData rsmd=rs.getMetaData();
//獲得結(jié)果集列數(shù)
in numCols=rsmd.getColumnCount();
//顯示列標(biāo)題
for(int i=1;i<=numCols;i++)
{
if(i>1) System.out.print(",");
System.out.print (rsmd.getColumnLabel(i)) ;
}
System.out.println("");
//顯示結(jié)果集信息
while( rs.next() )
{
//顯示一行
for(int i=1;i<=numCols;i++)
{
if(i>1) System.out.print(",");
System.out.print( rs.getString(i) );
}
//發(fā)出查詢要求,獲得結(jié)果集
ResultSet rs=stmt.executeQuery(query);
//顯示結(jié)果集各行各列
System.out.println("The detail of testTable is:");
ResultSetMetaData rsmd=rs.getMetaData();
//獲得結(jié)果集列數(shù)
in numCols=rsmd.getColumnCount();
//顯示列標(biāo)題
for(int i=1;i<=numCols;i++)
{
if(i>1) System.out.print(",");
System.out.print (rsmd.getColumnLabel(i)) ;
}
System.out.println("");
//顯示結(jié)果集信息
while( rs.next() )
{
//顯示一行
for(int i=1;i<=numCols;i++)
{
if(i>1) System.out.print(",");
System.out.print( rs.getString(i) );
}
11.3.4 DatabaseMetaData
DatabaseMetaData dma = con.getMetaData();
//驅(qū)動器和URL信息
System.out.println("\nConnected to" + dma.getURL());
System.out.println("Driver" + dma.getDriverName());
System.out.println("Version" + dma.getDriverVersion());
//數(shù)據(jù)庫信息
System.out.println("\nDataBase name:" + dma.getDatabaseProductName()+dma.getDatabaseProductVersion());
System.out.println("DataBase supports SQL keywords:\n\t" + dma.getSQLKeywords());
//數(shù)據(jù)庫功能信息函數(shù)
//驅(qū)動器和URL信息
System.out.println("\nConnected to" + dma.getURL());
System.out.println("Driver" + dma.getDriverName());
System.out.println("Version" + dma.getDriverVersion());
//數(shù)據(jù)庫信息
System.out.println("\nDataBase name:" + dma.getDatabaseProductName()+dma.getDatabaseProductVersion());
System.out.println("DataBase supports SQL keywords:\n\t" + dma.getSQLKeywords());
//數(shù)據(jù)庫功能信息函數(shù)
dma.supportsANSI92EntryLevelSQL()
dma.supportsANSI92FullSQL()
dma.supportsStoredProcedures()
11.3.5 JDBC數(shù)據(jù)類型及類型轉(zhuǎn)換
11.3.5 JDBC數(shù)據(jù)類型及類型轉(zhuǎn)換
一、JDBC的數(shù)據(jù)類型
JDBC的sql包中除了與數(shù)據(jù)庫連接有關(guān)的抽象接口及與驅(qū)動器有關(guān)的DriverManager、DriverPropertyInfo等類型外,還定義了若干數(shù)據(jù)類,用以代表數(shù)據(jù)庫中可能用到的SQL類型。下面我們就對它們逐一進(jìn)行簡略介紹。
1、sql.Date
sql包中的日期類Date是util包中Date類的子類,實(shí)際上也是util.Date類的子集。它只處理年月日,而忽略小時和分秒,用以代表SQL的DATE信息。
Date類的構(gòu)造方法為:
public Date(int year, int mouth, int day)
其中參數(shù)格式同util.Date類的構(gòu)造方法一樣,年參數(shù)為所需設(shè)定的年份減去1900所得的整數(shù)值,月參數(shù)為0至11,日參數(shù)為1至31。如1998年1月23日所對應(yīng)創(chuàng)建日期類的方法調(diào)用為:
Date d=new Date(98,0,23);
Date類還提供兩個與String類互相轉(zhuǎn)換的方法,分別是:
public static Date valueOf(String s)
將字符串類參數(shù)轉(zhuǎn)換為日期類對象。其中String類參數(shù)S的格式為“年-月-日”,加“1997-04-12”。
public String toString()
將日期類對象轉(zhuǎn)換為String類對象表示,同樣采用“年-月-日”的格式。
2、sql.Time
該類是util.Date類的子類,也是它的一個子集。在Time類里,只處理小時和分秒,代表SQL的TIME類型。它與sql.Date合起來才表示完整的util.Date類信息。
Time類的構(gòu)造方法為:
public Time(int hour,int minute,int second)
其中小時參數(shù)值為0至23,分秒?yún)?shù)取值均為0至59。
與sql.Date一樣,Time類也定義了兩個與String類互相轉(zhuǎn)換的函數(shù)ValueOf和String。不同的是String類對象的格式為“小時:分:秒”,如“12:26:06”。
3、sql.Timestamp
這個類也是util.Date類的子類,其中除了包含年月日、小時和分秒和信息之外,還加入了納秒信息(nanosecond),1納秒即1毫微秒。Timestamp類用來代表SQL時間戳(Timestamp)類型信息。
Timestamp類的構(gòu)造方法為:
public Timestamp(int year, int mouth, int date, int hour, int minute, int second, int nano)其中納秒?yún)?shù)的取值從0至999,999,999,其余各參數(shù)同前。
Timestamp類特別定義了設(shè)置和獲得納秒信息的方法,分別是
public getnanos()
獲取時間戳的納秒部分
public void setNanos(int n)
以給定數(shù)值設(shè)置時間戳的納秒部分
4、sql.Types
Types類是Object類的直接子類。在這個類中以靜態(tài)常量的形式定義了可使用的SQL的數(shù)值類型。所有這些類型常量都以前綴
public final static int
的形式標(biāo)明是公有靜態(tài)整數(shù),且不可改動。具體的類型名和含義如表11.1所示。其中OTHER用來代表數(shù)據(jù)庫定義的特殊數(shù)據(jù),可以用getObject或setObject方法將其映射為一個Java的Object對象。
表11.1 Types中定義的SQL類型
類型名
|
含義
|
BIGINT
|
長整型數(shù)
|
BINARY
|
二進(jìn)制數(shù)
|
BIT
|
比特數(shù)
|
CHAR
|
字符型
|
DATE
|
日期型
|
DECIMAL
|
十進(jìn)制數(shù)
|
DOUBLE
|
雙精度數(shù)
|
FLOAT
|
浮點(diǎn)數(shù)
|
INTEGER
|
整數(shù)
|
LONGVARBINARY
|
可變長型二進(jìn)制數(shù)
|
LONGVARCHAR
|
可變長型字符
|
NULL
|
空類型
|
NUMERIC
|
數(shù)值型
|
OTHER
|
其他類型
|
REAL
|
實(shí)數(shù)
|
SMALLINT
|
短整型
|
TIME
|
時間類型
|
TIMESTAMP
|
時間戳類型
|
TINYINT
|
微整型
|
VARBINARY
|
可變二進(jìn)制數(shù)
|
VARCHAR
|
可變字符型
|
二、SQL與Java
由于SQL數(shù)據(jù)類型與Java的數(shù)據(jù)類型不一致,因而在使用Java類型的應(yīng)用程序與使用SQL類型的數(shù)據(jù)庫之間,需要某種讀寫類型轉(zhuǎn)換機(jī)制。實(shí)際上我們前面介紹的ResultSet類的“get”系列方法,Statement及其子類的“set“系列方法和registerOutParameter方法,都是這一轉(zhuǎn)換機(jī)制的組成部分。
需要進(jìn)行的讀寫轉(zhuǎn)換包括三種情況:
第一種情況是從數(shù)據(jù)庫中讀取數(shù)值后,存放在ResultSet對象中的是SQL類型的數(shù)據(jù)。而調(diào)用“get”系列方法時,JDBC才將SQL類型轉(zhuǎn)換為指定的Java類型
。在一般情形下,SQL類型相對應(yīng)的Java類型如表11-2所示。
表11.2 SQL類型一般所對應(yīng)的Java類型
SQL type
|
Java type
|
CHAR
|
java.lang.String
|
VARCHAR
|
java.lang.String
|
LONGVARCHAR
|
java.lang.String
|
NUMERIC
|
java.lang.Bignum
|
DECIMAL
|
java.lang.Bignum
|
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
|
當(dāng)然,在使用時用戶可以指定將SQL類型轉(zhuǎn)換為某個需要的特定類型而不遵循表11.2。例如在結(jié)果集中的某個FLOAT型數(shù)值,依標(biāo)準(zhǔn)轉(zhuǎn)換應(yīng)用使用getDouble方法獲取,但實(shí)際上按用戶的不同需求也可以使用getFloat,getInt,甚至gefByte方法獲取,但只是有可能影響數(shù)值精確度。表11.3列出了對每一SQL類型可用以獲取“get”方法的清單,其中“+”表示可以使用該方法,“*”表示最好使用該方法。
表11.3 獲取SQL類型使用的“get”方法
\
\ SQL \ 類型名 \ \ \ \ \ get \ 方法名 \ \ \ \ |
T
I N Y I N T |
S
M A L L I N T |
I
N T E G E R |
B
I G I N T |
R
E A L |
F
L O A T |
D
O U B L E |
D
E C I M A L |
N
U M E R I C |
B
I T |
C
H A R |
V
A R C H A R |
L
O N G V A R C H A R |
B
I N A R Y |
V
A R B I N A R Y |
L
O N G V A R B I N A R Y |
D
A T E |
T
I M E |
border-right: #d4d0c8; padding-right: 0.75pt; border-top: #d4d0c8; padding-left: 0.75pt; padding-bottom: 0.75pt; borde
發(fā)表評論
最新評論
|
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

評論