Java與數(shù)據(jù)庫(kù)的連接_第1頁(yè)
Java與數(shù)據(jù)庫(kù)的連接_第2頁(yè)
Java與數(shù)據(jù)庫(kù)的連接_第3頁(yè)
Java與數(shù)據(jù)庫(kù)的連接_第4頁(yè)
Java與數(shù)據(jù)庫(kù)的連接_第5頁(yè)
已閱讀5頁(yè),還剩74頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

JDBC簡(jiǎn)介數(shù)據(jù)庫(kù)的應(yīng)用目前已經(jīng)非常普遍,在應(yīng)用程序的開發(fā)過(guò)程中,經(jīng)常會(huì)涉及到訪問(wèn)數(shù)據(jù)庫(kù)。Java語(yǔ)言為訪問(wèn)數(shù)據(jù)庫(kù)提供了方便的技術(shù)。Java使用JDBC(JavaDatabaseConnectivity)技術(shù)進(jìn)行數(shù)據(jù)庫(kù)的訪問(wèn)。Java應(yīng)用程序通過(guò)JDBCAPI和JDBC驅(qū)動(dòng)程序管理器進(jìn)行通信。第1頁(yè)/共79頁(yè)JDBC的誕生從ODBC到JDBCODBC(OpenDataBaseConnectivity),是一種用來(lái)在關(guān)系數(shù)據(jù)庫(kù)以及非關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)中存取數(shù)據(jù),用C語(yǔ)言實(shí)現(xiàn)的標(biāo)準(zhǔn)應(yīng)用程序接口。其主要結(jié)構(gòu):應(yīng)用程序接口、驅(qū)動(dòng)程序管理器、數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序和數(shù)據(jù)源。第2頁(yè)/共79頁(yè)JDBC的誕生以前由于沒(méi)有一個(gè)Java語(yǔ)言的數(shù)據(jù)庫(kù)API,編程人員不得不在Java程序中加入C語(yǔ)言的ODBC函數(shù)調(diào)用,從而使Java的很多優(yōu)秀特性無(wú)法充分發(fā)揮

ODBC具有不易使用,非面向?qū)ο蟮热秉c(diǎn)為了充分發(fā)揮java語(yǔ)言的特性,迎合數(shù)據(jù)庫(kù)開發(fā)的需求,sun開發(fā)了一套java語(yǔ)言的數(shù)據(jù)庫(kù)應(yīng)用程序開發(fā)接口和類,即JDBC。它在Java程序中實(shí)現(xiàn)數(shù)據(jù)庫(kù)操作功能并簡(jiǎn)化操作過(guò)程。第3頁(yè)/共79頁(yè)

JDBC為數(shù)據(jù)庫(kù)及其工具的開發(fā)人員提供了一個(gè)標(biāo)準(zhǔn)的API,使他們能夠用純JavaAPI編寫數(shù)據(jù)庫(kù)應(yīng)用程序

JDBC支持基本SQL語(yǔ)句,提供多樣化的數(shù)據(jù)庫(kù)連接方式,為各種不同的數(shù)據(jù)庫(kù)提供統(tǒng)一的操作界面

第4頁(yè)/共79頁(yè)JDBC連接數(shù)據(jù)庫(kù)的方法通過(guò)專用網(wǎng)絡(luò)協(xié)議創(chuàng)建的驅(qū)動(dòng)程序與數(shù)據(jù)庫(kù)直接通信。直接使用數(shù)據(jù)庫(kù)廠商提供的、用專用網(wǎng)絡(luò)協(xié)議創(chuàng)建的驅(qū)動(dòng)程序各大廠商都為數(shù)據(jù)庫(kù)提供了這種JDBC驅(qū)動(dòng),這種方式最簡(jiǎn)單實(shí)用。應(yīng)用程序JDBCAPI驅(qū)動(dòng)程序數(shù)據(jù)源第5頁(yè)/共79頁(yè)

通過(guò)JDBC-ODBC橋與ODBC數(shù)據(jù)庫(kù)通信Sun公司發(fā)行了一個(gè)用于訪問(wèn)ODBC數(shù)據(jù)源的驅(qū)動(dòng)程序,稱為JDBC-ODBC橋接器。該橋接器用jdbcodbc.class和一個(gè)用于訪問(wèn)ODBC驅(qū)動(dòng)程序的本地庫(kù)來(lái)實(shí)現(xiàn)的。對(duì)于Windows平臺(tái),該本地庫(kù)是一個(gè)DLL動(dòng)態(tài)鏈接庫(kù)JDBCODBC.DLL其優(yōu)點(diǎn)是使JDBC目前有能力訪問(wèn)幾乎所有的數(shù)據(jù)庫(kù)。應(yīng)用程序數(shù)據(jù)源JDBCAPIJDBC-ODBCODBCAPIODBC層第6頁(yè)/共79頁(yè)

