Servlet&JSP的那些事兒(十一)

來源:互聯網
上載者:User

作為web開發的一部分,資料庫訪問也是必不可少的。我們先瞭解一下JDBC吧。

JDBC

JDBC(java database connectivity,java資料庫連接)是API(API),它描述了一套訪問關聯式資料庫的標準java類庫。使用這些API,可以串連資料庫,然後執行sql語句對資料庫進行操作。JDBC也為資料庫廠商提供了一個標準的體繫結構,廠商可以為自己的產品提供JDBC驅動程式,這些驅動程式就能讓java應用程式直接存取他們的資料庫產品,從而提高java程式訪問資料庫的效率。

JDBC驅動程式可以分為四種:JDBC-ODBC橋、部分本地API,部分java驅動程式、JDBC網路純java驅動程式以及本地協議純java驅動程式。

1)JDBC-ODBC橋顧名思義,就是用JDBC API調用ODBC去訪問資料庫,因為ODBC出現的比JDBC早,這適用於資料庫產品只提供了ODBC驅動程式的情況,因為它的執行效率比較低。
2)部分本地API,部分java驅動程式即通過java程式調用本地API來實現資料庫操作。JDBC API先調用本地API執行操作,執行結果通過本地API返回給JDBC驅動程式,再由JDBC驅動程式將結果轉化為JDBC標準形式返回給使用者。
3)JDBC網路純java驅動程式利用作為中介軟體的應用伺服器來訪問資料庫。
4)本地協議純java驅動程式通過與資料庫建立直接的通訊端串連,採用具體於纏上的網路通訊協定把JDBC API調用轉化為直接的網路調用。這種驅動程式效率是最高的。

如何安裝資料庫在這裡就不再贅述了。本文採用的是MySql資料庫。為:點擊開啟連結

windows環境下有直接的安裝器,還需要下載連接器。下載後安裝與配置即可。(不會的話Google之~)

JDBC API

JDBC API包含在JDK中,被分為兩個包:java.sql和javax.sql。java.sql包定義了訪問資料庫的介面和類。我們先看看訪問資料庫的過程 :

1)載入並註冊資料庫驅動
2)建立到資料庫的串連
3)訪問資料庫

程式碼範例為:

Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManger.getConnection("jdbc:mysql://localhost:3306/book","root","shan");Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery("select * form books");

載入並註冊資料庫驅動

java.sql.Driver介面是所有JDBC驅動程式需要實現的介面,它是給資料庫廠商使用的,不同廠商實現該介面的類名是不同的。mysql實現Driver介面的類名為:com.mysql.jdbc.Driver。載入JDBC驅動是調用Class類的靜態方法forName(),向其傳遞要載入的JDBC驅動的類名。在運行時,類載入器從CLASSPATH環境變數中定位和載入JDBC驅動類。載入驅動類後,會註冊一個驅動類的執行個體。

建立到資料庫的串連

我們在程式中不需要直接去訪問實現了Driver介面的驅動類,而是由驅動管理程式來管理這些驅動。Driver介面中提供了一個Connect()方法,用來建立到資料庫的串連。在建立串連時,我們使用DriverManager類(驅動管理程式)的getConnection()方法建立到資料庫的串連,它返回一個Connection對象。DriverManager類提供了三個重載的getConnection()方法。如下所示:

public static Conection getConnection(String url) throws SQLException;public static Conection getConnection(String url, String user, String passwd) throws SQLException;public static Conection getConnection(String url, Properties info) throws SQLException;

url為資料庫的url。整個url用冒號:分成三部分:協議、子協議和子名稱。文法為:jdbc:subprotocol:subname。jdbc標識協議,子協議用於標識一個資料庫驅動程式,子名稱的文法與具體驅動程式有關。mysql的資料庫url為:jdbc:mysql://localhost:3306/databasename。

user為使用者名稱,passwd為密碼。Properties包含了用於特定資料庫所需要的參數,以鍵-值對的形式給定串連參數。

訪問資料庫

建立串連以後,我們就可以訪問資料庫了。java.sql包中給定了3個介面:Statement、PreparedStatement、CallableStatement。這三個介面分別定義了對資料庫訪問的不同方式。

1)Statement

Connection中定義了createStatement()方法,用於建立一個Statement對象。Statement對象用於執行靜態sql語句,返回執行的結果。Statement介面中定義了executeQuery(String sql)來執行sql語句,並返回一個ResultSet類型的結果。executeUpdate(String sql)用於執行insert,update或delete語句。execute(String sql)方法執行返回多個結果集的sql語句。

