top
Loading...
淺析數據源在JDBC中的應用
簡介

眾所周知,JDBC(Java數據庫連接)是Java 2企業版的重要組成部分。它是基于SQL層的API。通過把SQL語句嵌入JDBC接口的方法中,用戶可以通過Java程序執行幾乎所有的數據庫操作。JDBC只提供了接口,具體的類的實現要求數據庫的設計者完成。通過生成這些接口的實例,即使對于不同的數據庫,Java程序也可以正確地執行SQL調用。所以對于程序員來說,不必把注意力放在如何向數據庫發送SQL指令,因為程序員需要了解和用到的只是JDBC的接口,只有在極少數情況下會用到面向特定數據庫的類,例如程序員希望使用ORACLE的擴展API。

在JDBC程序中,首先需要做的是實現與數據庫的連接。在示例程序中,我們使用的是ORACLE8i的JDBC包。連接數據庫通常需要實現以下幾個步驟:

1. 注冊數據庫驅動程序(driver)。可以通過調用java.sql.DriverManager類的registerDriver方法顯式注冊驅動程序,也可以通過加載數據庫驅動程序類隱式注冊驅動程序。例如我們希望向虛擬機注冊Oracle8i JDBC驅動程序

// 顯式注冊
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
// 隱式注冊
Class.forName(“oracle.jdbc.driver.OracleDriver”);

關于虛擬機如何自動注冊通過類加載器(ClassLoader)加載的數據庫驅動程序超過了本文討論的范圍,在此不做詳細討論。

2. 建立連接。調用java.sql.DriverManager類的getConnection()方法可以建立與數據庫的連接。GetConnection()方法返回一個Connection對象。需要注意的是,getConnection()方法會自動從數據庫驅動程序注冊表中選擇一個最合適的驅動程序。

3. 建立連接后,允許自動更新(AutoCommit)。調用java.sql.Connection接口的serAutoCommit()方法可以設定當程序向數據庫發出一條SQL指令后,數據庫是否立即更新。

下面是一個具體的實例。在該實例中,作為getConnection()方法參數的url使用的是Net8 keyword-value pair格式。當然也可以使用普通格式。數據庫安裝在名為Chicago的服務器上,使用的協議是TCP協議,使用的端口是1521,數據庫的SID是chidb,使用的數據庫驅動程序是Oracle JDBC Thin驅動程序。

import java.sql.*;

// 初始化常數
private static String url =
“jdbc:oracle:thin:@(description=(address=(host=Chicago)” +
“(protocol=tcp)(port=1521))(connect_data=(sid=chidb)))”;
// 也可以設定url為“jdbc:oracle:thin:@ Chicago:1521:chidb”
private static String username = “guest”;
private static String password = “guest”;

try
{
// 注冊數據庫
Class.forName(“oracle.jdbc.driver.OracleDriver”);
// 建立連接
Connection conn =
DriverManager.getConnection(url, username, password);
// 允許自動更新
Conn.setAutoCommit(true);
}
catch(ClassNotFoundException e )
{
e.printStackTrace();
}
catch(SQLException e)
{
e.printStackTrace();
}

從實際應用的角度出發,我們可以看出采取這種方式連接到數據庫存在幾個問題。第一是安全性問題,由于程序代碼中包含用戶名和密碼,其他人如果能得到bytecode,可以通過反編譯工具獲得用戶名和密碼。第二是代碼的可移植性問題。如果希望連接的數據庫名稱或用戶名有所更改,程序員需要修改源程序,然后把修改過的程序發送給用戶。也就是說,軟件無法脫離數據庫獨立存在。這樣不僅會大大提高軟件的成本,也不利于軟件本身的發展。還可能出現這樣的情況:在某些情況下,提供數據的機構不希望數據庫的用戶名和密碼讓編寫程序的程序員知道知道。這樣就提出了一個問題,如何使Java和數據庫之間建立連接時隱藏一些敏感的信息。

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