下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二章JDBC本章要API來(lái)操作數(shù)據(jù)庫(kù)。本章介紹JDBC相關(guān)的知識(shí)。JDBC簡(jiǎn)JDBCJDBC(JavaDatabaseConnectivity,Java數(shù)據(jù)庫(kù)連接)SQLJavaAPI,可以為多種關(guān)系數(shù)據(jù)庫(kù)提供統(tǒng)一的接口。JDBC由一組用Java語(yǔ)言編寫(xiě)的類(lèi)與數(shù)據(jù)庫(kù)系統(tǒng)(Access、Server2000、Oracle、Sybase等)SQL語(yǔ)言來(lái)存Java程序代碼。JavaJDBCJava應(yīng)用程序與各用Java和JDBCAPI發(fā)布含有Applet的網(wǎng)頁(yè),而該Applet使用的信息可以來(lái)自服務(wù)JDBCSQL語(yǔ)句傳送給幾乎任何一種數(shù)據(jù)庫(kù),即可以不必寫(xiě)一個(gè)程序Sybase或Oracle,再寫(xiě)一個(gè)程序MSSQLServer。用JDBC寫(xiě)的程序SQL語(yǔ)句傳送給相應(yīng)的數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)Java編寫(xiě)的應(yīng)用程序可以在任何支持Java的平臺(tái)上運(yùn)行,不必在不同的平臺(tái)上編寫(xiě)不同的應(yīng)用程序。JavaJDBC簡(jiǎn)單地說(shuō),JDBC3SQL以通過(guò)JDBC向數(shù)據(jù)庫(kù)下達(dá)SQL命令,對(duì)數(shù)據(jù)庫(kù)進(jìn)行新增、刪除和修改記錄等操作,這一的結(jié)果,以HTML的形式通過(guò)HTTP協(xié)議,回傳給前端的瀏覽器。在這整個(gè)存取架構(gòu)中最重要的部分就是JDBC。沒(méi)有JDBC,我們的JSP程序根本沒(méi)有辦法和數(shù)據(jù)庫(kù)相連,如圖2-1所示。 2-1存取WebJDBCJSP/ServletJDBC的論述主要JavaJavaWebJDBCJDBCAPI通過(guò)一個(gè)數(shù)據(jù)庫(kù)管理器(DatabaseManager)和為各種數(shù)據(jù)庫(kù)定制的驅(qū)動(dòng)程序提供與不同數(shù)據(jù)庫(kù)的透明連接。JDBC數(shù)據(jù)庫(kù)管理器將確保正確的驅(qū)動(dòng)程序被用于連接數(shù)JDBCJDBC指令轉(zhuǎn)換成適用于不同數(shù)據(jù)庫(kù)通信的網(wǎng)絡(luò)協(xié)議指令或其他API指令。這種指令的轉(zhuǎn)換機(jī)制,使基于JDBC接口開(kāi)發(fā)的程序可以獨(dú)立于數(shù)據(jù)JDBC數(shù)據(jù)庫(kù)連接對(duì)站來(lái)說(shuō)是最重要的部分.很多數(shù)據(jù)庫(kù)系統(tǒng)帶有JDBC驅(qū)動(dòng)程序,JDBC驅(qū)動(dòng)程序與數(shù)據(jù)庫(kù)相連,執(zhí)行查詢(xún)和提取數(shù)據(jù)等操作。目前,JDBC的驅(qū)動(dòng)程JDBC-ODBC1JDBCODBC,JDBC-ODBC基于JDBC的程序能通過(guò)傳統(tǒng)的ODBC驅(qū)動(dòng)程序數(shù)據(jù)庫(kù)由于大多數(shù)數(shù)據(jù)庫(kù)系統(tǒng)都帶有ODBC驅(qū)動(dòng)程序,所以Java程序能諸如Oracle、Sybase、MSSQLServer和MSJava2JDBC驅(qū)動(dòng)程序使用Java本地接口(JavaNativeInterfce)向本地的數(shù)據(jù)庫(kù)API發(fā)Java3Java的驅(qū)動(dòng)程序,它通過(guò)—定的網(wǎng)絡(luò)協(xié)議與數(shù)據(jù)庫(kù)服務(wù)器上的類(lèi)驅(qū)動(dòng)程序是最靈活的JDBC方案因?yàn)樗灰笤跀?shù)據(jù)庫(kù)的Java程序所在個(gè)地端安Java第4類(lèi)驅(qū)動(dòng)程序也是純Java的,它通過(guò)實(shí)現(xiàn)一定的數(shù)據(jù)庫(kù)協(xié)議(oracle公司的是4種驅(qū)動(dòng)程序中最高的。其缺點(diǎn)是:當(dāng)目標(biāo)數(shù)據(jù)庫(kù)的類(lèi)型更換時(shí),必須重新JDBCJDBCjdbc子協(xié)議名子名稱(chēng)jdbc子協(xié)議名子名稱(chēng)jdbc:odbc:<data_source_name>[<attribute_name1>=<attribute_value1>]JDBC-ODBCjdbc:odbc:<data_source_name>[<attribute_name1>=<attribute_value1>]data_source_nameJDBCURL:JDBCURLodbcmydbme,數(shù)據(jù)源的口令為pass。注意,當(dāng)數(shù)據(jù)庫(kù)為不具有服務(wù)器功能的本地?cái)?shù)據(jù)庫(kù)如APIOracle,Oracle數(shù)據(jù)庫(kù)服務(wù)器名稱(chēng)可以是一個(gè)也可以是IP地址“portNumber”為Oracle數(shù)據(jù)庫(kù)使用的端,默認(rèn)為1521,如果你在安裝Oracle數(shù)據(jù)庫(kù)的時(shí)候沒(méi)有去修改它,那1521就可以了,而“dataInstance”是數(shù)據(jù)庫(kù)的實(shí)例名,根據(jù)情況使用。OracleOracle9iOracle8i/Oracle面,JDBC的設(shè)計(jì)目標(biāo)之一就是讓它成為一個(gè)公共的接口,對(duì)于不同的數(shù)據(jù)OracleJDBCJDBC-述,主要是介紹如何設(shè)置ODBC數(shù)據(jù)源的(以Access數(shù)據(jù)庫(kù)為例),如果讀者有過(guò)ODBCJDBC編程方式的理解。ODBC建立一個(gè)ODBC數(shù)據(jù)源以便于以后的講解和使用下面以連接Access數(shù)據(jù)庫(kù)student.mdbODBCWindows200操作系統(tǒng)為例進(jìn)行說(shuō)明的,Windows98/NT/XP操作系統(tǒng)與此類(lèi)似。ODBC據(jù)源(ODBC)DSN2-2所示畫(huà)面。畫(huà)面中顯示了圖2-2用戶(hù)數(shù)據(jù)源在使用上的區(qū)別在于DSN”上設(shè)置的DSN只能在使用進(jìn)行設(shè)置DSN”則針對(duì)任何登2-3在圖2-3中的數(shù)據(jù)源名文本框里為數(shù)據(jù)源命名這里輸入的是NIT-Pro了使這個(gè)數(shù)C:\JavaWeb\student.mdb數(shù)據(jù)庫(kù)。單擊“確定”按11-4所示的畫(huà)面。2-42-52-5本框里輸入,然后單擊“確定”按鈕,又回到圖2-2所示的畫(huà)面,再單擊“確定”AccessNIT-ProAccess數(shù)據(jù)庫(kù),即student.mdb。用戶(hù)在編寫(xiě)Java程序時(shí),就可以將這個(gè)數(shù)據(jù)源作為數(shù)據(jù)庫(kù)的連接對(duì)象OracleOracle在使用Oracle數(shù)據(jù)庫(kù)的時(shí)候,需要使用它所提供的驅(qū)動(dòng),在安裝完Oracle數(shù)據(jù)庫(kù)后,可以在它的安裝路徑下找到,對(duì)于Oracle9i(Oracle8i也類(lèi)似),可以在<安裝目 量CLASSPATH中去就可以了。createtablestudents(student_idvarchar2(20)primarykey,student_namevarchar2(20)notnull,student_ageintegernotnull,student_sexchar(1)not)insertintostudentsvalues('Eng001','Diana',23,'F');insertintostudentsvalues('Cas001','Alex',30,'M');在本書(shū)中我們假設(shè)使用的Oracle數(shù)據(jù)庫(kù)實(shí)例名稱(chēng)為O9I,使用下面createtablestudents(student_idvarchar2(20)primarykey,student_namevarchar2(20)notnull,student_ageintegernotnull,student_sexchar(1)not)insertintostudentsvalues('Eng001','Diana',23,'F');insertintostudentsvalues('Cas001','Alex',30,'M');SQLPlus等,都不在本書(shū)的討論范圍,請(qǐng)讀者參考相關(guān)的資料。Tomcat如果需要在JSP/Servlet中使用Oracle的JDBC驅(qū)動(dòng),那么需要將<安裝目 下的classes12.jar文件拷貝到<tomcat安裝 這樣,就可以在JSP/Servlet中使用Oracle的JDBC驅(qū)動(dòng)了。通過(guò)JDBC數(shù)據(jù)JDBC數(shù)據(jù)庫(kù)的基本步下面我們就來(lái)學(xué)習(xí)如何使用JDBC數(shù)據(jù)庫(kù)JDBCJDBC驅(qū)動(dòng)程序。這需JDBC驅(qū)動(dòng)程序:使用Class類(lèi)的forName()方法來(lái)裝載數(shù)據(jù)庫(kù)驅(qū)動(dòng)類(lèi)并且進(jìn)行類(lèi)的初始化等操作。對(duì)于數(shù)據(jù)庫(kù)驅(qū)動(dòng)程序來(lái)說(shuō),還會(huì)向DriverManager自己,這是在使用JDBC的程序中商提供的JDBC驅(qū)動(dòng)程序的種類(lèi)來(lái)確定。對(duì)于JDBC-ODBC橋,加載JDBC-ODBC數(shù)據(jù)庫(kù)Oracle另外,除了在代碼中寫(xiě)出相關(guān)的連接URL、用戶(hù)名、外,為了提供更好的可移植OracleSpertiestryPropertiesprops=tryPropertiesprops=newFilef=newFile("C:\\OracleSperties");FileInputStreamin=newFileInputStream(f);oracle_url=props.getProperty("oracle_url");oracle_name=props.getProperty("oracle_name");oracle_user=props.getProperty("oracle_user");oracle_pwd=props.getProperty("oracle_pwd");}catch(IOExceptione){}oracle_url=jdbc:oracle:thin:@localhost:1521:O920oracle_name=O920oracle_user=scottoracle_pwd=PropertiesgetProperty()oracle_urloracle_pwdJDBC操作數(shù)據(jù)庫(kù)之前,必須首先打開(kāi)一個(gè)數(shù)據(jù)庫(kù)連接,創(chuàng)建和指定數(shù)據(jù)庫(kù)的DriverManager類(lèi)的getConnection()方法,其一般的使用格式如下:Connectionconn=DriverManager.getConnection(Stringurl,Stringuser,StringConnectionconn=DriverManager.getConnection(Stringurl,Stringuser,Stringjava.sql.ConnectionURLURL格式是不同的。ConnectionConn=ConnectionConn=OraclethinConnectionConnSQLSQLStatementSQL語(yǔ)句發(fā)送給數(shù)據(jù)庫(kù)。SQL語(yǔ)句運(yùn)行后產(chǎn)生結(jié)果集,StatementResultSet對(duì)象。Statementsmt=StatementStatementsmt=SQLResultSetrs=smt.executeQuery("SELECT*FROMStatementexecuteQuery()方法來(lái)執(zhí)行數(shù)據(jù)庫(kù)查詢(xún)語(yǔ)句,executeQuery()方法返回一個(gè)ResultSet類(lèi)的對(duì)象,它包含ResultSetrs=smt.executeQuery("SELECT*FROMSQLJDBCResultSetResultSet對(duì)象包含了執(zhí)行某個(gè)SQL語(yǔ)句后滿(mǎn)足條件的所有的行,它還提供了對(duì)這些行的,用戶(hù)可以通過(guò)一組get方法來(lái)當(dāng)前行的不同列。通常結(jié)果集的形式是一張帶有表頭和相應(yīng)數(shù)據(jù)的表。一個(gè)Statement對(duì)象在同一時(shí)間只能打開(kāi)一個(gè)結(jié)果集,所以如果在同一個(gè)Statement對(duì)象中運(yùn)行下一條SQL語(yǔ)句時(shí),第一條SQL語(yǔ)句生成的ResultSet對(duì)象就被自動(dòng)關(guān)閉了。當(dāng)然也可以通過(guò)調(diào)用ResultSet接口的close()方法來(lái)手工關(guān)閉。關(guān)閉Statement對(duì)象和Connectionclose()方法。JDBCJDBC所提供的類(lèi)和接口到JDBC3.0版時(shí)已經(jīng)增加到29個(gè),而這些類(lèi)接口所提供的方法非常多,我們無(wú)法一一詳細(xì)的介紹,詳細(xì)的參考信息,你可以在 DriverManagerstaticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)throwsSQLException這個(gè)類(lèi)負(fù)責(zé)管理JDBC驅(qū)動(dòng)程序。我們使用JDBC驅(qū)動(dòng)程序之前,需先將驅(qū)動(dòng)法來(lái)完成。然后,我們就可以使用DriverManager類(lèi)提供的方法staticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)throwsSQLExceptionurlstaticDrivergetDriver(Stringurl)throwsstaticDrivergetDriver(Stringurl)throws這個(gè)方法可以向已經(jīng)在DriverManager的驅(qū)動(dòng)程序中尋找一個(gè)能夠打開(kāi)url所指2-1JDBCimportimportpublicclasspublicstaticvoidmain(Stringargs[]){//StringConnection}catch(SQLExceptione){}}}}importOracleimportJDBCConnection當(dāng)我們通過(guò)Class.forName()正確的 并加載JDBC驅(qū)動(dòng)程序后,接下來(lái)就要建立和Connection我們利用java.sql.DriverManager類(lèi)提供的getConnection()方法來(lái)建立與數(shù)據(jù)庫(kù)的連接,scottConnectionisClosed()方法來(lái)判斷連結(jié)是否打開(kāi)了,如果isClosed()方法返回false,那么表示數(shù)據(jù)庫(kù)連接是打開(kāi)的否則如果isClosed()為true,ConnectionConnection接口用于應(yīng)用程序與數(shù)據(jù)庫(kù)之間的靜態(tài)連接。它提供了進(jìn)行事務(wù)處理的方法以及創(chuàng)建執(zhí)行SQL語(yǔ)句和過(guò)程所用對(duì)象的方法,同時(shí)它還提供了一些基本的錯(cuò)誤處理方法。Connection接口提供的常用方法如下:StatementcreateStatement()SQLStatementPreparedStatementprepareStatement(Stringsql)PrepareStatement對(duì)象,DELETE語(yǔ)句,或是無(wú)返回結(jié)果的語(yǔ)句;voidclose()ConnectionbooleanisClosed()ConnectionStatement參數(shù)其主要功能是將SQL語(yǔ)句傳送給數(shù)據(jù)庫(kù)并將SQL語(yǔ)句的執(zhí)行結(jié)果返回StatementResultSetexecuteQuery(Stringsql)SQL查詢(xún)語(yǔ)句,返回滿(mǎn)足條件的結(jié)果集。sql是一個(gè)查詢(xún)語(yǔ)句;intexecuteUpdate(Stringsql)SQL數(shù)據(jù)更新語(yǔ)句(INSERT、UPDATEbooleanexecute(Stringsql):執(zhí)行任意SQL語(yǔ)句。如果第一個(gè)結(jié)果是ResultSet,則返回true;否則如果是整數(shù)型,則返回false。參數(shù)sql可以是任SQL語(yǔ)句。SQL語(yǔ)句。voidclose()Statement通過(guò)Connection接口提供的createStatement()方法,可以建立Statement對(duì)象。當(dāng)建立好Statement對(duì)象之后,就可以使用executeQuery()方法對(duì)數(shù)據(jù)庫(kù)表中的數(shù)據(jù)進(jìn)行查詢(xún)importjava.sql.*;importjava.sql.*;publicclassInsertData{publicstaticvoidmain(Stringargs[]){new//SQLStringsql="insertintostudents//StringConnectionStatementstmt=//SQLintaffectedRow=stmt.executeUpdate(sql);}catch(SQLExceptione){}}}ConnectionConnectionintaffectedRow=intaffectedRow=SQLinsertexecuteUpdate()方法,它將會(huì)返回一個(gè)受影響的行數(shù),緊接著executeUpdate()方法便會(huì)通過(guò)由Connection類(lèi)對(duì)象所的數(shù)據(jù)庫(kù)連接,實(shí)際將SQL命令傳給數(shù)據(jù)庫(kù)以進(jìn)行新增記錄的。excuty(excuteUpdate(Lexectey(當(dāng)我們使用L命令T對(duì)數(shù)據(jù)庫(kù)做查詢(xún)時(shí)需使用excuteQuery(方法而execueQuery(方建立一個(gè)Ret對(duì)象保存查詢(xún)的結(jié)果除了T命令之外的其它L命令如ITEdtep等操作數(shù)據(jù)庫(kù)令我們execueUpdateStatementStatementsmt=ResultSetResultSet接口用于得到包含了執(zhí)行SQL查詢(xún)語(yǔ)句返回的結(jié)果集,這個(gè)結(jié)果集實(shí)質(zhì)上上面(不指向任何記錄)next()方法,它就向下移動(dòng)一行,到達(dá)目標(biāo)行之后,getXXX()方法得到目標(biāo)的字段值。ResultSet接口提供的常用方法如下:booleanrelative(introw)rowrow是正booleanfirst()1個(gè)記錄,返回布爾值,只能用于可滾動(dòng)結(jié)果booleannext()intgetInt(intColumnIndex)Javaint類(lèi)型表示的字段longgetLong(intColumnIndex)Javalong類(lèi)型表示的floatgetFloat(intColumnIndex)Javafloat類(lèi)型表示的doublegetDouble(intColumnIndexJavaDouble類(lèi)型表DategetDate(intColumnIndex)java.sql.DateDate類(lèi)型表示byte[]getBytes(intcolumnIndex):返回指定字段的以字節(jié)數(shù)組形式表示的字ColumnIndexgetXXX()Javaint或者integer的字段,對(duì)應(yīng)的Java數(shù)據(jù)類(lèi)型是int,應(yīng)該使用ResultSet類(lèi)的getInt()方法去。表2-1列出了SQL數(shù)據(jù)Java數(shù)據(jù)類(lèi)型之間的對(duì)應(yīng)關(guān)系。需要提醒讀者的是,因?yàn)楦鞣N數(shù)據(jù)庫(kù)之間的差異,SQL數(shù)據(jù)類(lèi)型。2-1SQLJavaSQLJavaimportimportpublicclasspublicstaticvoidmain(Stringargs[]){newStringStatementstmt=conn.createStatement();ResultSet"select*fromstudentsorderbystudent_id"); System.out.println("studentid: studentname:}}catch(SQLException}}}}Statement類(lèi)提供的方法executeQuery()ResultSetResultSetrs=stmt.executeQuery("select*fromstudentsorderbyexecuteQuery()studentsResultSet對(duì)象中。我們?cè)诔蘥etString()students數(shù)據(jù)表內(nèi)記到下一筆記錄時(shí)若是成功的話會(huì)返回boolean值true,這使得while循環(huán)得以再度執(zhí)行,如while循環(huán)再次調(diào)studentid: studentname:studentid: studentname:studentid: studentname:另外,如果字段中保存的數(shù)據(jù)是二進(jìn)制數(shù)據(jù),對(duì)應(yīng)的方法如下if(rs!=null)while(rs.next())byte[]imgBytes=if(rs!=null)while(rs.next())byte[]imgBytes=//}}PreparedStatementStatementSQL語(yǔ)句傳遞給數(shù)據(jù)庫(kù)。這SQLSQL語(yǔ)句是查詢(xún)以當(dāng)單一的SQL語(yǔ)句在程序中被執(zhí)行多次時(shí),使用PreparedStatement對(duì)象來(lái)執(zhí)行SQL語(yǔ)PreparedStatementSQLSQL語(yǔ)句,就是可以SQL語(yǔ)句中提供參數(shù),這可大大提高程序的靈活性和執(zhí)行效率。PreparedStatementResultSetexecuteQuery()SQLSELECT對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)記錄的voidsetInt(intparameterIndex,intx)PreparedStatementINparameterIndexSQLIN參數(shù)。voidsetNull(intparameterIndex,intsqlType):將 型數(shù)賦PreparedStatementINININ參數(shù)voidsetTime(intparameterIndex,Timex)INvoidsetBinaryStream(intparameterIndex,InputStreamx,intlength):將長(zhǎng)度為lengthPreparedStatementINPreparedStatementimportjava.sql.*;publicimportjava.sql.*;publicclassPrepStmt{publicstaticvoidmain(String[]}}}newStringurl="jdbc:oracle:thin:@localhost:1521:ora8";Connectionconn=DriverManager.getConnection(URL,Stringsql="insertintostudentsvalues(?,?,?,?)";PreparedStatementstmt=conn.prepareStatement(sql);}catch(SQLExceptione){}studentsPreparedStatement對(duì)SQL語(yǔ)句時(shí),用“?”作為動(dòng)態(tài)參數(shù)的占位符。例如:StringStringsql="insertintostudentsPreparedStatementConnectionprepareStatement()方法,Connection對(duì)象名為connPreparedStatementprepare的語(yǔ)句為:PreparedStatementPreparedStatementstmt=PreparedStatementSQL語(yǔ)句作為數(shù),這些占位符參數(shù)稱(chēng)為IN參數(shù)。為了傳遞這些IN參數(shù),需要調(diào)用PreparedStatement對(duì)setXXX()方法,其中,XXX根據(jù)不同的數(shù)據(jù)類(lèi)型選擇。例如,為上例創(chuàng)建的stmt對(duì)象傳遞的IN參數(shù)有四個(gè),它們分別對(duì)應(yīng)數(shù)據(jù)庫(kù)的字段student_idsetInt()方法:將數(shù)據(jù)“Jerrystmt2INResultSetResultSetResultSet類(lèi)來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行增加、刪除以及修改的操作。如果要使用ResultSetJDBC2.0Statementstmt=Statementstmt=對(duì)于PreparedStatementPreparedStatementpstmt=其中,typeResultSetconcurrencyResultSet來(lái)更新2-2type2-3concurrency2-2type2-3concurrency當(dāng)使用TYPE_SCROLL_INSENSITIVE或者TYPE_SCROLL_SENSITIVE來(lái)創(chuàng)建Statement對(duì)象時(shí),可以使用ResultSet的first()/last()/beforeFirst()/afterLast()/relative()/importimportpublicclasspublicstaticvoidmain(Stringargs[]){newStringStatementstmt=conn.createStatement(Stringsql="select*fromstudentsorderbystudent_id";ResultSetrs=stmt.executeQuery(sql);System.out.println("studentid:"+rs.getString(1) studentname:System.out.println("studentid: studentname:}catch(SQLExceptione){}}}在這個(gè)程序中,我們使用TYPE_SCROLL_INSENSITIVE和CONCUR_READ_ONLY兩個(gè)參數(shù)來(lái)創(chuàng)建Statement對(duì)象,然后,獲取ResultSet,這個(gè)ResultSet對(duì)象rs就是可滾動(dòng)的結(jié)果集此時(shí)就可以使用ResultSet的包括next()在內(nèi)的其他移動(dòng)指針的方法如:last()、studentid: studentname:studentid: studentname:Statement的時(shí)候指定第二個(gè)ResultSet.CONCUR_UPDATABLE。集??梢允褂肦esultSet類(lèi)的getConcurrency()ResultSet中的下列方法來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行更新updateXXX(intfieldNum,XXXdata)getXXX()/setXXX()類(lèi)似的方法,其需要更新的數(shù)據(jù)。另外也可以更新指定字段名稱(chēng)對(duì)應(yīng)的數(shù)據(jù),使用updateXXX(StringfieldName,XXXdata)fieldName就是我們要更新的updateXXX()方法只會(huì)修改結(jié)果集中updateXXX()方法后執(zhí)updateXXX()updateXXX()方法后移動(dòng)了指針,將updateXXX()方法來(lái)向這個(gè)當(dāng)前為空的行中插入數(shù)據(jù),注意,在執(zhí)行完updateXXX()方法的時(shí)候,需要調(diào)用insertRow()方法,來(lái)將新增到結(jié)果集:將指針移回到調(diào)用在這個(gè)例子中,所有學(xué)生的都加一歲importjava.sql.*;importjava.sql.*;publicclassUpdResult{publicstaticvoidmain(Stringargs[]){newStringStatementstmt=conn.createStatement(Stringsql="selectstudents.*fromstudentsorderbystudent_id";ResultSetrs=stmt.executeQuery(sql);//intage=}}catch(SQLExceptione){}}},,JDBC中使用可更新的結(jié)果集來(lái)更新數(shù)據(jù)庫(kù),不能使用“select*fromtable”方式的SQL語(yǔ)句,必須將它寫(xiě)成如下兩種形式之一:selecttable.*fromselectcolumn1,column2,column3from在JDBC中如何去調(diào)用一個(gè)過(guò)程呢?是Statement或者PreparedStatement,通過(guò)這個(gè)CallableStatement對(duì)象,就可以去調(diào)用數(shù)據(jù)ConnectionprepareCall()CallableStatementconn.prepareCall("{call 過(guò)程名稱(chēng)如果過(guò)程有參數(shù)conn.prepareCall("{callconn.prepareCall("{call其中,占位符“?”是IN、OUT還是INOUT取決于 conn.prepareCall("{call?=conn.prepareCall("{call?=conn.prepareCall("{callcreateorreplaceprocedureinsert_students(stu_idINchar,stu_nameINchar,stu_ageINinteger,stu_sexINchar)createorreplaceprocedureinsert_students(stu_idINchar,stu_nameINchar,stu_ageINinteger,stu_sexINchar)/insertintostudents我們?cè)賮?lái)看如何使用JDBC調(diào)用這個(gè)過(guò)程importjava.sql.*;publicclassCallSP{publicstaticvoidmain(String[]args){newStringStringsql="{callinsert_students(?,?,?,?)}";CallableStatementstmt=conn.prepareCall(sql);}catch(SQLExceptione){}}}CallableStatement,并且將調(diào)用過(guò)程“insert_students”的語(yǔ)句“{callinsert_students(?,?,?,?)}importjava.sql.*;publicclassCallSP{publicstaticvoidmain(String[]args){newStringStringsql="{callinsert_students(?,?,?,?)}";CallableStatementstmt=conn.prepareCall(sql);}catch(SQLExceptione){}}}如果你使用的JDBC版本是3.0(被包含在JDK1.4變量的類(lèi)型,可以通過(guò)java.sql.Types的靜態(tài)常量來(lái)指定,例如,Types.FLOAT、Types.INTEGERINsetXXX()方法來(lái)指定就可以了。指定了IN/OUT參數(shù)后,就可以使用stmt的execute()方法來(lái)執(zhí)行對(duì)過(guò)程的調(diào)用下面我們來(lái)看一個(gè)例子,首先我們定義一個(gè)過(guò)程如下createorreplaceproceduretotal_students(numsOUTinteger)createorreplaceproceduretotal_students(numsOUTinteger)selectcount(*)INTOnumsfrom/importjava.sql.*;importjava.sql.*;publicclassCallSPOut{publicstaticvoidmain(String[]args){newStringCallableStatementstmt=conn.prepareCall("{call}}}catch(SQLExceptione){}}CallableStatementregisterOutputParameter()來(lái)指定輸出參數(shù)的數(shù)據(jù)類(lèi)型,然后使用CallableStatement對(duì)象的getXXX()方法來(lái)取出輸出數(shù)據(jù),這兩個(gè)地方的數(shù)據(jù)類(lèi)型必須匹配還有就是在這里的getXXX()方法是CallableStatement對(duì)象ResultSet的方法。JDBC中,怎么處理事務(wù)呢?利用Connection對(duì)象的 自動(dòng)提交。還可以使用Connection對(duì)象的 打開(kāi)。如果將自動(dòng)提交功能關(guān)閉,那么,就可以調(diào)用Connection的commit()方法來(lái)提交所有更新或者rollback()方法來(lái)取消更新。importjava.sql.*;publicimportjava.sql.*;publicclassTrans{publicstaticvoidmain(Stringargs[]){Connectionconn=null;newStringurl=}}}//執(zhí)行SQL語(yǔ)句 }catch(SQLException{}catch(SQLException{}}mitconn=DriverManager.getConnection(url,"scott","tiger");Statementstmt=conn.createStatement();Stringsql1="insertintostudentsvalues('IBM001','Jenny',30,'F')";Stringsql2="insertintostudents將自動(dòng)提交功能關(guān)閉的情況下,如果所有的SQL語(yǔ)句都正確執(zhí)行了,那么需要調(diào)用Connection的commit()方法提交事務(wù),如果出現(xiàn)異常,需要調(diào)用Connection的rollback()方SQL語(yǔ)句)集合到一起執(zhí)行,以提高效率。JDBCStatementaddBatch()方法向其中加入SQL語(yǔ)句,然后,使用Statement對(duì)象的executeBatch()方法來(lái)一次執(zhí)行加入到批處理中的SQL語(yǔ)句。注意,在使用addBatch()加入SQL語(yǔ)句的時(shí)候,語(yǔ)句并不會(huì)執(zhí)行,只有在調(diào)用executeBatch()方法后,才會(huì)執(zhí)行。通常,會(huì)將批處理和事務(wù)處理結(jié)合起來(lái)使用。Trans.javaimportjava.sql.*;publicimportjava.sql.*;publicclassBatch{publicstaticvoidmain(Stringargs[]){Connectionconn=null;newStringurl=conn=DriverManager.getConnection(url,"scott","tiger");Statementstmt=conn.createStatement();//SQLStringsql1="insertintostudentsvalues('IBM003','Jimy',30,'F')";Stringsql2="insertintostudentsvalues('IBM004','Hanks',20,'M')";mit//SQLBatch中}} }catch(SQLException{}catch(SQLException{}}}////SQLBatch中OracleBLOB/CLOBOracle9i以后的版本中,新增了兩種數(shù)據(jù)類(lèi)型用于保存這類(lèi)數(shù)據(jù):BLOB(BinaryLargeOBject)CLOB,(CharacterLargeOBject)。本節(jié)結(jié)合一個(gè)實(shí)例來(lái)講解如何通過(guò)JDBC將一張保存到Oracle數(shù)據(jù)庫(kù)中,以及如何使用JDBC從數(shù)據(jù)庫(kù)中讀出保存的。,createtableStudent_List(Student_IDvarchar2(20)primaryStudent_Namevarchar2(20)notcreatetableStudent_List(Student_IDvarchar2(20)primaryStudent_Namevarchar2(20)notStudent_List的表,它包含三個(gè)字段:Student_IDStudent_PicsetBinaryStream(intidx,InputStreamis,int到數(shù)據(jù)庫(kù)字段Student_Pic中,需要使用PreparedStatement對(duì)象上的setBinaryStream(intidx,InputStreamis,intsetBlob(intsetBlob(intidx,Blobimportimportjava.sql.*;importjava.io.*;publicclasspublicstaticvoidmain(String[]args){Connectionconn=null;PreparedStatementstmt=null;FileInputStreamfis=null;Stringurl="jdbc:oracle:thin:@localhost:1521:nitpro";conn=DriverManager.getConnection(url,"system","manager");Stringsql="insertintoStudent_Listvalues(?,?,?)";Filefile=newFile("C:/nos/rgb.jpg");fis=newFileInputStream(file);stmt.setBinaryStream(3,fis,}catch(SQLException}}}}catch(IOException{}catch(ClassNotFoundException{}{{{}catch(SQLException{}}{{}catch(IOException{}}}Oracle10g,可以到下列地址直接下載Oracle10g的JDBC驅(qū)動(dòng):將保存到數(shù)據(jù)庫(kù)中之后,接著來(lái)看如何通過(guò)JDBC將從數(shù)據(jù)庫(kù)中出來(lái)。要從數(shù)據(jù)庫(kù)中讀出BLOB的數(shù)據(jù),可以使用ResultSet中的getBinaryStream()或者getBlob()方法。我們?cè)诖耸褂胓etBinaryStream()這個(gè)方法,它將返回一個(gè)InputStream類(lèi)型importimportjava.sql.*;importjava.io.*;publicclasspublicstaticvoidmain(String[]args){PreparedStatementstmt=null;ResultSetrs= Connectionconn=null;FileOutputStreamfos=null;Stringurl conn=DriverManager.getConnection(url,"system","manager");Stringsql="select*fromStudent_ListwhereStudent_ID='id001'";stmt=rs=Filefile=newFile("C:/tmp/rgb.jpg");f
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中共廣安市委組織部2026年度公開(kāi)遴選工作人員備考題庫(kù)及1套完整答案詳解
- 《阿Q正傳》分層作業(yè)
- 2025年核電站用鋼十年應(yīng)用案例分析報(bào)告
- 技巧教師資格證面試
- 公司規(guī)章制度執(zhí)行與監(jiān)督檢查表
- 人工智能顛覆的行業(yè)
- 2026年環(huán)保新材料研發(fā)報(bào)告及替代傳統(tǒng)材料市場(chǎng)分析報(bào)告
- 2025年教育科技行業(yè)應(yīng)用趨勢(shì)報(bào)告
- 安全用藥知識(shí)宣傳課件
- 2026年綠色電力證書(shū)價(jià)值釋放項(xiàng)目投資計(jì)劃書(shū)
- 懷化市2024-2025學(xué)年高一上學(xué)期期末地理試題(含答案解析)
- 全國(guó)班主任比賽一等獎(jiǎng)《班主任經(jīng)驗(yàn)交流》課件
- 前列腺癌內(nèi)分泌治療護(hù)理
- 偽裝防護(hù)基礎(chǔ)知識(shí)
- 四川省成都市2024年七年級(jí)上學(xué)期期末數(shù)學(xué)模擬試卷6套【附參考答案】
- 消化內(nèi)科危重患者護(hù)理
- 小學(xué)二年級(jí)上冊(cè)期中考試數(shù)學(xué)試卷含答案(共3套-人教版)
- 《04S519小型排水構(gòu)筑物(含隔油池)圖集》
- 無(wú)人機(jī)禁飛區(qū)飛行解禁如何申請(qǐng)
- JTG D30-2015 公路路基設(shè)計(jì)規(guī)范
- 單位委托物業(yè)管理合同范本
評(píng)論
0/150
提交評(píng)論