JDBC是什么?
JDBC API是一個Java API,可以訪問任何類型表列數(shù)據(jù),特別是存儲在關(guān)系數(shù)據(jù)庫中的數(shù)據(jù)。JDBC代表Java數(shù)據(jù)庫連接。 JDBC庫中所包含的API任務(wù)通常與數(shù)據(jù)庫使用:
先決條件:學(xué)習(xí)JDBC,需要在以下兩個主題有一定的了解: JDBC - 環(huán)境設(shè)置:請確認(rèn)您已完成以下設(shè)置:
除上述者外,需要建立一個數(shù)據(jù)庫,為本程測試項(xiàng)目使用。假設(shè)這是EMP,在同一個數(shù)據(jù)庫上創(chuàng)建表Employees。 創(chuàng)建JDBC應(yīng)用程序:參與建立一個JDBC應(yīng)用程序,本教程中按六個步驟進(jìn)行: 導(dǎo)入包:這需要你有軟件包包含了數(shù)據(jù)庫編程所需的JDBC類。大多數(shù)情況下,使用import java.sql.* 就足夠了,如下所示: //STEP 1. Import required packages import java.sql.*; 注冊JDBC驅(qū)動程序:這需要初始化驅(qū)動程序,這樣就可以打開與數(shù)據(jù)庫的通信信道。以下是代碼片段實(shí)現(xiàn)這一目標(biāo): //STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); 打開一個連接:這需要使用DriverManager.getConnection()方法來創(chuàng)建一個Connection對象,它代表一個物理連接的數(shù)據(jù)庫,如下所示: //STEP 3: Open a connection // Database credentials static final String USER = "username"; static final String PASS = "password"; System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); 執(zhí)行一個查詢:這需要使用一個對象類型Statement或PreparedStatement構(gòu)建,并提交一個SQL語句到數(shù)據(jù)庫。如下: //STEP 4: Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql = "SELECT id, first, last, age FROM Employees"; ResultSet rs = stmt.executeQuery(sql); 如果有一個SQL UPDATE,INSERT或DELETE語句,那么需要下面的代碼片段: //STEP 4: Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql = "DELETE FROM Employees"; ResultSet rs = stmt.executeUpdate(sql); 從結(jié)果集中提取數(shù)據(jù):這一步是必需的情況下,從數(shù)據(jù)庫中獲取數(shù)據(jù)??梢允褂眠m當(dāng)?shù)腞esultSet.getXXX()方法來檢索的數(shù)據(jù)結(jié)果如下: //STEP 5: Extract data from result set while(rs.next()){ //Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); } 清理環(huán)境:應(yīng)該明確地關(guān)閉所有的數(shù)據(jù)庫資源,對依賴于JVM的垃圾收集如下: //STEP 6: Clean-up environment rs.close(); stmt.close(); conn.close(); 第一個JDBC 程序:基于上面的步驟,我們可以有以下綜合示例代碼,我們可以用它作為模板而寫JDBC代碼: //STEP 1. Import required packages import java.sql.*; public class FirstExample { // JDBC driver name and database URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; // Database credentials static final String USER = "username"; static final String PASS = "password"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ //STEP 2: Register JDBC driver Class.forName("com.mysql.jdbc.Driver"); //STEP 3: Open a connection System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //STEP 4: Execute a query System.out.println("Creating statement..."); stmt = conn.createStatement(); String sql; sql = "SELECT id, first, last, age FROM Employees"; ResultSet rs = stmt.executeQuery(sql); //STEP 5: Extract data from result set while(rs.next()){ //Retrieve by column name int id = rs.getInt("id"); int age = rs.getInt("age"); String first = rs.getString("first"); String last = rs.getString("last"); //Display values System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", First: " + first); System.out.println(", Last: " + last); } //STEP 6: Clean-up environment rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ //Handle errors for JDBC se.printStackTrace(); }catch(Exception e){ //Handle errors for Class.forName e.printStackTrace(); }finally{ //finally block used to close resources try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// nothing we can do try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); }//end finally try }//end try System.out.println("Goodbye!"); }//end main }//end FirstExample - by www. 現(xiàn)在讓我們來編譯上面的例子如下: C:\>javac FirstExample.java C:\> 當(dāng)你運(yùn)行FirstExample的,它會產(chǎn)生以下結(jié)果: C:\>java FirstExample Connecting to database... Creating statement... ID: 100, Age: 18, First: Zara, Last: Ali ID: 101, Age: 25, First: Mahnaz, Last: Fatma ID: 102, Age: 30, First: Zaid, Last: Khan ID: 103, Age: 28, First: Sumit, Last: Mittal C:\> SQLException方法:一個SQLException既可以發(fā)生在驅(qū)動程序和數(shù)據(jù)庫。當(dāng)這樣的異常時,SQLException類型的對象將被傳遞到catch子句。
通過利用從Exception對象提供的信息,可以捕獲一個異常,并適當(dāng)?shù)乩^續(xù)運(yùn)行程序。這是一個try塊中的一般形式: try { // Your risky code goes between these curly braces!!! } catch(Exception ex) { // Your exception handling code goes between these // curly braces, similar to the exception clause // in a PL/SQL block. } finally { // Your must-always-be-executed code goes between these // curly braces. Like closing database connection. } JDBC - 數(shù)據(jù)類型:下表總結(jié)了默認(rèn)的JDBC數(shù)據(jù)類型的Java數(shù)據(jù)類型轉(zhuǎn)換,當(dāng)調(diào)用PreparedStatement或CallableStatement對象的setXXX()方法,或ResultSet.updateXXX()方法。
JDBC3.0的增強(qiáng)支持BLOB,CLOB,ARRAY,REF數(shù)據(jù)類型。的ResultSet對象UPDATEBLOB(),updateCLOB(),updateArray()和updateRef()方法,使您可以在服務(wù)器上直接操作相應(yīng)的數(shù)據(jù)。 setXXX()和updateXXX()方法,可以轉(zhuǎn)換成特定的Java類型到特定的JDBC數(shù)據(jù)類型。setObject()和updateObject()方法,幾乎所有的Java類型映射到JDBC數(shù)據(jù)類型。 ResultSet對象提供相應(yīng)的getXXX()方法為每個數(shù)據(jù)類型來檢索列值。每一種方法,可以使用與列名或由它的序號位置。
JDBC - 批量處理:批處理允許一個批處理組相關(guān)的SQL語句,并將其提交的一個調(diào)用到數(shù)據(jù)庫。 當(dāng)幾個SQL語句一次發(fā)送到數(shù)據(jù)庫中,可以減少通信開銷,從而提高性能。
JDBC - 數(shù)據(jù)流:PreparedStatement對象有能力使用提供參數(shù)數(shù)據(jù)的輸入和輸出流。這使您可以將整個文件到數(shù)據(jù)庫中,可容納較大的值,如CLOB和BLOB數(shù)據(jù)類型的列。 有下列方法可用于流數(shù)據(jù):
setXXXStream()方法需要一個額外的參數(shù),文件大小,除了參數(shù)占位符。此參數(shù)通知應(yīng)發(fā)送多少數(shù)據(jù)的數(shù)據(jù)庫,使用流的驅(qū)動程序。 對于一個詳細(xì)的關(guān)于所有這些概念,需要去通過學(xué)習(xí)完整的教程。 |
|