鍍金池/ 教程/ Java/ JDBC數(shù)據(jù)庫(kù)連接
JDBC Like子句實(shí)例
JDBC異常
JDBC排序數(shù)據(jù)實(shí)例
JDBC事務(wù)保存點(diǎn)(setSavepoint, releaseSavepoint )實(shí)例
JDBC結(jié)果集
JDBC Statement對(duì)象執(zhí)行批量處理實(shí)例
JDBC事務(wù)
JDBC SQL語(yǔ)法
JDBC快速入門教程
JDBC創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例
JDBC流ASCII和二進(jìn)制數(shù)據(jù)
JDBC刪除表實(shí)例
JDBC Statements, PreparedStatement和CallableStatement語(yǔ)句
JDBC WHERE子句條件實(shí)例
JDBC插入數(shù)據(jù)實(shí)例
JDBC驅(qū)動(dòng)程序類型
JDBC環(huán)境配置
JDBC數(shù)據(jù)庫(kù)連接
JDBC刪除數(shù)據(jù)實(shí)例
JDBC PrepareStatement對(duì)象執(zhí)行批量處理實(shí)例
JDBC刪除數(shù)據(jù)庫(kù)實(shí)例
JDBC事務(wù)提交/回滾實(shí)例
JDBC更新數(shù)據(jù)實(shí)例
JDBC存儲(chǔ)過(guò)程調(diào)用
JDBC教程
JDBC批量處理
JDBC創(chuàng)建表實(shí)例
JDBC數(shù)據(jù)類型
JDBC是什么?
JDBC簡(jiǎn)單示例代碼
JDBC選擇數(shù)據(jù)庫(kù)實(shí)例
JDBC查詢數(shù)據(jù)實(shí)例

JDBC數(shù)據(jù)庫(kù)連接

安裝相應(yīng)的驅(qū)動(dòng)程序后,現(xiàn)在是時(shí)候來(lái)學(xué)習(xí)使用JDBC建立數(shù)據(jù)庫(kù)連接了。

建立JDBC連接所涉及的編程相當(dāng)簡(jiǎn)單。 以下是基本的四個(gè)步驟 -

  • 導(dǎo)入JDBC包:使用Java語(yǔ)言的import語(yǔ)句在Java代碼開(kāi)頭位置導(dǎo)入所需的類。
  • 注冊(cè)JDBC驅(qū)動(dòng)程序:使JVM將所需的驅(qū)動(dòng)程序?qū)崿F(xiàn)加載到內(nèi)存中,從而可以滿足JDBC請(qǐng)求。
  • 數(shù)據(jù)庫(kù)URL配置:創(chuàng)建一個(gè)正確格式化的地址,指向要連接到的數(shù)據(jù)庫(kù)(如:MySQL,Oracle和MSSQL等等)。
  • 創(chuàng)建連接對(duì)象:最后,調(diào)用DriverManager對(duì)象的getConnection()方法來(lái)建立實(shí)際的數(shù)據(jù)庫(kù)連接。

1. 導(dǎo)入JDBC包

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

2. 注冊(cè)JDBC驅(qū)動(dòng)程序

在使用程序之前,必須先注冊(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)程序。

2.1 方法I - Class.forName()

注冊(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);
}

2.2 方法II - DriverManager.registerDriver()

第二種方法是使用靜態(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);
}

數(shù)據(jù)庫(kù)URL配置

加載驅(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)的部分。

創(chuàng)建連接對(duì)象

上面列出了三種形式的DriverManager.getConnection()方法來(lái)創(chuàng)建一個(gè)連接對(duì)象。

使用具有用戶名和密碼的數(shù)據(jù)庫(kù)URL

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);

僅使用數(shù)據(jù)庫(kù)URL

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);

使用數(shù)據(jù)庫(kù)URL和Properties對(duì)象

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);

關(guān)閉JDBC連接

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

}