分析各種Oracle JDBC驅動程序的細節
連接Oracle數據庫的各種oracle JDBC驅動程序的細節。
這些細節包括:
1、導入JDBC包
2、注冊oracle JDBC驅動程序
3、打開數據庫連接
4、執行SQL DML語句在數據庫表中獲取、添加、修改和刪除行
一、Oracle JDBC驅動程序
共有有4種
1、Thin驅動程序
Thin驅動程序是所有驅動程序中資源消耗最小的,而且完全用java編寫的。
該驅動程序只使用TCP/IP且要求Oracle Net。被稱為第4類驅動程序。
它使用TTC協議與Oracle數據庫進行通信。能夠在Applet、Application中使用。
2、OCI驅動程序
OCI驅動比Thin需要資源要多,但性能通常好一點。OCI驅動適合于部署在
中間層的軟件,如Web服務器。不能在applet中使用OCI驅動。是第2類驅動程序。
不完全用java寫的,還包含了c代碼。該驅動有許多附加的性能增強特性,
包括高級的連接緩沖功能。
注意:OCI驅動要求在客戶計算機上安裝它。
3、服務器內部驅動程序
服務器內部驅動程序提供對數據庫的直接訪問,Oracle JVM使用它與數據庫進行通信。
Oracle JVM是與數據庫集成的Java Virtual Machine,可以使用Oracle JVM將
Java類裝載進數據庫,然后公布和運行這個類中包含的方法。
4、服務器Thin驅動程序
服務器端Thin驅動程序也是由Oracle JVM使用的,它提供對遠程數據庫的訪問。
也是完全用Java編寫的。
二、導入JDBC包
三、注冊Oracle JDBC驅動程序
必須先向java程序注冊Oracle JDBC驅動程序,然后才能打開數據庫連接。
有兩種注冊Oracle JDBC驅動程序的辦法。
1、使用java.lang.Class的forName()方法
例子:Class.forName("oracle.jdbc.OracleDriver");
2、使用JDBC DriverManager類的registerDriver()方法。
例子:DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
如果使用Oracle8i JDBC驅動程序,那么需要導入oracle.jdbc.driver.OracleDriver類,
然后注冊這個類的實例。
例子:
- import oracle.jdbc.driver.OracleDriver;
- DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
注意:從JDBC2.0開始,只用JDBC驅動程序的更標準辦法是通過數據源。
四、打開數據庫連接
必須先打開數據庫連接,然后才能在Java程序中執行SQL語句。打開數據庫連接
的主要辦法。
1、DriverManager類的getConnection()方法。
DriverManager.getConnection(URL,USERNAME,PASSWROD);
URL:程序要連接的數據庫,以及要使用的JDBC驅動程序
URL的結構依賴于JDBC驅動程序的生產商。對于Oracle JDBC驅動程序,數據庫URL的結構:
driver_name@driver_information
driver_name是程序使用的Oracle JDBC驅動程序的名稱。如:
jdbc:oracle:thin Oracle JDBC Thin驅動程序
jdbc:oracle:oci Oracle JDBC OCI驅動程序
jdbc:oracle:oci8 Oracle JDBC OCI驅動程序
driver_information是連接數據庫所需的驅動程序特有的信息。這依賴于使用的驅動程序。
對于Oracle JDBC Thin驅動程序,可以用
host_name:port:database_sid 或者 Oracle Net關鍵字值對
(description=(address=(host=host_name)(protocol=tcp)(port=port()
(connect_data=(sid=database_sid)))
host_name: 運行數據庫的機器的名稱
port: Net數據庫監聽器等待這個端口上的請求,默認是1521
database_sid: 要連接的數據庫實例的Oracle SID。
USERNAME: 程序連接數據庫時使用的數據庫用戶名
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數據源對象,必須先創建這個對象,然后連接它,與DriverManager.getConnection方法
相比,Oracle數據源使用了一種更標準化的方式提供連接數據庫所需的各種參數。
Oracle數據源對象也可以向JNDI注冊(見另外一篇學習筆記http://blog.csdn.net/207/archive/2004/12/15/217518.aspx)。
要想使用Oracle數據源,有三個步驟:
A.創建oracle.jdbc.pool.OracleDataSource類的Oracle數據源對象
- import oracle.jdbc.pool.OracleDataSource;
- OracleDataSource myDataSource=new OracleDataSource();
B.設置Oracle數據源對象屬性,oracle.jdbc.pool.OracleDataSource類實際上實現了
JDBC提供的javax.sql.DataSource接口。
Javax.sql.DataSource接口的屬性
屬性名
屬性說明
屬性類型
databaseName
數據庫名
String
dataSourceName
底層數據源類的名稱
String
description
數據源的說明
String
networkProtocol
用于與數據庫通信的網絡協議。這只用于Oracle JDBC OCI驅動程序,默認值是”TCP”
String
password
用戶名的口令
String
portNumber
Oracle Net監聽器等待著個端口上數據庫連接請求。默認值是1521
int
derverName
數據庫服務器的機器名
String
user
數據庫用戶名
String
oracle.jdbc.pool.OracleDataSource類還提供了另一組屬性
OracleDataSource屬性
屬性名
屬性說明
屬性類型
driverType
要使用的JDBC驅動程序。如果要使用服務器內部驅動程序,那么這設置為”kprb”,而且此屬性的其他設置被忽略
String
url
可以用于指定Oracle數據庫URL,這可以代替設置數據庫位置。
String
tnsEntry Name
可以用于指定Oracle Net TNSNAMES字符串,在使用OCI驅動程序時也可以用于指定數據庫位置
String
屬性的get/set方法就像javabean的get/set寫法規則一樣。
注意:沒有getPassword()方法。
例子:
- 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();
一旦設置了OracleDatatSource對象的屬性,就可以使用它連接數據庫了。
C.通過Oracle數據源對象連接數據庫
Connection myConnection=myDataSource.getConnection();
也可以
Connection myConnection=myDataSource.getConnection("newOne","learning");
這個寫法的用戶名和口令將覆蓋剛才在myDataSource中設置的用戶名和口令。因此將使用
用戶名newOne,口令learning連接數據庫。
一旦得到Connection對象,就可以使用它創建JDBC Statement對象。
五、創建JDBC Statement對象
需要創建java.sql.Statement類的JDBC Statement對象,然后才能使用JDBC發出SQL語句。
Statement對象用于表示一個SQL語句:DML語句(select,insert,update或delete)或DDL語句(create table)
Statement myStatement=myConnection.createStatement();
根據SQL語句,就使用Statement類的不同方法執行SQL。
- select>executeQuery()
- insert,update,delete>executeUpdate()
如果預先不知道要執行SQL語句的類型,可以使用execute()方法,execute()方法也可以執行DDL語句。
當然還有個PrepareStatement類可以用于代表JDBC(詳細見另外文章)。
一旦得到了Statement對象,就可以使用JDBC發出SQL語句了。
六、從數據庫獲取數據
使用Oracle JDBC驅動程序執行select語句,要使用Statement對象的executeQuery(select語句)方法,因為select語句可能返回多行,
所以executeQuery()方法返回一個對象,其中存儲了select語句返回的行。它是java.sql.ResultSet類的實例。
使用ResultSet對象從數據庫讀取行時,有三個步驟:
1、創建和填充ResultSet對象(具體ResultSet類型操作資料這里沒有討論:P)。
Resultset rs=myStatement.executeQuery("select user,sysdate from dual");
2、從Resultset對象讀取列值
這里要理解Oracle和java類型的映射關系
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的擴展。
JDBC提供的類型沒有完全覆蓋Oracle使用的所有類型,就如rowid類型,就必須使用
oracle.sql.ROWID類型存儲。
例子:
- while(rs!=null && rs.next()){
- String user=rs.getString("user");
- String sysdate=rs.getString(2);
- //至于Date類型,就要注意日期和時間的區別,***使用Timestamp
- java.sql.Timestamp hopeDateTemp=rsResult.getTimestamp("sysdate");
- java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyyMMdd HH:mm");
- String hopeDate=sdf.format(hopeDateTemp);//(這里主要是JDBC,就不詳細討論了:p)
- }
JDBC提供的next()方法訪問ResultSet對象中的***行,以后每次對next()方法的調用會前進到
下一行。當rs沒有更多的行讀取時,next()返回false;這里建議的是ResultSet只是個臨時數據
集合,如果Connection斷開了,ResultSet里面的數據也沒有了,所以***使用Java的變量或對象
把rs的數據復制過來。
七、關閉ResultSet對象(吃完東西抹嘴)
例子:
rs.close();
八、INSERT、UPDATE、DELETE數據庫記錄
上面提到過使用SQL INSERT語句向數據庫插入、修改、刪除記錄。JDBC有兩種方式:
a.使用Statement類中定義的executeUpdate()方法
b.使用PrepareStatement類中定義的execute()方法
使用OCI方式,則必須在本機安裝ORACLE CLIENT,并且注冊一個service name,在URL中使用這個NAME。很顯然這種方式可以用于app server,但不適用于applet,甚至applicaion。這種連接方式功能比較強大,可以直接用getBinaryStream方法來存取blob字段,為oracle所推薦,但據有關測試,這種方式的速度并沒有thin方式的快。
使用thin方式,其實是直接通過網絡端口存取ORACLE,所以無須在本機安裝ORACLE CLIENT,比較適用于thin client(從名字上也可以看出用途),如applet等。但功能上稍弱,主要是在blob字段的存取上。只能使用Oracle提供的Blob類來做。
【編輯推薦】