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/[email protected]

所以,上述連接可以使用如下方式創建 -

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!");
        }
    }

}