2)ResultSet

Statement介面中的executeQuery(String sql)方法返回一個ResultSet類型的結果。ResultSet對象維護了一個指向當前資料行的遊標,初始的時候,遊標在第一行之前,可通過ResultSet對象的next()方法移動遊標到下一行。ResultSet介面中還定義了如getInt()、getString()等方法。可擷取當前行中列的資料。

3)PreparedStatement

我們在程式中傳遞的sql語句在執行前必須被先行編譯,然後才能被資料庫引擎執行。如果重複執行只有參數不同的sql語句,比較低效。而如果你要用不同的參數來多次執行同一個sql語句,可以使用PreparedStatement語句。用法如下:

PreparedStatement pstmt = conn.prepareStatement("insert student values (?,?)");pstmt.setInt(1,1);pstmt.setString(2,"shan");pstmt.executeUpdate();pstmt.setInt(1,2);pstmt.setString(2,"dong");pstmt.executeUpdate();

4)CallableStatement

CallableStatement用於執行sql預存程序。CallableStatement從PreparedStatement繼承而來。在執行預存程序之前,凡是預存程序中類型為out的參數都必須被註冊。可通過registerOutParameter()方法來完成。用法如下:

CallableStatement cstmt = conn.prepareCall("call p_changesal(?,?)");cstmt.registerOutParameter(2,java.sql.Types.INTEGER);cstmt.setInt(1,1234);cstmt.execute();int price = cstmt.getInt(2);

5)中繼資料

我們可能需要擷取資料庫表本身的資訊。可以使用ResultSet對象的getMetaData()方法來得到ResultSetMetaData對象。ResultSetMetaData對象中定義了一些常用的方法,如getColumnCount(),getColumnDisplaySize(),getColunmName()等。

交易處理

如果網上購物的支付功能,使用者進入結算中心,確認訂單後,程式會擷取單價和數目,然後計算總價,然後計算使用者餘額是否足夠支付,之後更新貨物資料。不過就在此時,伺服器崩潰了,重新啟動後,發現貨物數目減少了,但收入卻沒有增加。因為更新使用者餘額的操作因為故障沒有操作。要解決這種問題,就需要交易處理機制。

事務是指構成單個邏輯單元的操作集合。交易處理保證所有事務都作為一個工作單元來執行,即使出現硬體故障或系統失靈,也不能改變這種執行方式。為了將多個sql語句作為一個交易處理,需要調用Connection對象的setAutoCommit()方法,傳入false來取消自動認可事務。在所有sql語句執行成功後,調用commit()方法提交,或者在出錯時,調用rollback()方法來復原(就是回到初始狀態)。關於交易處理的具體概念,請參考資料庫書籍理解。

JDBC資料來源和串連池

前面我們講到了串連資料庫的一種方式。現在我們繼續講另外一種方式。在javax.sql包中,定義了DataSource介面,它為我們提供了另外一種串連方式。利用DataSource來建立資料庫連接,不需要載入驅動,不需要使用管理類。在程式中,會通過向一個JNDI(java name and directory)伺服器查詢來得到DataSource對象,然後調用DataSource對象的getConnection()方法來建立資料庫連接。使用方法如下:

javax.nameing.Context context = new javax.naming.InitialContext();//lookup用來查詢一個命名物件javax.sql.DataSource ds = (javax.sql.DataSource)context.lookup("java:comp/env/jdbc/book");java.sql.Connection conn = ds.getConnection();conn.close();

java:comp/env是環境命名內容(Environment Naming Context,ENC),引入它是為瞭解決JNDI命名衝突的問題。ENC將資源引用名與實際的JNDI名分開,從而提高了J2EE應用的移植性。

什麼是串連池?

由於建立資料庫連接相當耗時和耗費資源,而且一個資料庫伺服器能夠同時建立的串連數目也是有限的,在大型web應用中,可能同時有上千個訪問資料庫的請求。如果資料庫為每個使用者建立串連,那效能會急劇下降。為了能夠重複利用資料庫連接,提高請求的效能,所以採用串連池技術。它預先建立多個資料庫連接對象,然後將連線物件儲存到串連池中,當使用者請求到來,從池中取出一個連線物件為使用者服務,請求完成後,使用者程式調用close()方法,將連線物件放回池內。

tomcat提供了資料來源和串連池的實現。在tomcat中,可以在<context>元素的內容中使用<Resource>元素來配置JDBC資料來源。

轉載請註明出處:http://blog.csdn.net/iAm333

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.