JDBC是使用Java存取資料庫系統的標準解決方案,它將不同資料庫間各自差異API與標準SQL語句分開看待,實現資料庫無關的Java操作介面。對於開發人員而言,使用JDBC統一的API介面,專註於標準SQL 語句,就可以避免直接處理底層資料庫驅動程式與相關操作介面的差異性,而將主要精力投放於應用開發本身,從而加快開發進度。
1.JDBC的API介面
JDBC規範採用介面和實現分離的思想,設計了Java資料庫編程的架構。JDBC的API提供了一組標準的Java語言中的介面和類,使用這些介面和類,Java用戶端程式可以訪問各種不同類型的資料庫。1所示。
圖1 JDBC工作原理
其中,JDBC API由sun公司提供,定義與資料庫建立串連、執行SQL語句、處理結果的方法,這些供程式員調用的介面與類,整合在java.sql和javax.sql包中。DriverManager類的作用是載入各種不同的JDBC驅動程式。而各種資料庫的JDBC驅動程式則由不同的資料庫廠商提供,用於針對具體的資料庫產品實現JDBC API中的方法。
在JDBC的API中主要提供了以下一些介面和類:Connection、DriverManager、Statement、 ResultSet、PreparedStatement、CallableStatement。
其中,Connection對象代表與資料庫的串連。串連過程包括所執行的SQL語句和在該串連上所返回的結果。一個應用程式可與單個資料庫有一個或多個串連,或者可與許多資料庫有串連。
DriverManager類是JDBC 的管理層,作用於使用者和驅動程式之間。它跟蹤可用的驅動程式,並在資料庫和相應驅動程式之間建立串連。
Statement對象用於將SQL語句發送到資料庫中。實際上有三種Statement 對象,它們都作為在給定串連上執行SQL語句的包容器:Statement、PreparedStatement和 CallableStatement。
ResultSet包含符合SQL語句中條件的所有行,並且它通過一套get方法(這些get方法可以訪問當前行中的不同列)提供了對這些行中資料的訪問。
PreparedStatement執行個體包含已編譯的SQL語句。包含於 PreparedStatement 對象中的SQL語句可具有一個或多個參數。
CallableStatement對象為所有的DBMS提供了一種以標準形式調用已儲存過程的方法。已儲存過程儲存在資料庫中。對已儲存過程的調用是CallableStatement對象所含的內容。
關於JDBC API的詳細敘述可以參見《Java資料庫介面JDBC入門基礎講座 》(http://www.yesky.com/zhuanti/443/1865943.shtml),講解的非常詳細。
2.環境搭建
下面簡單講講如何安裝MySQL資料庫和Navicat for MySQL工具。
MySQL資料庫的下載和安裝可以參見《MySQL安裝圖解》(http://www.jb51.net/article/23876.htm),這裡就不再贅述了。
Navicat for MySQL是基於Windows平台,為MySQL資料庫量身訂作的類似於MySQL的使用者管理介面工具。使用了圖形化使用者介面(GUI),可以用一種安全和更為容易的方式快速地建立、組織、存取和共用資料。
Navicat for MySQL的為:http://www.cr173.com/soft/26935.html
Navicat for MySQL的安裝和使用可以參見《Navicat MySQL安裝及使用說明》(http://wenku.baidu.com/view/6938c04b2b160b4e767fcf6b.html),這裡也不再贅述了。
運行Navicat for MySQL工具,建立一個串連到我們所安裝的MySQL資料庫的串連,這裡我建立的串連名為“myConnection”。開啟該串連,並建立一個資料庫,這裡我建立了一個名為“mydb”的資料庫。在該資料庫中,我們建立了一張名為“userinfo”的表。
做好這一切之後,我們就可以對這張表進行設計了,設計的目的在於指定資料的儲存結構。這這張表中我們儲存了id、username、password三項內容。設計好的表2所示。
圖2 表的設計
3.使用JDBC訪問MySQL資料庫
使用JDBC訪問資料庫的一般步驟如下:
3.1載入JDBC驅動程式
不同的資料庫對應著不同的驅動程式,要使用JDBC API訪問MySQL資料庫,需要在工程的libs目錄下匯入MySQL資料庫的驅動包mysql-connector-java-5.1.7-bin。
不同資料庫廠商的驅動類名不同,具體為:
Oracle10g:oracle.jdbc.driver.OracleDriver
MySQL5:com.mysql.jdbc.Driver
SQLServer2005:com.microsoft.sqlserver.jdbc.SQLServerDriver
3.2提供串連參數
不同資料庫產品的串連URL不同,具體為:
Oracle10g:jdbc:oracle:thin:@主機名稱:連接埠:資料庫SID
比如:jdbc:oracle:thin:@localhost:1521:ORCL
MySQL5:jdbc:mysql://主機名稱:連接埠/資料庫名
比如:jdbc:mysql://localhost:3306/test
SQLServer2005:jdbc:sqlserver://主機名稱:連接埠:DatabaseName=庫名
比如:jdbc:sqlserver://localhost:1433:DatabaseName=BookDB
在使用JDBC訪問資料庫時,提供的串連參數除了資料庫的URL之外,還有兩個參數:資料庫的使用者名稱和資料庫的密碼。
3.3建立一個資料庫的串連
Connection 對象是資料庫連接的具體執行個體,一個Connection 對象就代表一個資料庫連接,可以使用 DriverManager 的getConneciton()方法傳入指定資料庫的串連URL、使用者名稱和密碼。
從DriverManager中獲得Connection對象,驅動程式會自動通過DriverManager.registerDriver() 方法註冊,這樣DriverManager就可以跟廠商的驅動程式通訊了。
在串連資料庫時,需要檢測異常對象java.sql.SQLException。
建立資料庫連接的具體實現方法如下:
1 private final String USERNAME = "root"; //定義資料庫的使用者名稱 2 private final String PASSWORD = "******"; //定義資料庫的密碼 3 private final String DRIVER = "com.mysql.jdbc.Driver"; //定義資料庫的驅動資訊 4 private final String URL = "jdbc:mysql://localhost:3306/mydb"; //定義訪問資料庫的地址 5 6 /* 7 * Function : 擷取資料庫連接 8 * Author : 部落格園-依舊淡然 9 */10 public Connection getConnection() {11 try {12 mConnection = DriverManager.getConnection(URL, USERNAME, PASSWORD);13 } catch (Exception e) {14 System.out.println("串連資料庫失敗!");15 }16 return mConnection;17 }
3.4建立一個Statement對象
PreparedStatement對象用於執行動態SQL語句。SQL中會變動的部分可以使用?作為參數預留位置。
3.5執行SQL語句
對資料庫的常用操作有添加、刪除以及修改。有時我們還需要對資料庫表中的資訊進行查詢,這時我們可以使用如下方法來實現:
1 /* 2 * Function : 查詢返回單條記錄 3 * Author : 部落格園-依舊淡然 4 */ 5 public Map<String, Object> findSimpleResult(String sql, List<Object> params) 6 throws SQLException { 7 Map<String, Object> map = new HashMap<String, Object>(); 8 int index = 1; 9 mPreparedStatement = mConnection.prepareStatement(sql);10 if((params != null) && (!params.isEmpty())) {11 for(int i = 0; i < params.size(); i++) {12 mPreparedStatement.setObject(index++, params.get(i));13 }14 }15 mResultSet = mPreparedStatement.executeQuery(); //返回查詢結果16 ResultSetMetaData resultSetMateData = mResultSet.getMetaData(); //獲得列的相關資訊17 int cols_len = resultSetMateData.getColumnCount(); //獲得列的長度18 while(mResultSet.next()) {19 for(int i = 0; i < cols_len; i++) {20 String cols_name = resultSetMateData.getColumnName(i+1) ;21 Object cols_value = mResultSet.getObject(cols_name);22 if(cols_value == null) {23 cols_value = "";24 }25 map.put(cols_name, cols_value);26 }27 }28 return map;29 }
3.6處理結果
通過以上幾個步驟已經實現了對資料庫的訪問,在這一步就可以對訪問到的資料進行處理了。
3.7關閉串連
在操作完成後要把所使用的JDBC對象全都關閉,以釋放JDBC資源。具體的實現方法如下:
1 /* 2 * Function : 中斷連線 3 * Author : 部落格園-依舊淡然 4 */ 5 public void releaseConnection() { 6 if(mResultSet != null) { //關閉ResultSet對象 7 try { 8 mResultSet.close(); 9 } catch (SQLException e) {10 e.printStackTrace();11 }12 }13 if(mPreparedStatement != null) { //關閉PreparedStatement對象14 try {15 mPreparedStatement.close();16 } catch (SQLException e) {17 e.printStackTrace();18 }19 }20 if(mConnection != null) { //關閉Connection對象21 try {22 mConnection.close();23 } catch (SQLException e) {24 e.printStackTrace();25 }26 }27 }