JDBC操作數(shù)據(jù)庫的基本流程是什么
所有的JDBC應用程序都具有下面的基本流程:
1、建立到數(shù)據(jù)庫的連接。
2、執(zhí)行SQL語句。
3、處理結(jié)果。
4、從數(shù)據(jù)庫斷開連接。
下面我們就來仔細看一看每一個步驟。
建立到數(shù)據(jù)庫的連接
通過JDBC使用數(shù)據(jù)庫的第一步就是建立一個連接。JDBC連接是由URL指定的,它的格式如下:
jdbc::
其中subprotocol是被請求的數(shù)據(jù)庫連接的類型(如ODBC,ORACLE,Informix等等),而subname提供了所要建立的連接的一些附加信息。當JDBC驅(qū)動程序管理器收到一個連接的URL時,所有已知的JDBC驅(qū)動程序會被詢問是否可以為這個URL服務(wù)。請求一個通過JDBC-ODBC橋到叫做MyData的ODBC數(shù)據(jù)源的連接的例子如下:
Connection con = DriverManage.getconnection(“jdbc:odbc:MyData”);
看上去一切都很順利,但是JDBC驅(qū)動程序管理器是怎么知道哪些JDBC驅(qū)動程序在當前的系統(tǒng)中可用呢?有兩種機制可以通知驅(qū)動程序管理器一個JDBC驅(qū)動程序可以使用:sql.drivers屬性和JDBC驅(qū)動程序注冊。
驅(qū)動程序管理器引用sql.drivers系統(tǒng)屬性來取得當前系統(tǒng)中可用的JDBC驅(qū)動程序列表。這個系統(tǒng)屬性包含一些用冒號隔開的JDBC驅(qū)動程序的類名,通過這個類名,驅(qū)動程序管理器可以試圖滿足一個連接請求。
使用驅(qū)動程序注冊更為常見。這種方法使你對你要使用的JDBC驅(qū)動程序有更多的控制。所有的JDBC驅(qū)動程序在實例化的時候都必須在驅(qū)動程序管理器中注冊自己,注冊可以通過下列兩個方法來實現(xiàn):
1.Class.forName(“foo.Driver”).newInstance();
2.new foo.Driver();
我個人比較喜歡使用Class.forName()這種方法,不過這兩種方法的效果是相同的。JDBC驅(qū)動程序用驅(qū)動程序管理器注冊自己,這樣,它就可以為連接請求服務(wù)了。
執(zhí)行SQL語句
在數(shù)據(jù)庫連接成功建立之后,我們就可以執(zhí)行那些完成實際工作的SQL語句了。在執(zhí)行SQL語句之前,我們必須首先創(chuàng)建一個語句對象,這個對象提供了到特定數(shù)據(jù)庫SQL引擎的接口。有下列三種不同類型的語句對象:
1.Statement——基本的語句對象,它提供了直接在數(shù)據(jù)庫中執(zhí)行SQL語句的方法。對于那些只執(zhí)行一次的查詢以及DDL語句如CREATE TABLE,DROP TABLE等等來說,statement對象就足夠了。
2.Prepared statement——這種語句對象用于那些需要執(zhí)行多次,每次僅僅是數(shù)據(jù)取值不同的SQL語句,它還提供了一些方法,以便指出語句所使用的輸入?yún)?shù)。
3.Callable statement——這種語句對象被用來訪問數(shù)據(jù)庫中的存儲過程。它提供了一些方法來指定語句所使用的輸入輸出參數(shù)。
下面是一個用語句類來執(zhí)行SQL SELECT語句的一個例子:
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(“SELECT * FROM MyTable”);
處理結(jié)果
在執(zhí)行了一個SQL語句之后,我們必須處理得到的結(jié)果。有些語句僅僅返回一個整形數(shù),指出受到影響的行數(shù)(比如UPDATE和DELETE語句)。SQL查詢(SELECT語句)返回一個含有查詢結(jié)果的結(jié)果集。結(jié)果集由行和列組成,各列數(shù)據(jù)可以通過相應數(shù)據(jù)庫類型的一系列g(shù)et方法(如getString,getInt,getDate等等)來取得。在取得了一行數(shù)據(jù)的所有數(shù)據(jù)之后,我們可以調(diào)用next()方法來移到結(jié)果集中的下一條記錄。JDBC規(guī)范的1.1版只允許forward-onle(只向前)型的游標,而在JDBC2.0中有更健壯的游標控制功能,我們可以向后移動游標而且可以將游標移動到指定行。
從數(shù)據(jù)庫斷開連接
在結(jié)果集、語句和連接對象用完以后,我們必須正確地關(guān)閉它們。連接對象、結(jié)果集對象以及所有的語句對象都有close()方法,通過調(diào)用這個方法,我們可以確保正確釋放與特定數(shù)據(jù)庫系統(tǒng)相關(guān)的所有資源。
有些開發(fā)者喜歡將引用亂放,然后用一個垃圾收集程序?qū)iT負責正確清除對象。我強烈建議大家在使用了JDBC驅(qū)動程序之后調(diào)用close()方法。這樣可以盡可能的減少由于掛起的對象殘留在數(shù)據(jù)庫系統(tǒng)中而造成的內(nèi)存泄漏。