通過(guò)部分專用的驅(qū)動(dòng)程序與數(shù)據(jù)庫(kù)通信將JDBC數(shù)據(jù)庫(kù)調(diào)用直接翻譯為廠商專用的API,執(zhí)行更有效,更快捷。應(yīng)用程序JDBCAPI驅(qū)動(dòng)程序數(shù)據(jù)源專用API第7頁(yè)/共79頁(yè)JDBCAPIJDBCAPI所有的類和接口都集中在java.sql和javax.sql這兩個(gè)包中驅(qū)動(dòng)管理器連接語(yǔ)句結(jié)果集(1)登記并加載JDBC驅(qū)動(dòng)程序(2)建立與SQL數(shù)據(jù)庫(kù)的連接(3)傳送一個(gè)SQL查詢(4)獲得結(jié)果第8頁(yè)/共79頁(yè)JDBCAPI的使用方法

注冊(cè)數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序隱式加載作為初始化的一部分,DriverManager類會(huì)嘗試加載在“jdbc.drivers”系統(tǒng)屬性中引用的驅(qū)動(dòng)程序類。這允許用戶自定義由他們的應(yīng)用程序使用的JDBCDriver。例如jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.taste.ourDriver

publicstaticvoidregisterDriver(Driver

driver)throwsSQLException

向DriverManager注冊(cè)給定驅(qū)動(dòng)程序第9頁(yè)/共79頁(yè)

一旦DriverManager類被初始化,將不再檢查jdbc.drivers屬性表需要持久的預(yù)設(shè)環(huán)境publicinterfaceDriver

每個(gè)驅(qū)動(dòng)程序類必須實(shí)現(xiàn)的接口

JavaSQL框架允許多個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序每個(gè)驅(qū)動(dòng)程序都應(yīng)該提供一個(gè)實(shí)現(xiàn)Driver接口的類

DriverManager會(huì)試著加載盡可能多的它可以找到的驅(qū)動(dòng)程序,然后,對(duì)于任何給定連接請(qǐng)求,它會(huì)讓每個(gè)驅(qū)動(dòng)程序依次試著連接到目標(biāo)URL

DriverManager.registerDriver(newcom.microsoft.jdbc.sqlserver.SQLServerDriver());第10頁(yè)/共79頁(yè)DriverManagerDriverManager類是JDBC的管理層,作用于用戶和驅(qū)動(dòng)程序之間。它跟蹤可用的驅(qū)動(dòng)程序,并在數(shù)據(jù)庫(kù)和相應(yīng)驅(qū)動(dòng)程序之間建立連接。

publicstaticDrivergetDriver(String

url)throwsSQLException

試圖查找能理解給定URL的驅(qū)動(dòng)程序。

publicstaticEnumeration<Driver>getDrivers()

檢索帶有當(dāng)前調(diào)用方可以訪問(wèn)的所有當(dāng)前已加載JDBC驅(qū)動(dòng)程序的Enumeration

publicstaticvoidregisterDriver(Driver

driver)throwsSQLException

向DriverManager注冊(cè)給定驅(qū)動(dòng)程序。在加載驅(qū)動(dòng)程序時(shí)由驅(qū)動(dòng)程序自動(dòng)調(diào)用第11頁(yè)/共79頁(yè)

顯式加載

publicstaticClass<?>forName(String

className)throwsClassNotFoundException

java.lang.Class<T>

使用與當(dāng)前applet或應(yīng)用程序相同的類加載器顯式加載驅(qū)動(dòng)程序Class.forName(“com.mysql.jdbc.Driver”);Class.forName(“acme.db.Driver”);如果將acme.db.Driver編寫為加載時(shí)創(chuàng)建實(shí)例,并調(diào)用以該實(shí)例為參數(shù)的DriverManager.registerDriver,則它在DriverManager的驅(qū)動(dòng)程序列表中,并可用于創(chuàng)建連接第12頁(yè)/共79頁(yè)將驅(qū)動(dòng)程序添加到Java.lang.System的屬性jdbc.drivers中是一個(gè)由DriverManager類加載的驅(qū)動(dòng)程序類名的列表,由冒號(hào)分隔

jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver;初始化DriverManager類時(shí),它搜索系統(tǒng)屬性jdbc.drivers,如果用戶已輸入了一個(gè)或多個(gè)驅(qū)動(dòng)程序,則DriverManager類將試圖加載它們。一旦DriverManager類被初始化,將不再檢查jdbc.drivers屬性表第13頁(yè)/共79頁(yè)

