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