版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度美術(shù)館東館館舍租賃藝術(shù)展覽策劃與推廣合同4篇
- 二零二五年度農(nóng)業(yè)科技研發(fā)農(nóng)副業(yè)承包合同書模板4篇
- 2025年度農(nóng)家樂(lè)房屋租賃合同及可持續(xù)發(fā)展承諾協(xié)議4篇
- 2025年度門診部醫(yī)療廢物處理設(shè)施運(yùn)營(yíng)管理合同
- 二零二五年度出境旅游領(lǐng)隊(duì)資質(zhì)認(rèn)證合同3篇
- 二零二五年度南京市智慧交通系統(tǒng)建設(shè)合同樣本3篇
- 2025年度版權(quán)回購(gòu)合同:出版社與作者之間的版權(quán)回購(gòu)協(xié)議2篇
- 二零二五年度內(nèi)控制度合同執(zhí)行監(jiān)督與責(zé)任追究協(xié)議
- 2025年度租賃房屋合同申請(qǐng)流程與租戶信用評(píng)估體系協(xié)議
- 二零二五年度育嬰師專業(yè)實(shí)習(xí)合作合同
- 藥娘激素方案
- 提高靜脈留置使用率品管圈課件
- GB/T 10739-2023紙、紙板和紙漿試樣處理和試驗(yàn)的標(biāo)準(zhǔn)大氣條件
- 《心態(tài)與思維模式》課件
- C語(yǔ)言程序設(shè)計(jì)(慕課版 第2版)PPT完整全套教學(xué)課件
- 行業(yè)會(huì)計(jì)比較(第三版)PPT完整全套教學(xué)課件
- 值機(jī)業(yè)務(wù)與行李運(yùn)輸實(shí)務(wù)(第3版)高職PPT完整全套教學(xué)課件
- 高考英語(yǔ)語(yǔ)法填空專項(xiàng)訓(xùn)練(含解析)
- 危險(xiǎn)化學(xué)品企業(yè)安全生產(chǎn)標(biāo)準(zhǔn)化課件
- 《美的歷程》導(dǎo)讀課件
- 心電圖 (史上最完美)課件
評(píng)論
0/150
提交評(píng)論