建立數(shù)據(jù)庫(kù)連接

publicstaticConnectiongetConnection(String

url)throwsSQLException

試圖建立到給定數(shù)據(jù)庫(kù)URL的連接。DriverManager試圖從已注冊(cè)的驅(qū)動(dòng)程序集中選擇一個(gè)適當(dāng)?shù)尿?qū)動(dòng)程序。假定構(gòu)造數(shù)據(jù)庫(kù)連接時(shí)不需要用戶名、口令或其他數(shù)據(jù)庫(kù)屬性

DriverManager將檢查每個(gè)驅(qū)動(dòng)程序,輪流在每個(gè)驅(qū)動(dòng)程序上調(diào)用方法Driver.connect,查看它是否可以建立連接。

DriverManager將使用它所找到的第一個(gè)可以成功連接到給定URL的驅(qū)動(dòng)程序第14頁(yè)/共79頁(yè)

publicstaticConnectiongetConnection(String

url,Properties

info)throwsSQLExceptioninfo包含連接數(shù)據(jù)庫(kù)所需的所有屬性項(xiàng);通常至少應(yīng)該包括"user"和"password"屬性

publicstaticConnectiongetConnection(String

url,String

user,String

password)throwsSQLException

指定了連接的用戶名和密碼Connectioncon=DriverManager.getConnection(“jdbc:mysql://localhost/UpdateDB”,”root”,””);第15頁(yè)/共79頁(yè)Connection對(duì)象用于連接數(shù)據(jù)庫(kù)和Java應(yīng)用程序打開連接的方法

Connectionconnect(String

url,Properties

info)throwsSQLException

java.sql.Driver

試圖創(chuàng)建一個(gè)到給定URL的數(shù)據(jù)庫(kù)連接。

DriverManager.getConnection

提供應(yīng)用程序與數(shù)據(jù)庫(kù)的靜態(tài)連接單一應(yīng)用程序可以:擁有與單個(gè)數(shù)據(jù)庫(kù)的一個(gè)或多個(gè)連接擁有與許多不同數(shù)據(jù)庫(kù)的連接publicinterfaceConnection第16頁(yè)/共79頁(yè)JDBCURLJDBCURL提供了一種標(biāo)識(shí)數(shù)據(jù)庫(kù)的方法,可以使用相應(yīng)的驅(qū)動(dòng)程序識(shí)別該數(shù)據(jù)庫(kù),并與之建立連接。第17頁(yè)/共79頁(yè)

標(biāo)準(zhǔn)語(yǔ)法:jdbc:<subprotocol>:<subname>jdbc協(xié)議:JDBCURL中的協(xié)議總是jdbc。子協(xié)議:驅(qū)動(dòng)程序名或連接機(jī)制的名稱。如果要用網(wǎng)絡(luò)命名服務(wù),則命名服務(wù)可以作為子協(xié)議。Jdbc:dcenaming:accounts驅(qū)動(dòng)程序編程員可保留某個(gè)名稱以將之用作JDBCURL的子協(xié)議名子名稱:數(shù)據(jù)庫(kù)的唯一標(biāo)識(shí)符。如果數(shù)據(jù)庫(kù)是通過(guò)Internet來(lái)訪問(wèn)的,則遵循命名規(guī)定//主機(jī)名:端口/數(shù)據(jù)庫(kù)名

例jdbc:odbc:goodsjdbc:dcenaming:accountsjdbc:dbnet://wombat:356/fredjdbc:mysql://localhost/UpdateDB第18頁(yè)/共79頁(yè)odbc子協(xié)議odbc子協(xié)議用于指定ODBC風(fēng)格的數(shù)據(jù)資源名稱的URL,允許指定任意多的屬性值。語(yǔ)法:Jdbc:odbc:<數(shù)據(jù)資源名>[;<屬性名>=<屬性值>]例:Jdbc:odbc:students;UID=tech;PWD=123Jdbc:odbc:wombat;CacheSize=20;ExtensionCase=LOWER

第19頁(yè)/共79頁(yè)如何與數(shù)據(jù)庫(kù)建立連接?第20頁(yè)/共79頁(yè)獲取和安裝JDBC以mysql為例:首先,下載mysql,并安裝。/打開命令行界面下載mysql-connector-java-5.1.5.tar.zip解壓,并進(jìn)行相應(yīng)的配置。第21頁(yè)/共79頁(yè)

配置方法:進(jìn)入…\Java\jre1.6.0_02\lib目錄將mysql-connector-java-5.1.5-bin.jar拷貝到該目錄下。配置classpath,追加%JAVA_HOME%\jre1.6.0_02\lib\mysql-connector-java-5.1.5-bin.jar;配置的目的是讓java應(yīng)用程序找到連接mysql的驅(qū)動(dòng)第22頁(yè)/共79頁(yè)第23頁(yè)/共79頁(yè)如何向數(shù)據(jù)庫(kù)遞交查詢和更新請(qǐng)求并獲得返回的結(jié)果?第24頁(yè)/共79頁(yè)Statement對(duì)象用于執(zhí)行SQL語(yǔ)句并獲取數(shù)據(jù)庫(kù)的返回結(jié)果

StatementcreateStatement()throwsSQLException

java.sql.Connection

常用方法

booleanexecute(String

sql)throwsSQLException

執(zhí)行給定的SQL語(yǔ)句,該語(yǔ)句可能返回多個(gè)結(jié)果。如果結(jié)果是ResultSet對(duì)象則返回true;結(jié)果是更新計(jì)數(shù)或執(zhí)行的語(yǔ)句是DDL命令則返回false

ResultSetexecuteQuery(String

sql)throwsSQLException執(zhí)行給定的SQL語(yǔ)句,該語(yǔ)句返回單個(gè)ResultSet對(duì)象。publicinterfaceStatement第25頁(yè)/共79頁(yè)

intexecuteUpdate(String

sql)throwsSQLException

執(zhí)行給定SQL語(yǔ)句,該語(yǔ)句可能為INSERT、UPDATE或DELETE語(yǔ)句,或者不返回任何內(nèi)容的SQL語(yǔ)句(如SQLDDL語(yǔ)句)。返回INSERT、UPDATE或DELETE語(yǔ)句的行計(jì)數(shù);或者0,表示不返回任何內(nèi)容的SQL語(yǔ)句執(zhí)行語(yǔ)句的所有方法都將關(guān)閉所調(diào)用的Statement對(duì)象的當(dāng)前打開結(jié)果集(如果存在)。這意味著在重新執(zhí)行Statement對(duì)象之前,需要完成對(duì)當(dāng)前ResultSet對(duì)象的處理。使用方法execute()僅在語(yǔ)句能返回多個(gè)ResultSet對(duì)象、多個(gè)更新計(jì)數(shù)或ResultSet對(duì)象與更新計(jì)數(shù)的組合時(shí)使用第26頁(yè)/共79頁(yè)

ResultSetgetResultSet()throwsSQLException

以ResultSet對(duì)象的形式檢索當(dāng)前結(jié)果。每個(gè)結(jié)果只應(yīng)調(diào)用一次此方法。當(dāng)SQL語(yǔ)句的結(jié)果不是結(jié)果集時(shí),將返回null。

booleangetMoreResults()throwsSQLException

移動(dòng)到此Statement對(duì)象的下一個(gè)結(jié)果,如果其為ResultSet對(duì)象,則返回true,并隱式關(guān)閉利用方法getResultSet獲取的所有當(dāng)前ResultSet對(duì)象。

intgetUpdateCount()throwsSQLException

以更新計(jì)數(shù)的形式檢索當(dāng)前結(jié)果;如果結(jié)果為ResultSet對(duì)象或沒(méi)有更多結(jié)果,則返回-1。每個(gè)結(jié)果只應(yīng)調(diào)用一次此方法。第27頁(yè)/共79頁(yè)

intgetMaxFieldSize()throwsSQLException

檢索可以為此Statement對(duì)象所生成ResultSet對(duì)象中的字符和二進(jìn)制列值返回的最大字節(jié)數(shù)。如果超過(guò)了該限制,則安靜地丟棄多出的數(shù)據(jù)。

intgetMaxRows()throwsSQLException

檢索由此Statement對(duì)象生成的ResultSet對(duì)象可以包含的最大行數(shù)。如果超過(guò)了此限制,則安靜地撤消多出的行。

intgetQueryTimeout()throwsSQLException

檢索驅(qū)動(dòng)程序等待Statement對(duì)象執(zhí)行的秒數(shù)。如果超過(guò)該限制,則拋出SQLException。第28頁(yè)/共79頁(yè)

關(guān)閉Statement對(duì)象

Statement對(duì)象將由Java垃圾收集程序自動(dòng)關(guān)閉顯式關(guān)閉將立即釋放DBMS資源,有助于避免潛在的內(nèi)存問(wèn)題。第29頁(yè)/共79頁(yè)如何處理查詢結(jié)果?第30頁(yè)/共79頁(yè)ResultSet表示數(shù)據(jù)庫(kù)結(jié)果集的數(shù)據(jù)表,通常通過(guò)執(zhí)行查詢數(shù)據(jù)庫(kù)的語(yǔ)句生成。

ResultSet對(duì)象具有指向其當(dāng)前數(shù)據(jù)行的指針。最初,指針被置于第一行之前。next方法將指針移動(dòng)到下一行。

ResultSet接口提供用于從當(dāng)前行檢索列值的獲取方法(getBoolean、getLong等)可以使用列的索引編號(hào)或列的名稱檢索值

StringgetString(int

columnIndex)throwsSQLException

StringgetString(String

columnName)throwsSQLException

列名不區(qū)分大小寫publicinterfaceResultSet第31頁(yè)/共79頁(yè)對(duì)于獲取方法getXXX(),JDBC驅(qū)動(dòng)程序嘗試將基礎(chǔ)數(shù)據(jù)轉(zhuǎn)換為在獲取方法中指定的Java類型,并返回適當(dāng)?shù)腏ava值。用戶不必關(guān)閉ResultSet;當(dāng)產(chǎn)生它的Statement關(guān)閉、重新執(zhí)行或用于從多結(jié)果序列中獲取下一個(gè)結(jié)果時(shí),該ResultSet將被Statement自動(dòng)關(guān)閉。

