在安裝了相應(yīng)的驅(qū)動程序之后,就可以使用JDBC建立數(shù)據(jù)庫連接了。
建立JDBC連接所涉及的編程非常簡單。這是這些簡單的四個步驟-
導(dǎo)入 JDBC 包:在Java程序中添加語句 import,以在Java代碼中導(dǎo)入所需的類。
注冊 JDBC 驅(qū)動程序: 此步驟使JVM將所需的驅(qū)動程序?qū)崿F(xiàn)加載到內(nèi)存中,從而可以滿足您的JDBC請求。
數(shù)據(jù)庫 URL 配置: 這是為了創(chuàng)建一個格式正確的地址,該地址指向您要連接的數(shù)據(jù)庫。
建立連接對象:最后,編寫對DriverManager對象的getConnection( )方法的調(diào)用的代碼,以建立實際的數(shù)據(jù)庫連接。
Import 語句告訴 Java 編譯器在哪里可以找到代碼中引用的類,并且放在源代碼的開頭。
要使用標(biāo)準 JDBC 包(它允許您選擇、插入、更新和刪除 SQL 表中的數(shù)據(jù)) ,請將以下導(dǎo)入添加到源代碼中
import java.sql.* ; // 用于標(biāo)準JDBC程序 import java.math.* ; // 獲得BigDecimal和BigInteger支持
在使用驅(qū)動程序之前,必須在程序中注冊該驅(qū)動程序。注冊驅(qū)動程序是將 Oracle 驅(qū)動程序的類文件加載到內(nèi)存中的過程,因此可以將其用作 JDBC 接口的實現(xiàn)。
你只需要在你的程序中注冊一次。您可以通過以下兩種方式之一注冊驅(qū)動程序。
注冊驅(qū)動程序的最常見方法是使用Java的 Class.forName() 方法,將驅(qū)動程序的類文件動態(tài)加載到內(nèi)存中,內(nèi)存會自動進行注冊。此方法是可取的,因為它使您可以使驅(qū)動程序注冊成為可配置和可移植的。
以下示例 Class.forName( ) 用于注冊O(shè)racle驅(qū)動程序
try { Class.forName("oracle.jdbc.driver.OracleDriver"); } catch(ClassNotFoundException ex) { System.out.println("Error: unable to load driver class!"); System.exit(1); }
您可以使用getInstance()方法來解決不兼容的JVM,但是隨后您必須編寫兩個額外的Exception的代碼,如下所示:
try { Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); } catch(ClassNotFoundException ex) { System.out.println("錯誤:無法加載驅(qū)動程序類!"); System.exit(1); catch(IllegalAccessException ex) { System.out.println("錯誤:加載時出現(xiàn)訪問問題!"); System.exit(2); catch(InstantiationException ex) { System.out.println("錯誤:無法實例化驅(qū)動程序!"); System.exit(3); }
您可以用來注冊驅(qū)動程序的第二種方法是使用靜態(tài)方法 DriverManager.registerDriver() 。
如果使用的是不兼容JDK的JVM(例如Microsoft提供的JVM),則應(yīng)使用 registerDriver() 方法。
以下示例用于registerDriver()注冊O(shè)racle驅(qū)動程序-
try { Driver myDriver = new oracle.jdbc.driver.OracleDriver(); DriverManager.registerDriver( myDriver ); } catch(ClassNotFoundException ex) { System.out.println("Error: unable to load driver class!"); System.exit(1); }
加載驅(qū)動程序之后,可以使用 DriverManager.getConnection ()方法建立連接。為了便于參考,讓我列出 DriverManager.getConnection() 三種重載方法
getConnection(String url)
getConnection(String url, Properties prop)
getConnection(String url, String user, String password)
在這里,每種形式都需要一個數(shù)據(jù)庫URL。數(shù)據(jù)庫URL是指向您的數(shù)據(jù)庫的地址。
制定數(shù)據(jù)庫URL是與建立連接相關(guān)的大多數(shù)問題發(fā)生的地方。
下表列出了常用的JDBC驅(qū)動程序名稱和數(shù)據(jù)庫URL。
數(shù)據(jù)庫 | JDBC驅(qū)動程序名稱 | URL格式 |
---|---|---|
MySQL | com.mysql.jdbc.Driver | jdbc:mysql://hostname/ databaseName |
ORACLE | oracle.jdbc.driver.OracleDriver | jdbc:oracle:thin:@hostname:port Number:databaseName |
DB2 | COM.ibm.db2.jdbc.net.DB2Driver | jdbc:db2:hostname:port Number/databaseName |
Sybase | com.sybase.jdbc.SybDriver | jdbc:sybase:Tds:hostname: port Number/databaseName |
URL格式中所有突出顯示的部分都是靜態(tài)的,您只需要根據(jù)數(shù)據(jù)庫設(shè)置更改其余部分。
我們列出了三種 DriverManager.getConnection() 創(chuàng)建連接對象的方法。
getConnection() 最常用的形式要求您傳遞數(shù)據(jù)庫URL,用戶名和密碼
假設(shè)您正在使用Oracle的thin驅(qū)動程序,則將為URL的數(shù)據(jù)庫部分指定 host:port:databaseName 值。
如果您在TCP / IP地址192.0.0.1上擁有一個主機,其主機名為 amrood,并且您的Oracle監(jiān)聽器配置為在端口1521上,并且您的數(shù)據(jù)庫名稱為EMP,則完整的數(shù)據(jù)庫URL將為-
jdbc:oracle:thin:@amrood:1521:EMP
現(xiàn)在,您必須使用正確的用戶名和密碼來調(diào)用方法getConnection(),以獲取Connection對象,如下所示:
String URL = "jdbc:oracle:thin:@amrood:1521:EMP"; String USER = "username"; String PASS = "password" Connection conn = DriverManager.getConnection(URL, USER, PASS);
DriverManager.getConnection( )方法的第二種形式僅需要數(shù)據(jù)庫URL-
DriverManager.getConnection(String url);
但是,在這種情況下,數(shù)據(jù)庫URL包含用戶名和密碼,并具有以下常規(guī)形式-
jdbc:oracle:driver:username/password@database
因此,可以如下創(chuàng)建上述連接-
String URL = "jdbc:oracle:thin:username/password@amrood:1521:EMP"; Connection conn = DriverManager.getConnection(URL);
DriverManager.getConnection( )方法的第三種形式需要數(shù)據(jù)庫URL和Properties對象-
DriverManager.getConnection(String url, Properties info);
屬性對象包含一組關(guān)鍵字-值對。它用于在調(diào)用getConnection()方法期間將驅(qū)動程序?qū)傩詡鬟f給驅(qū)動程序。
要建立與前面的示例相同的連接,請使用以下代碼-
import java.util.*; String URL = "jdbc:oracle:thin:@amrood:1521:EMP"; Properties info = new Properties( ); info.put( "user", "username" ); info.put( "password", "password" ); Connection conn = DriverManager.getConnection(URL, info);
在JDBC程序的末尾,要求顯式地關(guān)閉與數(shù)據(jù)庫的所有連接以結(jié)束每個數(shù)據(jù)庫會話。但是,如果您忘記了,Java的垃圾收集器在清理舊對象時將關(guān)閉該連接。
依靠垃圾回收,特別是在數(shù)據(jù)庫編程中,是非常差勁的編程實踐。您應(yīng)該養(yǎng)成始終使用與連接對象關(guān)聯(lián)的 close()方法,來關(guān)閉數(shù)據(jù)庫連接的習(xí)慣。
為了確保關(guān)閉連接,您可以在代碼中提供一個“ finally”塊。finally塊總是執(zhí)行,而不考慮的異常的發(fā)生與否。
要關(guān)閉上面打開的連接,您應(yīng)該按以下方式調(diào)用 close() 方法:
conn.close();
顯式關(guān)閉連接可以節(jié)省DBMS資源,這將使您的數(shù)據(jù)庫管理員滿意。
為了更好地理解,我們建議您學(xué)習(xí)JDBC-示例代碼教程。