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

}