Statementstmt=conn.createStatement();

ResultSetr=stmt.executeQuery("SELECTa,b,cFROMTable1“);

while(r.next()){

//打印當(dāng)前行的值。

Inti=r.getInt("a“);

Strings=r.getString("b“);

Floatf=r.getFloat("c“);

System.out.println("ROW="+i+""+s+""+f);

}第32頁(yè)/共79頁(yè)獲取MyDB數(shù)據(jù)庫(kù)中的表屬性,包括列的最大字節(jié)數(shù),表的最大行數(shù),驅(qū)動(dòng)程序等待SQL操作執(zhí)行的秒數(shù)

在MyDB中創(chuàng)建一個(gè)teacher表,包括的字段及類型為:id(int),name(varchar(10)),sex(char(2)),age(int)

以id為主鍵將teachers.txt的內(nèi)容插入teacher表中第33頁(yè)/共79頁(yè)

在teacher表上創(chuàng)建一個(gè)僅包括name和age列的視圖teacher_view

查詢teacher和teacher_view的內(nèi)容第34頁(yè)/共79頁(yè)第35頁(yè)/共79頁(yè)如何獲取結(jié)果集中任意位置處的記錄?第36頁(yè)/共79頁(yè)

游標(biāo)控制

booleannext()throwsSQLException

將指針從當(dāng)前位置下移一行。ResultSet指針最初位于第一行之前

booleanprevious()throwsSQLException

將指針移動(dòng)到此ResultSet對(duì)象的上一行

booleanfirst()throwsSQLException

將指針移動(dòng)到此ResultSet對(duì)象的第一行。

booleanlast()throwsSQLException

將指針移動(dòng)到此ResultSet對(duì)象的最后一行。

voidbeforeFirst()throwsSQLException

將指針移動(dòng)到此ResultSet對(duì)象的開頭,正好位于第一行之前。第37頁(yè)/共79頁(yè)

voidafterLast()throwsSQLException

將指針移動(dòng)到此ResultSet對(duì)象的末尾,正好位于最后一行之后。

booleanabsolute(int

row)throwsSQLException

將指針移動(dòng)到此ResultSet對(duì)象的給定行編號(hào)。

booleanrelative(int

rows)throwsSQLException

按相對(duì)行數(shù)(或正或負(fù))移動(dòng)指針在ResultSet對(duì)象或其父輩Statement對(duì)象關(guān)閉之前,光標(biāo)一直保持有效。第38頁(yè)/共79頁(yè)

輸出teacher表的所有內(nèi)容(包括列名和記錄)在teacher表上執(zhí)行查詢,并將結(jié)果填充到結(jié)果集中輸出結(jié)果集第一行記錄輸出結(jié)果集第四行記錄輸出結(jié)果集最后一行記錄輸出結(jié)果集當(dāng)前位置的前兩行對(duì)應(yīng)記錄輸出結(jié)果集當(dāng)前位置的前一行對(duì)應(yīng)記錄第39頁(yè)/共79頁(yè)第40頁(yè)/共79頁(yè)如何向結(jié)果集及數(shù)據(jù)庫(kù)中插入、刪除、更改記錄?第41頁(yè)/共79頁(yè)可更新的ResultSet創(chuàng)建可更新的結(jié)果集:createStatement方法第二參數(shù)需要是CONCUR_UPDATABLEUpdatableResultSet不能保證獲得可更新的結(jié)果集,需要驅(qū)動(dòng)程序的支持。

intgetConcurrency()throwsSQLException

檢索此ResultSet對(duì)象的并發(fā)模式。并發(fā)類型ResultSet.CONCUR_READ_ONLY或ResultSet.CONCUR_UPDATABLE第42頁(yè)/共79頁(yè)

插入新行可更新的ResultSet對(duì)象具有一個(gè)與其關(guān)聯(lián)的特殊行,該行用作構(gòu)建要插入的行的暫存區(qū)域

(stagingarea)。

voidinsertRow()throwsSQLException

將插入行的內(nèi)容插入到此ResultSet對(duì)象和數(shù)據(jù)庫(kù)中。rs.moveToInsertRow();//movescursortotheinsertrowrs.updateString(1,"AINSWORTH");//updatesthefirstcolumnoftheinsertrowtobeAINSWORTHrs.updateInt(2,35);//updatesthesecondcolumntobe35rs.updateBoolean(3,true);//updatesthethirdcolumntotruers.insertRow();rs.moveToCurrentRow();第43頁(yè)/共79頁(yè)更新當(dāng)前行中的列值

voidupdateRow()throwsSQLException

用此ResultSet對(duì)象的當(dāng)前行的新內(nèi)容更新底層數(shù)據(jù)庫(kù)。刪除行將游標(biāo)移動(dòng)到想刪除的行,調(diào)用方法deleteRow().注:不同的JDBC以不同的方式處理刪除操作(將刪除行移走,使其在結(jié)果集中不可見;或者在被刪除行的原來(lái)位置插入一個(gè)空行)。rs.absolute(5);//movesthecursortothefifthrowofrsrs.updateString("NAME","AINSWORTH");//updatestheNAMEcolumnofrow5tobeAINSWORTHrs.updateRow();//updatestherowinthedatasource第44頁(yè)/共79頁(yè)(1)在表中插入一條新記錄“7LiuJieF23”(2)刪除第四條記錄(3)將第二條記錄的教師年齡修改為40第45頁(yè)/共79頁(yè)可滾動(dòng)的ResultSetScrollableResultSet,支持將結(jié)果集中的游標(biāo)按任意方向移動(dòng)。創(chuàng)建可滾動(dòng)的ResultSet:publicStatementcreateStatement(intrsType,intrsConcurrenty)throwsSQLException其中,rsType必須是一下三種變量之一,添加到ResultSet接口中指示其對(duì)象類型:TYPE_FORWARD_ONLY:創(chuàng)建不可滾動(dòng)的結(jié)果集,默認(rèn)TYPE_SCROLL_INSENSITIVE:創(chuàng)建可滾動(dòng)的ResultSet對(duì)象,結(jié)果集打開時(shí)不反映變化TYPE_SCROLL_SENSITIVE:創(chuàng)建可滾動(dòng)的ResultSet對(duì)象,結(jié)果集打開時(shí)反映變化第46頁(yè)/共79頁(yè)

rsConcurrenty必須是ResultSet常量中的一個(gè),用于指定結(jié)果集是只讀的還是可更新的:CONCUR_READ_ONLY默認(rèn)CONCUR_UPDATABLE檢查ResultSet對(duì)象是否可滾動(dòng):ResultSet.getType()例如:if(rs.getType()==ResultSet.TYPE_FORWARS_ONLY)System.out.println(“FORWARD_ONLY”):elseSystem.out.println(“SCROLLABLE”);第47頁(yè)/共79頁(yè)如果多次重復(fù)執(zhí)行同一條SQL語(yǔ)句,只是語(yǔ)句中參數(shù)的取值不同,如何避免對(duì)該SQL語(yǔ)句進(jìn)行重復(fù)編譯?第48頁(yè)/共79頁(yè)P(yáng)reparedStatement

SQL語(yǔ)句被預(yù)編譯并且存儲(chǔ)在PreparedStatement對(duì)象中。然后可以使用此對(duì)象高效地多次執(zhí)行該語(yǔ)句。用來(lái)設(shè)置IN參數(shù)值的setter方法(setShort、setString等等)必須指定與輸入?yún)?shù)的已定義SQL類型兼容的類型。獲取PreparedStatement對(duì)象的方法

PreparedStatementprepareStatement(String

sql)throwsSQLException

創(chuàng)建一個(gè)PreparedStatement對(duì)象來(lái)將參數(shù)化的SQL語(yǔ)句發(fā)送到數(shù)據(jù)庫(kù)。SQL語(yǔ)句可能包含一個(gè)或多個(gè)'?'IN參數(shù)占位符的SQL語(yǔ)句publicinterfacePreparedStatementextendsStatement第49頁(yè)/共79頁(yè)P(yáng)reparedStatement可以作為IN參數(shù)的變量包含占位符,初始化的方法是調(diào)用該類的一系列setXXX()方法。setXXX()方法一般有兩個(gè)參數(shù):第一個(gè)參數(shù)都是int型,指示JDBCPreparedStatement對(duì)象的第幾個(gè)參數(shù)將要被初始化。第二個(gè)參數(shù)的值就是PreparedStatemetn將要被初始化的參數(shù)取值

PreparedStatement接口有自己的executeQuery、executeUpdate和execute方法,但并不需要SQL語(yǔ)句作為參數(shù)提供給這些方法,因?yàn)樗鼈円呀?jīng)包含預(yù)編譯SQL語(yǔ)句第50頁(yè)/共79頁(yè)例:將mysql的myDB數(shù)據(jù)庫(kù)中teacher表的ChenHong

