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中的接口和類.
如下圖:

四.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();

本文涉及到了JDBC的事務處理,本人覺得WEB開發中,事務處理是一個很重要的概念,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章