Java與SQL Server, MySql, Oracle, Access的連接方法以及一些異常 .

 
解決(Windows)

JavaSE 2009-10-07 13:28:21 閱讀305 評論1   字號: 訂閱

I. 概述

1.1 JDBC概念

JDBC(Java Database Connectivity)是Java語言爲了支持SQL功能而提供的與數據庫連接的用戶的接口,JDBC中包括了一組由(Java)語言書寫的接口和類,它們都是獨立於特定的DBMS,或者說他們可以和各種數據庫相關聯。

1.2 JDBC用途

JDBC由一組Java語言編寫的類和接口組成,使用內嵌式的SQL,主要實現三方面功能:建立於數據庫的鏈接,執行SQL聲明以及處理SQL執行結果;JDBC支持基本的SQL功能,使用它可以方便地與不同的關係型數據庫建立聯繫,進行相關操作,並無需再爲不同的DBMS分別編寫程序。

在JDBC出現之前,通過Java訪問數據庫唯一方法是利用Java輸入輸出流訪問iruwuqi端的CGI程序,通過CGI程序訪問和操作數據庫並得到結果。每一次訪問都會由Web服務器啓動一個新的CGI進程與數據庫建立連接,在這種方式下,訪問效率和速度都很低,且容易引入錯誤。

1.3 JDBC結構和特點

簡單的說,JDBC能完成下列三件事:

  • 與一個數據庫建立連接;
  • 向數據庫發送SQL語句;
  • 處理數據庫返回的結果。

JDBC包含兩部分與數據庫獨立的API:面向程序開發人員的JDBC API和麪向底層的JDBC Driver API。

面向程序開發人員的JDBC API被描述成聚集抽象的Java接口,通過這些接口應用程序可以對某個數據庫打開連接,執行SQL語句並且處理結構。最重要的接口有如下幾種:

  • java.sql.DriverManager: 處理驅動的調入並且對產生新的數據庫連接提供支持
  • java.sql.Connection: 代表隊特定數據庫的連接
  • java.sql.Statement: 代表一個特定的容器, 來對一個特定的數據庫執行SQL語句
  • java.sql.ResultSet: 控制對一個特定語句進行數據的存取

其中java.sql.Statement又有兩個子類:java.sql.PreparedStatement用於執行預編譯的SQL語句和java.sql.CallableStatement用於執行對一個數據庫內嵌過程的調用。

面向底層的JDBC Driver API 主要是針對數據庫廠商開發數據庫底層驅動程序使用的,一般情況下用於開發應用程序的程序員用不到這些類庫。Java的應用程序員通過SQL包中的定義的一系列抽象類對數據庫進行操作,而實現這些抽象類並完成實際操作的是數據庫驅動器Driver運行的。

1.4 JDBC與其他的API

處理JDBC之外,到目前爲止,微軟的ODBC可能是用的最爲廣泛的訪問關係數據庫的API,甚至比JDBC的應用更加廣泛,它提供了連接幾乎任何一種平臺、任何一種數據庫的能力。當然也可以在java中直接使用ODBC,在JDBC的協助下,用JDBC-ODBC橋接器實現。但是爲什麼要用JDBC呢?

  • ODBC並不適合在Java中直接使用。
  • 完全精確地實現從C代碼ODBC到Java API編寫的JDBC的翻譯也並不令人滿意。
  • ODBC並容易學習,它將簡單和複雜特性混雜,。
  • JDBC這樣的Java API 對於純Java方案來說是必須的。

 版本即平臺聲明:JDK   1.7

MyEclipse   7.5

Access   2007

Sql Server  2008

MySql   5.1

Oracle  9i

平臺 Windows XP SP3

 


II. Java與Access數據庫(Access2007)

2.1 加載驅動

引入相應的類和包,使用JDBC的源程序都需要輸入java.sql包,必要的時候還需要載入JDBC-ODBC驅動包:

import sun.jdbc.odbc.JdbcOdbcDriver必要的話引入javax.sql。

2.2 加載數據源

這裏所謂的數據源就是用Access建立的數據庫文件。假設該源名爲IProducts.mdb。按照以下步驟:

控制面板——管理工具——數據源(ODBC)  (如圖2.1)1圖2.1 

打開ODBC Data Source Administrator對話框——選擇系統DSN(不選用戶DSN,因爲系統DSN可以避免調試時候出現權限問題),然後“添加”,在彈出的頁面選擇Microsoft Access Driver(裝了2007,可以選*.mdb, *.accdb)(如圖2.2)

2