的年齡修改為30,LiMing的年齡修改為20第51頁(yè)/共79頁(yè)如何執(zhí)行帶輸入和輸出參數(shù)的存儲(chǔ)過(guò)程?第52頁(yè)/共79頁(yè)CallableStatement

用于執(zhí)行SQL存儲(chǔ)過(guò)程的接口該對(duì)象包含了對(duì)存儲(chǔ)過(guò)程的調(diào)用,但不包含存儲(chǔ)過(guò)程本身(存儲(chǔ)過(guò)程是存儲(chǔ)在數(shù)據(jù)庫(kù)中的)獲取CallableStatement對(duì)象

CallableStatementprepareCall(String

sql)throwsSQLExceptionsql可能包含一個(gè)或多個(gè)'?'參數(shù)占位符的SQL語(yǔ)句。publicinterfaceCallableStatementextendsPreparedStatement第53頁(yè)/共79頁(yè)IN參數(shù)值是使用從PreparedStatement

中繼承的set方法設(shè)置的。在執(zhí)行存儲(chǔ)過(guò)程之前,必須注冊(cè)所有OUT參數(shù)的類型;它們的值是在執(zhí)行后通過(guò)此類提供的get方法檢索的。

voidregisterOutParameter(int

parameterIndex,int

sqlType)throwsSQLException

