安裝相應(yīng)的驅(qū)動(dòng)程序后,現(xiàn)在是時(shí)候來(lái)學(xué)習(xí)使用JDBC建立數(shù)據(jù)庫(kù)連接了。
建立JDBC連接所涉及的編程相當(dāng)簡(jiǎn)單。 以下是基本的四個(gè)步驟 -
import
語(yǔ)句在Java代碼開(kāi)頭位置導(dǎo)入所需的類。DriverManager
對(duì)象的getConnection()
方法來(lái)建立實(shí)際的數(shù)據(jù)庫(kù)連接。import
語(yǔ)句告訴Java編譯器在哪里找到在代碼中引用的類,import
語(yǔ)句一般放置在源代碼的開(kāi)頭。
要使用標(biāo)準(zhǔn)的JDBC包,它允許在數(shù)據(jù)庫(kù)表中執(zhí)行選擇,插入,更新和刪除數(shù)據(jù),請(qǐng)將以下導(dǎo)入添加到源代碼中 -
import java.sql.* ; // for standard JDBC programs
import java.math.* ; // for BigDecimal and BigInteger support
在使用程序之前,必須先注冊(cè)該驅(qū)動(dòng)程序。 注冊(cè)驅(qū)動(dòng)程序是將Oracle驅(qū)動(dòng)程序的類文件加載到內(nèi)存中的過(guò)程,因此可以將其用作JDBC接口的實(shí)現(xiàn)。
只需在程序中一次注冊(cè)就可以??梢酝ㄟ^(guò)兩種方式之一來(lái)注冊(cè)驅(qū)動(dòng)程序。
注冊(cè)驅(qū)動(dòng)程序最常見(jiàn)的方法是使用Java的Class.forName()
方法,將驅(qū)動(dòng)程序的類文件動(dòng)態(tài)加載到內(nèi)存中,并將其自動(dòng)注冊(cè)。這個(gè)方法是推薦使用的方法,因?yàn)樗跪?qū)動(dòng)程序注冊(cè)可配置和便攜。
以下示例使用Class.forName()
注冊(cè)O(shè)racle驅(qū)動(dòng)程序 -
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
System.exit(1);
}
使用JDBC驅(qū)動(dòng)程序連接MySQL數(shù)據(jù)庫(kù)的示例代碼片段 -
Class.forName("com.mysql.jdbc.Driver");
Connection conn = null;
conn = DriverManager.getConnection("jdbc:mysql://hostname:port/db_name","db_username", "db_password");
conn.close();
使用getInstance()
方法來(lái)解決不合規(guī)的JVM,但是必須編寫兩個(gè)額外的異常,如下所示:
try {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
System.exit(1);
catch(IllegalAccessException ex) {
System.out.println("Error: access problem while loading!");
System.exit(2);
catch(InstantiationException ex) {
System.out.println("Error: unable to instantiate driver!");
System.exit(3);
}
第二種方法是使用靜態(tài)DriverManager.registerDriver()
方法來(lái)注冊(cè)驅(qū)動(dòng)程序。
如果使用的是非JDK兼容的JVM(如Microsoft提供的),則應(yīng)使用registerDriver()
方法。
以下示例使用registerDriver()
注冊(cè)O(shè)racle驅(qū)動(dòng)程序 -
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ū)動(dòng)程序后,可以使用DriverManager.getConnection()
方法建立連接。 為了方便參考,這里列出三個(gè)重載的DriverManager.getConnection()
方法 -
getConnection(String url)
getConnection(String url, Properties prop)
getConnection(String url, String user, String password)
這里每個(gè)格式都需要一個(gè)數(shù)據(jù)庫(kù)URL。 數(shù)據(jù)庫(kù)URL是指向數(shù)據(jù)庫(kù)的地址。
制定數(shù)據(jù)庫(kù)URL是建立連接相關(guān)聯(lián)的大多數(shù)錯(cuò)誤問(wèn)題發(fā)生的地方。
下表列出了常用的JDBC驅(qū)動(dòng)程序名稱和數(shù)據(jù)庫(kù)URL。
RDBMS | JDBC驅(qū)動(dòng)程序名稱 | URL格式 |
---|---|---|
MySQL | com.mysql.jdbc.Driver |
jdbc:mysql://hostname/databaseName |
ORACLE | oracle.jdbc.driver.OracleDriver |
jdbc:oracle:thin:@hostname:portNumber:databaseName |
PostgreSQL | org.postgresql.Driver |
jdbc:postgresql://hostname:port/dbname |
DB2 | com.ibm.db2.jdbc.net.DB2Driver |
jdbc:db2:hostname:port Number/databaseName |
Sybase | com.sybase.jdbc.SybDriver |
jdbc:sybase:Tds:hostname: portNumber/databaseName |
URL格式的所有突出部分都是靜態(tài)的,只需要根據(jù)數(shù)據(jù)庫(kù)設(shè)置更改對(duì)應(yīng)的部分。
上面列出了三種形式的DriverManager.getConnection()
方法來(lái)創(chuàng)建一個(gè)連接對(duì)象。
getConnection()
最常用的形式要求傳遞數(shù)據(jù)庫(kù)URL,用戶名和密碼:
假設(shè)使用Oracle thin驅(qū)動(dòng)程序,那么需要為URL的數(shù)據(jù)庫(kù)部分指定:host:port:databaseName
值。
如果主機(jī)名為amrood的TCP/IP地址為192.0.0.10,并且Oracle偵聽(tīng)器配置為偵聽(tīng)端口1521
,并且要連接的數(shù)據(jù)庫(kù)名稱是EMP
,則完整的數(shù)據(jù)庫(kù)URL將是 -
jdbc:oracle:thin:@amrood:1521:EMP
// 或者
jdbc:oracle:thin:@192.0.0.10:1521:EMP
現(xiàn)在必須使用適當(dāng)?shù)挠脩裘兔艽a調(diào)用getConnection()
方法獲取一個(gè)Connection
對(duì)象,如下所示:
String URL = "jdbc:oracle:thin:@amrood:1521:EMP";
// String URL = "jdbc:oracle:thin:@192.0.0.10:1521:EMP";
String USER = "username";
String PASS = "password"
Connection conn = DriverManager.getConnection(URL, USER, PASS);
DriverManager.getConnection()
方法的第二種形式只需要數(shù)據(jù)庫(kù)URL -
DriverManager.getConnection(String url);
但是,在本示例中,數(shù)據(jù)庫(kù)URL包括用戶名和密碼,并具有以下一般形式 -
jdbc:oracle:driver:username/password@database
所以,上述連接可以使用如下方式創(chuàng)建 -
String URL = "jdbc:oracle:thin:username/password@192.168.0.10:1521:EMP";
Connection conn = DriverManager.getConnection(URL);
DriverManager.getConnection()
方法的第三種形式需要一個(gè)數(shù)據(jù)庫(kù)URL和一個(gè)Properties
對(duì)象 -
DriverManager.getConnection(String url, Properties info);
Properties
對(duì)象包含一組鍵-值對(duì)。 在調(diào)用getConnection()
方法時(shí),它用于將驅(qū)動(dòng)程序?qū)傩詡鬟f給驅(qū)動(dòng)程序。
要進(jìn)行與上述示例相同的連接,請(qǐng)使用以下代碼 -
import java.util.*;
String URL = "jdbc:oracle:thin:@amrood:1521:EMP";
Properties info = new Properties( );
info.put( "user", "root" );
info.put( "password", "password12321" );
Connection conn = DriverManager.getConnection(URL, info);
在JDBC程序結(jié)束之后,顯式地需要關(guān)閉與數(shù)據(jù)庫(kù)的所有連接以結(jié)束每個(gè)數(shù)據(jù)庫(kù)會(huì)話。 但是,如果在編寫程序中忘記了關(guān)閉也沒(méi)有關(guān)系,Java的垃圾收集器將在清除過(guò)時(shí)的對(duì)象時(shí)也會(huì)關(guān)閉這些連接。
依靠垃圾收集,特別是數(shù)據(jù)庫(kù)編程,是一個(gè)非常差的編程實(shí)踐。所以應(yīng)該要使用與連接對(duì)象關(guān)聯(lián)的close()
方法關(guān)閉連接。
要確保連接已關(guān)閉,可以將關(guān)閉連接的代碼中編寫在“finally
”塊中。 一個(gè)finally
塊總是會(huì)被執(zhí)行,不管是否發(fā)生異常。
要關(guān)閉上面打開(kāi)的連接,應(yīng)該調(diào)用close()
方法如下 -
conn.close();
顯式關(guān)閉連接可節(jié)省數(shù)據(jù)庫(kù)系統(tǒng)的資源。為了更好的理解,建議您學(xué)習(xí)的JDBC示例代碼教程。
參考Oracle+JDBC示例代碼:
package com.yiibai;
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
public class OracleJDBCExample {
public static void main(String[] argv) {
System.out.println("-------- Oracle JDBC Connection Testing ------");
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("Where is your Oracle JDBC Driver?");
e.printStackTrace();
return;
}
System.out.println("Oracle JDBC Driver Registered!");
Connection connection = null;
try {
connection = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:1521:xe", "system", "password");
} catch (SQLException e) {
System.out.println("Connection Failed! Check output console");
e.printStackTrace();
return;
}
if (connection != null) {
System.out.println("You made it, take control your database now!");
} else {
System.out.println("Failed to make connection!");
}
}
}