圖2.2

“完成”——“選擇”

3

圖2.3

在右邊選擇要添加的數據庫文件,“數據源名”裏填寫“IProducts”(這個隨意填寫,不過要記住後面要用到的)。

2.3 代碼實現

CODE:

public boolean linkByUsingAccess() {
        Statement stat = null;
        Connection con = null;
        ResultSet rs = null;
        try {
            // 加載JDBC驅動
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            // 創建數據庫連接
            con = DriverManager.getConnection("jdbc:odbc:IProducts", "","");

        // 沒有設置密碼,所以用戶名和密碼留空

            String sql = "select * from devil_lang_map";
            stat = con.createStatement();
            rs = stat.executeQuery(sql);
            int i = 97;
            while (rs.next()) {
                String value = rs.getString("human");
                treeMap.put(((char) i++) + "", value);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stat != null) {
                    stat.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
                return false;
            }
        }
        return true;
    }

2.4 注意

2.4.1 在裝載驅動時(執行Class.forName()),驅動將自動向JDBC註冊自己。需要注意的是,使用Class.forName()方法可能拋出一個ClassNotFoundException異常,所以在驅動程序類有可能不存在時,會拋出這個異常。

2.4.2 打開連接於數據庫建立連接的標準方法是調用DriverManager.getConnection。該方法接收含有某個URL的字符串。DriverManager類(即所謂的JDBC管理層)將嘗試找到可與那個URL所代表的數據庫進行連接的驅動程序。DriverManager類存有已註冊的Driver類的清單。當調用方法getConnection時,它將檢查清單中的每個驅動程序,知道找到可與URL中指定的數據庫進行連接的驅動程序爲止,Driver Manager的getConnection方法使用這個URL來建立市級的鏈接。

2.4.3 JDBC URL的標準語法由三部分組成,各部分間用冒號分隔,例如jdbc:<子協議>:<子名稱>

  • jdbc——協議。JDBC URL中的協議總是JDBC;
  • <子協議>——驅動程序名或數據庫連接機制(可以一個或多個驅動程序支持)。子協議名的典型事例是odbc,該名稱是爲用於指定ODBC風格的數據資源名稱的URL專門保留的。例如,爲了通過JDBC-ODBC橋來訪問某個數據庫。
  • <子名稱>——一種標識數據庫的方法。

 


III. Java與SQL Server數據庫(SQL Server2008)

(注:爲方便起見,下面的Sql Server一律以SS代替)

3.1 連接代碼與語句分析

3.1.1 重要語句功能簡述

Class.forName(“xxx”);

JDBC中已經有多個驅動,此句話是遍歷系統中已經註冊的驅動程序,直到找到一個正確的驅動程序。

Connection con = DriverManager.getConnection(url);

如果無法獲得連接,程序將會拋出一個異常,所以如果程序已經執行到這裏,說明已經連接成功。

3.1.2 代碼

CODE:

public void testSQLServer() {
        Connection con = null;
        Statement stat = null;
        ResultSet rs = null;
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            //DriverManager.setLogStream(System.out);
            String url = "jdbc:sqlserver://localhost:1492;databasename=javaDB";
            String user = "JavaDB";
            String password = "8316051";
            con = DriverManager.getConnection(url, user, password);
            stat = con.createStatement();
            String sql = "select * from currentdb";
            rs = stat.executeQuery(sql);
            while(rs.next()) {
                System.out.println("DB_Name: " + rs.getString("NAME"));
                System.out.println("DB_Corporation: " + rs.getString("CORPORATION"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stat != null) {
                    stat.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
}

3.2 Sql Server 2008錯誤解決與MyEclipse連接SS異常解決

3.2.1 驅動引導問題

首先,從官網上下載驅動:http://www.microsoft.com/downloadS/details.aspx?familyid=99B21B65-E98F-4A61-B811-19912601FDC9&displaylang=zh-cn

此驅動同時支持SS2000, SS2005, SS2008。

加載方法在工程上右鍵——Properties——Java Build Path——Libraries——Add External JARs..然後選擇jar包即可。

驅動中有兩個jar包sqljdbc.jar和sqljdbc4.jar。

分別加載後如圖3.1和3.2

 

2

 

 

 

圖3.1

4

圖3.2

然而加載sqljdbc.jar後連接數據庫提示如下異常:(圖3.3)

1

圖3.3

後來移除了sqljdbc.jar(移除方法同加載方法,只是選擇不同而已),加載sqljdbc4.jar,連接SS數據庫只需要將包引入,而不需顯示地將包import。(如圖3.4)

3

圖3.4

3.2.2 MyEclipse異常

提示信息:com.microsoft.sqlserver.jdbc.SQLServerException: 通過端口 1368 連接到主機 localhost 的 TCP/IP 連接失敗。錯誤:“Connection refused: connect。請驗證連接屬性,並檢查 SQL Server 的實例正在主機上運行,且在此端口接受 TCP/IP 連接,還要確保防火牆沒有阻止到此端口的 TCP 連接。”。

解決方案:

  • 檢查驅動連接語句“con = DriverManager.getConnection(url, user, password);“一句中的端口號是否與Sql Server Configuration Manager中的TCP/IP裏面設置的TCP端口一致;
  • 在cmd中輸入”telnet localhost port”來檢查某個端口是否已經開啓,如果提示無法開啓端口,則證明該端口由於某種原因無法開啓。禁用TCP/IP服務,然後重啓;
  • 重啓Sql Server服務(Express版本顯示爲Sql Server(Express))。

提示信息:com.microsoft.sqlserver.jdbc.SQLServerException: 用戶 'JavaDB' 登錄失敗。

分析:程序能夠運行到此,證明數據庫加載正確。

解決方法:

  • 用戶名或密碼錯誤;
  • 數據庫中不存在此用戶。

 

3.2.3 SS數據庫錯誤:

提示信息:已成功與服務器建立連接,但是在登錄過程中發生錯誤。   (provider:   共享內存提供程序,   error:   0   -   管道的另一端上無任何進程。) 

解決方法:

  • 選中服務器(右鍵)->屬性->安全性->服務器身份驗證修改爲"SQL SERVER和WINDOWS身份驗證模式";
  • 展開服務器上的"安全性"->登陸名->選中SA登陸帳號(右鍵)->狀態->登陸修改爲啓用;
  • 重啓Sql Server服務即可。(注:必須重啓才能見效);
  • 重啓Microsoft SQL Server Management Studio(不是必須的)。

問題描述:在登錄時無法打開默認數據庫

解決方法:

此問題與上一個問題有所關聯。是沒有設置“用戶映射”數據庫。用另外一個可用的用戶登錄,然後選擇“安全性”——“登錄名”——“用戶映射”,選擇一個數據庫。

問題描述:使用新建的賬戶登錄之後發現數據庫中只有系統數據庫,刷新提示“無法爲該請求檢索數據”

解決方法:使用具有sysadmin權限的賬戶登錄,然後在“安全性”——“登錄名”中右鍵點新用戶的用戶名,在彈出的“登錄屬性”對話框中選擇“服務器角色”,選擇“sysadmin”。此時刷新新用戶,就會看到其他的數據庫。如果要設置新用戶的owner,則在“登錄屬性”對話框中選擇“用戶映射”,選中要設置的數據庫,選中下面的“db_owner”即可。

3.2.4 創建一個新賬戶

在一個具有sysadmin權限的賬戶中點擊“安全性”——“登錄名“右鍵點擊,然後在用戶名一欄輸入用戶名,選擇Windows認證或者Sql Server認證,然後輸入密碼(Windows認證不需要),取消密碼過期一項,在最底下選擇數據庫和語言,然後確認。

 


IV. Java與Oracle數據庫

4.1 加載驅動

該驅動所在位置是:

Oracle安裝目錄——Ora92——lib——ojdbc14.jar

注:如果不加載驅動,則異常爲:java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver

4.2 連接代碼

CODE:

public Oracle() {
        Connection con = null;
        Statement stat = null;
        ResultSet rs = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String url = "jdbc:oracle:thin:@localhost:1521:Jason";
            String user = "scott";
            String password = "tiger";
            con = DriverManager.getConnection(url, user, password);
            stat = con.createStatement();
            String sql = "select * from emp";
            rs = stat.executeQuery(sql);
            while(rs.next()) {
                System.out.println(rs.getString(1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stat != null) {
                    stat.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
}

 

 


V. Java與My SQL

5.1 加載驅動

加載驅動:mysql-connector-java-5.1.5-bin.jar

5.2 代碼

CODE;

public testMySql() {
        Connection con = null;
        Statement stat = null;
        ResultSet rs = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/datang";
            String user = "root";
            String password = "admin";
            con = DriverManager.getConnection(url, user, password);
            stat = con.createStatement();
            String sql = "select * from t_admin";
            rs = stat.executeQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getString(1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stat != null) {
                    stat.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
}

 
發佈了6 篇原創文章 · 獲贊 5 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章