按順序位置parameterIndex將OUT參數(shù)注冊(cè)為JDBC類型sqlType。

sqlType是由

java.sql.Types

定義的SQL類型代碼。

voidregisterOutParameter(String

parameterName,int

sqlType)throwsSQLException

將名為parameterName的OUT參數(shù)注冊(cè)為JDBC類型sqlType。第54頁(yè)/共79頁(yè)例:執(zhí)行存儲(chǔ)過(guò)程,對(duì)mysql中的myDB數(shù)據(jù)庫(kù)中的teacher表,通過(guò)教師id能得到教師姓名第55頁(yè)/共79頁(yè)

對(duì)非常大的行值使用流

ResultSet可以獲取任意大的LONGVARBINARY或LONGVARCHAR數(shù)據(jù)。方法getBytes和getString將數(shù)據(jù)返回為大的塊(最大為Statement.getMaxFieldSize的返回值)。但是,以較小的固定塊獲取非常大的數(shù)據(jù)可能會(huì)更方便

InputStreamgetBinaryStream(int

columnIndex)throwsSQLException

以未解釋字節(jié)的流的形式獲取此ResultSet對(duì)象的當(dāng)前行中指定列的值。第56頁(yè)/共79頁(yè)

InputStreamgetAsciiStream(int

columnIndex)throwsSQLException

