JDBC數據庫連接
安裝相應的驅動程序後,現在是時候來學習使用JDBC建立數據庫連接了。
建立JDBC連接所涉及的編程相當簡單。 以下是基本的四個步驟 -
- 導入JDBC包:使用Java語言的
import
語句在Java代碼開頭位置導入所需的類。 - 註冊JDBC驅動程序:使JVM將所需的驅動程序實現加載到內存中,從而可以滿足JDBC請求。
- 數據庫URL配置:創建一個正確格式化的地址,指向要連接到的數據庫(如:MySQL,Oracle和MSSQL等等)。
- 創建連接對象:最後,調用
DriverManager
對象的getConnection()
方法來建立實際的數據庫連接。
1. 導入JDBC包
import
語句告訴Java編譯器在哪裏找到在代碼中引用的類,import
語句一般放置在源代碼的開頭。
要使用標準的JDBC包,它允許在數據庫表中執行選擇,插入,更新和刪除數據,請將以下導入添加到源代碼中 -
import java.sql.* ; // for standard JDBC programs
import java.math.* ; // for BigDecimal and BigInteger support
2. 註冊JDBC驅動程序
在使用程序之前,必須先註冊該驅動程序。 註冊驅動程序是將Oracle驅動程序的類文件加載到內存中的過程,因此可以將其用作JDBC接口的實現。
只需在程序中一次註冊就可以。可以通過兩種方式之一來註冊驅動程序。
2.1 方法I - Class.forName()
註冊驅動程序最常見的方法是使用Java的Class.forName()
方法,將驅動程序的類文件動態加載到內存中,並將其自動註冊。這個方法是推薦使用的方法,因爲它使驅動程序註冊可配置和便攜。
以下示例使用Class.forName()
註冊Oracle驅動程序 -
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
}
catch(ClassNotFoundException ex) {
System.out.println("Error: unable to load driver class!");
System.exit(1);
}
使用JDBC驅動程序連接MySQL數據庫的示例代碼片段 -
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()
方法來解決不合規的JVM,但是必須編寫兩個額外的異常,如下所示:
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);
}
2.2 方法II - DriverManager.registerDriver()
第二種方法是使用靜態DriverManager.registerDriver()
方法來註冊驅動程序。
如果使用的是非JDK兼容的JVM(如Microsoft提供的),則應使用registerDriver()
方法。
以下示例使用registerDriver()
註冊Oracle驅動程序 -
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);
}
數據庫URL配置
加載驅動程序後,可以使用DriverManager.getConnection()
方法建立連接。 爲了方便參考,這裏列出三個重載的DriverManager.getConnection()
方法 -
-
getConnection(String url)
-
getConnection(String url, Properties prop)
-
getConnection(String url, String user, String password)
這裏每個格式都需要一個數據庫URL。 數據庫URL是指向數據庫的地址。
制定數據庫URL是建立連接相關聯的大多數錯誤問題發生的地方。
下表列出了常用的JDBC驅動程序名稱和數據庫URL。
RDBMS
JDBC驅動程序名稱
URL格式
MySQL
com.mysql.jdbc.Driver
jdbc:mysql://hostname/databaseName
ORACLE
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:[@hostname](https://github.com/hostname "@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格式的所有突出部分都是靜態的,只需要根據數據庫設置更改對應的部分。
創建連接對象
上面列出了三種形式的DriverManager.getConnection()
方法來創建一個連接對象。
使用具有用戶名和密碼的數據庫URL
getConnection()
最常用的形式要求傳遞數據庫URL,用戶名和密碼:
假設使用Oracle thin驅動程序,那麼需要爲URL的數據庫部分指定:host:port:databaseName
值。
如果主機名爲amrood的TCP/IP地址爲192.0.0.10,並且Oracle偵聽器配置爲偵聽端口1521
,並且要連接的數據庫名稱是EMP
,則完整的數據庫URL將是 -
jdbc:oracle:thin:@amrood:1521:EMP
// 或者
jdbc:oracle:thin:@192.0.0.10:1521:EMP
現在必須使用適當的用戶名和密碼調用getConnection()
方法獲取一個Connection
對象,如下所示:
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);
僅使用數據庫URL
DriverManager.getConnection()
方法的第二種形式只需要數據庫URL -
DriverManager.getConnection(String url);
但是,在本示例中,數據庫URL包括用戶名和密碼,並具有以下一般形式 -
jdbc:oracle:driver:username/password@database
所以,上述連接可以使用如下方式創建 -
String URL = "jdbc:oracle:thin:username/[email protected]:1521:EMP";
Connection conn = DriverManager.getConnection(URL);
使用數據庫URL和Properties對象
DriverManager.getConnection()
方法的第三種形式需要一個數據庫URL和一個Properties
對象 -
DriverManager.getConnection(String url, Properties info);
Properties
對象包含一組鍵-值對。 在調用getConnection()
方法時,它用於將驅動程序屬性傳遞給驅動程序。
要進行與上述示例相同的連接,請使用以下代碼 -
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連接
在JDBC程序結束之後,顯式地需要關閉與數據庫的所有連接以結束每個數據庫會話。 但是,如果在編寫程序中忘記了關閉也沒有關係,Java的垃圾收集器將在清除過時的對象時也會關閉這些連接。
依靠垃圾收集,特別是數據庫編程,是一個非常差的編程實踐。所以應該要使用與連接對象關聯的close()
方法關閉連接。
要確保連接已關閉,可以將關閉連接的代碼中編寫在「finally
」塊中。 一個finally
塊總是會被執行,不管是否發生異常。
要關閉上面打開的連接,應該調用close()
方法如下 -
conn.close();
顯式關閉連接可節省數據庫系統的資源。爲了更好的理解,建議您學習的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!");
}
}
}