連接Oracle數(shù)據(jù)庫的各種oracle JDBC驅(qū)動程序的細(xì)節(jié)。
這些細(xì)節(jié)包括:
1、導(dǎo)入JDBC包
2、注冊oracle JDBC驅(qū)動程序
3、打開數(shù)據(jù)庫連接
4、執(zhí)行SQL DML語句在數(shù)據(jù)庫表中獲取、添加、修改和刪除行
一、JDBC驅(qū)動程序
共有有4種
1、Thin驅(qū)動程序
Thin驅(qū)動程序是所有驅(qū)動程序中資源消耗最小的,而且完全用java編寫的。
該驅(qū)動程序只使用TCP/IP且要求Oracle Net。被稱為第4類驅(qū)動程序。
它使用TTC協(xié)議與Oracle數(shù)據(jù)庫進(jìn)行通信。能夠在Applet、Application中使用。
2、OCI驅(qū)動程序
OCI驅(qū)動比Thin需要資源要多,但性能通常好一點(diǎn)。OCI驅(qū)動適合于部署在
中間層的軟件,如Web服務(wù)器。不能在applet中使用OCI驅(qū)動。是第2類驅(qū)動程序。
不完全用java寫的,還包含了c代碼。該驅(qū)動有許多附加的性能增強(qiáng)特性,
包括高級的連接緩沖功能。
注意:OCI驅(qū)動要求在客戶計算機(jī)上安裝它。
3、服務(wù)器內(nèi)部驅(qū)動程序
服務(wù)器內(nèi)部驅(qū)動程序提供對數(shù)據(jù)庫的直接訪問,Oracle JVM使用它與數(shù)據(jù)庫進(jìn)行通信。
Oracle JVM是與數(shù)據(jù)庫集成的Java Virtual Machine,可以使用Oracle JVM將
Java類裝載進(jìn)數(shù)據(jù)庫,然后公布和運(yùn)行這個類中包含的方法。
4、服務(wù)器Thin驅(qū)動程序
服務(wù)器端Thin驅(qū)動程序也是由Oracle JVM使用的,它提供對遠(yuǎn)程數(shù)據(jù)庫的訪問。
也是完全用Java編寫的。
二、導(dǎo)入JDBC包
三、注冊O(shè)racle JDBC驅(qū)動程序
必須先向java程序注冊O(shè)racle JDBC驅(qū)動程序,然后才能打開數(shù)據(jù)庫連接。
有兩種注冊O(shè)racle JDBC驅(qū)動程序的辦法。
1、使用java.lang.Class的forName()方法
例子:Class.forName("oracle.jdbc.OracleDriver");
2、使用JDBC DriverManager類的registerDriver()方法。
例子:DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
如果使用Oracle8i JDBC驅(qū)動程序,那么需要導(dǎo)入oracle.jdbc.driver.OracleDriver類,
然后注冊這個類的實(shí)例。
例子:
import oracle.jdbc.driver.OracleDriver;
DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
注意:從JDBC2.0開始,只用JDBC驅(qū)動程序的更標(biāo)準(zhǔn)辦法是通過數(shù)據(jù)源。
四、打開數(shù)據(jù)庫連接
必須先打開數(shù)據(jù)庫連接,然后才能在Java程序中執(zhí)行SQL語句。打開數(shù)據(jù)庫連接
的主要辦法。
1、DriverManager類的getConnection()方法。
DriverManager.getConnection(URL,USERNAME,PASSWROD);
URL:程序要連接的數(shù)據(jù)庫,以及要使用的JDBC驅(qū)動程序
URL的結(jié)構(gòu)依賴于JDBC驅(qū)動程序的生產(chǎn)商。對于Oracle JDBC驅(qū)動程序,數(shù)據(jù)庫URL的結(jié)構(gòu):
driver_name@driver_informationdriver_name是程序使用的Oracle JDBC驅(qū)動程序的名稱。如:
jdbc:oracle:thin Oracle JDBC Thin驅(qū)動程序
jdbc:oracle:oci Oracle JDBC OCI驅(qū)動程序
jdbc:oracle:oci8 Oracle JDBC OCI驅(qū)動程序
driver_information是連接數(shù)據(jù)庫所需的驅(qū)動程序特有的信息。這依賴于使用的驅(qū)動程序。
對于Oracle JDBC Thin驅(qū)動程序,可以用
host_name:port:database_sid 或者 Oracle Net關(guān)鍵字-值對
(description=(address=(host=host_name)(protocol=tcp)(port=port()
(connect_data=(sid=database_sid)))
host_name: 運(yùn)行數(shù)據(jù)庫的機(jī)器的名稱
port: Net數(shù)據(jù)庫監(jiān)聽器等待這個端口上的請求,默認(rèn)是1521
database_sid: 要連接的數(shù)據(jù)庫實(shí)例的Oracle SID。
USERNAME: 程序連接數(shù)據(jù)庫時使用的數(shù)據(jù)庫用戶名
PASSWROD: 用戶名的口令
例子:
Connection myConnection=DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:ORCL",
"store_user",
"store_password");
Connection myConnection=DriverManager.getConnection(
"jdbc:oracle:oci:@(description=(address=(host=localhost)"+
"(protocol=tcp)(port=1521))(connect_data=(sid=ORCL)))",
"store_user",
"store_password");
2、使用Oracle數(shù)據(jù)源對象,必須先創(chuàng)建這個對象,然后連接它,與DriverManager.getConnection方法
相比,Oracle數(shù)據(jù)源使用了一種更標(biāo)準(zhǔn)化的方式提供連接數(shù)據(jù)庫所需的各種參數(shù)。
要想使用Oracle數(shù)據(jù)源,有三個步驟:
A.創(chuàng)建oracle.jdbc.pool.OracleDataSource類的Oracle數(shù)據(jù)源對象
import oracle.jdbc.pool.OracleDataSource;
OracleDataSource myDataSource=new OracleDataSource();
B.設(shè)置Oracle數(shù)據(jù)源對象屬性,oracle.jdbc.pool.OracleDataSource類實(shí)際上實(shí)現(xiàn)了
JDBC提供的javax.sql.DataSource接口。
Javax.sql.DataSource接口的屬性
屬性名
屬性說明
屬性類型
databaseName
數(shù)據(jù)庫名
String
dataSourceName
底層數(shù)據(jù)源類的名稱
String
description
數(shù)據(jù)源的說明
String
networkProtocol
用于與數(shù)據(jù)庫通信的網(wǎng)絡(luò)協(xié)議。這只用于Oracle JDBC OCI驅(qū)動程序,默認(rèn)值是”TCP”
String
password
用戶名的口令
String
portNumber
Oracle Net監(jiān)聽器等待著個端口上數(shù)據(jù)庫連接請求。默認(rèn)值是1521
int
derverName
數(shù)據(jù)庫服務(wù)器的機(jī)器名
String
user
數(shù)據(jù)庫用戶名
String
oracle.jdbc.pool.OracleDataSource類還提供了另一組屬性
OracleDataSource屬性
屬性名
屬性說明
屬性類型
driverType
要使用的JDBC驅(qū)動程序。如果要使用服務(wù)器內(nèi)部驅(qū)動程序,那么這設(shè)置為”kprb”,而且此屬性的其他設(shè)置被忽略
String
url
可以用于指定Oracle數(shù)據(jù)庫URL,這可以代替設(shè)置數(shù)據(jù)庫位置。
String
tnsEntry Name
可以用于指定Oracle Net TNSNAMES字符串,在使用OCI驅(qū)動程序時也可以用于指定數(shù)據(jù)庫位置
String
屬性的get/set方法就像javabean的get/set寫法規(guī)則一樣。
注意:沒有g(shù)etPassword()方法。
例子:
myDataSource.setServerName("localhost");
myDataSource.setDatabaseName("localhost");
myDataSource.setDriverType("oci");
myDataSource.setNetworkProtocol("tcp");
myDataSource.setPortNumber(1521);
myDataSource.setUser("admin");
myDataSource.setPassword("helloworld");
String serverName=myDataSource.getServerName();
int portNumber=myDataSource.getPortNumber();
一旦設(shè)置了OracleDatatSource對象的屬性,就可以使用它連接數(shù)據(jù)庫了。
C.通過Oracle數(shù)據(jù)源對象連接數(shù)據(jù)庫
Connection myConnection=myDataSource.getConnection();
也可以
Connection myConnection=myDataSource.getConnection("newOne","learning");
這個寫法的用戶名和口令將覆蓋剛才在myDataSource中設(shè)置的用戶名和口令。因此將使用
用戶名newOne,口令learning連接數(shù)據(jù)庫。
一旦得到Connection對象,就可以使用它創(chuàng)建JDBC Statement對象。
五、創(chuàng)建JDBC Statement對象
需要創(chuàng)建java.sql.Statement類的JDBC Statement對象,然后才能使用JDBC發(fā)出SQL語句。
Statement對象用于表示一個SQL語句:DML語句(select,insert,update或delete)或DDL語句(create table)
Statement myStatement=myConnection.createStatement();
根據(jù)SQL語句,就使用Statement類的不同方法執(zhí)行SQL。
select-------------------->executeQuery()
insert,update,delete---->executeUpdate()
如果預(yù)先不知道要執(zhí)行SQL語句的類型,可以使用execute()方法,execute()方法也可以執(zhí)行DDL語句。
當(dāng)然還有個PrepareStatement類可以用于代表JDBC(詳細(xì)見另外文章)。
一旦得到了Statement對象,就可以使用JDBC發(fā)出SQL語句了。
六、從數(shù)據(jù)庫獲取數(shù)據(jù)
使用JDBC執(zhí)行select語句,要使用Statement對象的executeQuery(select語句)方法,因?yàn)閟elect語句可能返回多行,
所以executeQuery()方法返回一個對象,其中存儲了select語句返回的行。它是java.sql.ResultSet類的實(shí)例。
使用ResultSet對象從數(shù)據(jù)庫讀取行時,有三個步驟:
1、創(chuàng)建和填充ResultSet對象(具體ResultSet類型操作資料這里沒有討論:P)。
Resultset rs=myStatement.executeQuery("select user,sysdate from dual");
2、從Resultset對象讀取列值
這里要理解Oracle和java類型的映射關(guān)系
Java與Oracle可兼容的類型映射
Oracle類型
Java類型
CHAR
String
VARCHAR2
String
DATE
java.sql.Date 日期
java.sql.Time 時間
java.sql.Timestamp 日期和時間
INTEGER
short
int
long
NUMBER
float
double
java.matn.BigDecimal
int和String類型是核心JAVA的一部分,而java.sql.Date屬于JDBC,它是核心JAVA的擴(kuò)展。
JDBC提供的類型沒有完全覆蓋Oracle使用的所有類型,就如rowid類型,就必須使用
oracle.sql.ROWID類型存儲。
例子:
while(rs!=null && rs.next()){
String user=rs.getString("user");
String sysdate=rs.getString(2);
//至于Date類型,就要注意日期和時間的區(qū)別,最好使用Timestamp
java.sql.Timestamp hopeDateTemp=rsResult.getTimestamp("sysdate");
java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm");
String hopeDate=sdf.format(hopeDateTemp);//(這里主要是JDBC,就不詳細(xì)討論了:p)
}
JDBC提供的next()方法訪問ResultSet對象中的第一行,以后每次對next()方法的調(diào)用會前進(jìn)到
下一行。當(dāng)rs沒有更多的行讀取時,next()返回false;這里建議的是ResultSet只是個臨時數(shù)據(jù)
集合,如果Connection斷開了,ResultSet里面的數(shù)據(jù)也沒有了,所以最好使用Java的變量或?qū)ο?div style="height:15px;">