以單字節(jié)ASCII字符流的形式獲取此ResultSet對(duì)象的當(dāng)前行中指定列的值。

InputStreamgetUnicodeStream(int

columnIndex)throwsSQLException

以雙字節(jié)Unicode字符流的形式獲取此ResultSet對(duì)象的當(dāng)前行中指定列的值。第57頁(yè)/共79頁(yè)JDBC/ODBC橋連接Access的硬件設(shè)置打開控制面板,選中管理工具。打開管理工具,選中(ODBC)數(shù)據(jù)源打開數(shù)據(jù)源管理器,選擇系統(tǒng)DNS,并單擊‘添加’按鈕。第58頁(yè)/共79頁(yè)

選中DriverdoMicrosoftAccess(*mdb)第59頁(yè)/共79頁(yè)

在ODBCMicrosoftAccess安裝界面中,填寫數(shù)據(jù)源(如Book),并選擇數(shù)據(jù)庫(kù),選好后如圖。單擊確定,完成了設(shè)置。第60頁(yè)/共79頁(yè)將Access的學(xué)生表的內(nèi)容輸出第61頁(yè)/共79頁(yè)

DatabaseMetaDatagetMetaData()throwsSQLException

獲取DatabaseMetaData對(duì)象,該對(duì)象包含關(guān)于Connection對(duì)象連接到的數(shù)據(jù)庫(kù)的元數(shù)據(jù)。元數(shù)據(jù)包括關(guān)于數(shù)據(jù)庫(kù)的表、受支持的SQL語(yǔ)法、存儲(chǔ)過(guò)程、此連接的功能等信息。如何獲取所連接數(shù)據(jù)庫(kù)的屬性?第62頁(yè)/共79頁(yè)DatabaseMetaData由Connection.getMetaData()方法創(chuàng)建,可以用于獲取數(shù)據(jù)庫(kù)的相關(guān)信息:例如:獲取數(shù)據(jù)庫(kù)中表的名字Connectioncon=DriverManager.getConnection(“jdbc:odbc:Customers”);DatabaseMetaDatadm=con.getMetaData();ResultSetrs=dm.getTables(null,null,”%”,newString[]{“Table”});ResultSetgetTables(String

catalog,String

schemaPattern,String

tableNamePattern,String[]

types)throwsSQLException

