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 Data Source Administrator對話框——選擇系統DSN(不選用戶DSN,因爲系統DSN可以避免調試時候出現權限問題),然後“添加”,在彈出的頁面選擇Microsoft Access Driver(裝了2007,可以選*.mdb, *.accdb)(如圖2.2)
圖2.2
“完成”——“選擇”
圖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 驅動引導問題
此驅動同時支持SS2000, SS2005, SS2008。
加載方法在工程上右鍵——Properties——Java Build Path——Libraries——Add External JARs..然後選擇jar包即可。
驅動中有兩個jar包sqljdbc.jar和sqljdbc4.jar。
分別加載後如圖3.1和3.2
圖3.1
圖3.2
然而加載sqljdbc.jar後連接數據庫提示如下異常:(圖3.3)
圖3.3
後來移除了sqljdbc.jar(移除方法同加載方法,只是選擇不同而已),加載sqljdbc4.jar,連接SS數據庫只需要將包引入,而不需顯示地將包import。(如圖3.4)
圖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();
}
}
}