JDBC的總結

工做原理流程:裝載驅動程序---->得到數據庫鏈接---->使用Statement或PreparedStatement執行SQL語句---->java

              返回執行的結果---->關閉相關的鏈接web

JDBC 原理淺析
一.本節目的:
瞭解JDBC的概念及工做原理
寫在詳解前
對JAVA基礎知識的回顧:
JAVA接口:
是一系列方法的聲明,是一些方法特徵的集合,一個接口只有方法的特徵沒有方法的實現,
所以這些方法能夠在不一樣的地方被不一樣的類實現,而這些實現能夠具備不一樣的行爲(功能)。
經過接口能夠實現不相關的類的相同行爲.
經過接口能夠指明多個類須要實現的方法.
經過接口能夠了解對象的交互方法而不須要了解對象所對應的類.
二.JDBC 概念:
     什麼是JDBC?
     通俗地說:JDBC是java和關係數據庫的之間的橋樑;
     根據"百科名片"所描述:
     JDBC(Java Data Base Connectivity,java數據庫鏈接)是一種用於執行SQL語句的Java API,能夠爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此能夠構建更高級的工具和接口,使數據庫開發人員可以編寫數據庫應用程序,同時,JDBC也是個商標名。
三.JDBC組成:
    JDBC有兩部分組成:JDBC API和JDBC Driver Interface.
    JDBC API:是提供給開發者的一組獨立於數據庫的API,對任何數據庫的操做,均可以用這組API來進行.那麼要把這些通用的API翻譯成特定數據庫能懂的"指令",就要由JDBC Driver Interface來實現了;
    JDBC Driver Interface 是面向JDBC驅動程序開發商的編程接口,它會把咱們經過JDBC API發給數據庫的通用指令翻譯給他們本身的數據庫.
    爲了使客戶端程序獨立於特定數據庫驅動程序,JDBC規範建議開發者使用接口編程方式,即儘可能使應用依賴java.sql 及javax.sql中的接口和類.
   以下圖:sql

JDBC的工做原理

四.JDBC驅動程序類型:
    <1>.JDBC-ODBC橋加ODBC驅動程序:須要ODBC驅動,適合於企業網或三層結構應用程序(經過將JDBC調用委託給ODBC接口)
    <2>.本地API:須要驅動程序的二進制代碼支持(一部分java編寫,一部分委託給數據庫客戶端代碼實現)
    <3>.JDBC網絡純java驅動程序:將JDBC轉換爲與DBMS無關的網絡協議,又被某服務器轉換爲一種DBMS協議,以操做各類數據庫(驅動程序由中間件服務器提供)
    <4>.本地協議純java驅動程序:將JDBC調用直接轉換成JDBC所使用的網絡協議 (所有由JAVA實現,直接和數據庫訪問)
五.詳解JDBC原理:
<1>. 結構:
 DriverManager (是一工廠實現類,用了工廠方法模式)
    |
 Dirver  (是驅動程序對象的接口,指向具體數據庫驅動程序對象=DriverManager.getDriver(String URL))
    |
 Connection (是鏈接對象接口,指向具體數據庫鏈接對象=Drivermanager.getConnection(String URL))
    |
 Statement (執行靜態SQL語句接口,=Connection.CreateStatement())
    |
 ResultSet  (是指向結果集對象的接口,=Statement.excuteXXX())
<2>.工做原理:
1.裝載驅動程序:(實例化時自動向DriverManager註冊(DriverManager.registerDriver())
 <1>.Class.forName(driver)
      <2>.Class.forName(driver).newInstance()
       <3>.new driver()
2.取得數據庫鏈接(Connect to the DataBase)
 <1>.用DriverManager取數據庫鏈接
     Connection cn = DriverManager.getConnection(url,uid,pwd);
 <2>.用jndi(java的命名和目錄服務)方式:多用於jsp
     Context ctx = (Context) new InitialContext().lookup("java:comp/env");
               DataSource ds = (DataSource) ctx.lookup(jndi);
     Connection cn = ds.getConnection();
3.執行sql語句(Execute the SQL)
 <1>.用Statement來執行sql語句(主要是不帶參的SQL)
               Statement sm = cn.createStatement();
     sm.executeQuery(sql); // 執行數據查詢語句(select)
     sm.executeUpdate(sql); // 執行數據更新語句(delete、update、insert、drop等)
 <2>.用PreparedStatement來執行sql語句(帶參SQL)
     String  sql  = "insert into CUSTOMER(id,name) values (?,?)";
               PreparedStatement ps = cn.prepareStatement(sql);
              ps.setInt(1,xxx);
               ps.setString(2,xxx);
              ...
              ResultSet rs = ps.executeQuery(); // 查詢
              int c = ps.executeUpdate(); // 更新
 <3>.用PreparedStatement來執行sql語句(批量更新或刪除SQL)
     PreparedStatement pstmt  =  con.prepareStatement("UPDATE EMPLOYEES  SET SALARY = ? WHERE ID = ?");
        for(int i =0;i<length;i++){
                 pstmt.setBigDecimal(1, param1[i]);
                 pstmt.setInt(2, param2[i]);
                 pstmt.addBatch();
         }
         pstmt. executeBatch();
 <4>.用CallablePrepareStatement來調用存儲過程
     CallableStatement cstmt = con.prepareCall("{call getTestData(?, ?)}");
     cstmt.registerOutParameter(1, java.sql.Types.TINYINT);
     cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3);
     cstmt.executeQuery();
     byte x = cstmt.getByte(1);
     java.math.BigDecimal n = cstmt.getBigDecimal(2, 3);數據庫

4.事務的處理(JDBC的事務處理簡單,在執行多條更新語句後,加cn.commit()或cn.rollback()就能夠)
 <1>.關閉Connection的自動提交
     connection.setAutoCommit(false);編程

 <2>.執行一系列sql語句:執行新sql前,之前的Statement(或PreparedStatemet)須close
     Statement sm ;
           sm = cn.createStatement(insert into user...);
           sm.executeUpdate();
           sm.close();
           sm = cn.createStatement("insert into corp...);
           sm.executeUpdate();
           sm.close();服務器

 

<3>.提交
     cn.commit();
 <4>.若是發生異常,回滾:
     cn.rollback();
5.處理執行結果:
 <1>.查詢語句,返回記錄集ResultSet
 <2>.更新語句,返回數字,表示該更新影響的記錄數(0,表示未更新,-1表示更新失敗)
 <3>.ResultSet的方法:while(re.next())
         next(),將遊標日後移動一行,若是成功返回true;不然返回false
         getInt("id")或getSting("name"),返回當前遊標下某個字段的值
6.關閉數據庫鏈接
 rs.close();
 ps.close(); /stat.close();
 con.close();網絡

相關文章
相關標籤/搜索