檢索可在給定類別中使用的表的描述。僅返回與類別、模式、表名稱和類型標(biāo)準(zhǔn)匹配的表描述。類別名稱模式名稱模式表名稱模式要包括的表類型組成的列表第63頁(yè)/共79頁(yè)

從數(shù)據(jù)庫(kù)獲得的常規(guī)信息的方法:StringgetURL()throwsSQLException

檢索此DBMS的URL

StringgetDriverName()

throwsSQLException

檢索此JDBC驅(qū)動(dòng)程序的名稱StringgetUserName()throwsSQLException

檢索此數(shù)據(jù)庫(kù)的已知的用戶名稱

String

getDatabaseProductName()throwsSQLException

檢索此數(shù)據(jù)庫(kù)產(chǎn)品的名稱。

第64頁(yè)/共79頁(yè)

String

getSQLKeywords()throwsSQLException

檢索此數(shù)據(jù)庫(kù)的還“不”是SQL92關(guān)鍵字的所有SQL關(guān)鍵字的逗號(hào)分隔列表。

booleannullsAreSortedHigh()throwsSQLException

檢索NULL值是否被高排序。

booleannullsAreSortedLow()throwsSQLException

檢索NULL值是否被低排序第65頁(yè)/共79頁(yè)

檢索信息的方法:

booleansupportsBatchUpdates()throwsSQLException

檢索此數(shù)據(jù)庫(kù)是否支持批量更新

booleansupportsStoredProcedures()throwsSQLException

檢索此數(shù)據(jù)庫(kù)是否支持使用存儲(chǔ)過(guò)程轉(zhuǎn)義語(yǔ)法的存儲(chǔ)過(guò)程調(diào)用

booleansupportsFullOuterJoins()throwsSQLException

檢索此數(shù)據(jù)庫(kù)是否支持完全嵌套的外連接。

booleansupportsPositionedDelete()throwsSQLException

檢索此數(shù)據(jù)庫(kù)是否支持位置的DELETE語(yǔ)句。第66頁(yè)/共79頁(yè)檢索SQL對(duì)象及屬性:ResultSetgetSchemas()throwsSQLException

檢索可在此數(shù)據(jù)庫(kù)中使用的模式名稱。模式列為:TABLE_SCHEM,TABLE_CATALOGResultSet

getCatalogs()throwsSQLException

檢索可在此數(shù)據(jù)庫(kù)中使用的類別名稱。類別列為:TABLE_CAT

ResultSetgetTables(String

catalog,String

schemaPattern,String

tableNamePattern,String[]

types)throwsSQLExceptioncatalog類別名稱

schemaPattern模式名稱的模式

tableNamePattern表名稱模式

type要包括的表類型組成的列表第67頁(yè)/共79頁(yè)

表描述的列為:TABLE_CAT表類別TABLE_SCHEM表模式

,TABLE_NAME表名稱TABLE_TYPE表類型REMARKS,表的解釋性注釋TYPE_CAT,類型類別TYPE_SCHEM,類型模式TYPE_NAME,類型名稱SELF_REFERENCING_COL_NAME,有類型表的指定”identifier”列的名稱REF_GENERATION

指定在SELF_REFERENCING_COL_NAME中創(chuàng)建值的方式第68頁(yè)/共79頁(yè)

ResultSetgetProcedures(String

catalog,String

schemaPattern,String

procedureNamePattern)throwsSQLException

檢索可在給定類別中使用的存儲(chǔ)過(guò)程的描述。過(guò)程描述的列為:PROCEDURE_CAT,PROCEDURE_SCHEM

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論