第8章JavaWeb數(shù)據(jù)庫程序設(shè)計_3解析_第1頁
第8章JavaWeb數(shù)據(jù)庫程序設(shè)計_3解析_第2頁
第8章JavaWeb數(shù)據(jù)庫程序設(shè)計_3解析_第3頁
第8章JavaWeb數(shù)據(jù)庫程序設(shè)計_3解析_第4頁
第8章JavaWeb數(shù)據(jù)庫程序設(shè)計_3解析_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、8.3 JDBC數(shù)據(jù)庫操作2013 年6 月 19 Fl4甲第8章Java Web數(shù)據(jù)庫程序設(shè)計2013 年6 19IIJava Web數(shù)據(jù)庫程序設(shè)計8.1數(shù)據(jù)庫訪問技術(shù) 8-2 JDBC體系結(jié)構(gòu) 8.3 JDBC數(shù)據(jù)庫操作8.4數(shù)據(jù)庫連接池8.5數(shù)據(jù)庫應(yīng)用實例分析與設(shè)計 Connection 接口 Statement 接 口 ResultSet 接口2013 年6 月 19 Fl8.3 JDBC數(shù)據(jù)庫操作 Connection 接口 Connection是用*表示數(shù)據(jù)庫連接的對象,對數(shù)據(jù) 庫的一切操作都是在這個連接的基礎(chǔ)上進行的。 Connection的創(chuàng)建方法DriverMa nager.

2、getC onn ectio n()8.3 JDBC數(shù)據(jù)庫操作 Connection 接口1. void clearWarnings()irf除連接的所有警告信息2. createStatement():創(chuàng)建數(shù)據(jù)庫連接3.Statement createStatement(int resultSetType, int resultSetConcurrency)創(chuàng)住一個statement/象,它將牛成具 有特定類型和并發(fā)性的結(jié)果集resultSetType:1) TYPE_FORWARD_ONLY是默認值,僅支持結(jié)果集forward ,不支持滾動/也 不圧SENSITIVE的 ResultSet

3、.TYPE SCROLL INSENSITIVE,支持結(jié)果集backforward , last first等操作 一一3)ResultSet.TYPE_SCROLL SENSITIVE丈持結(jié)果Ifebackforward , last , first等操作,對其它session對數(shù)據(jù)庫中數(shù) 據(jù)做出的更改是緻感的2013 年6 月 19 FI8.3 JDBC數(shù)據(jù)庫操作2013 年6 月 19 FI7 Conn ectio n接口4. prepareStatement(String sqI):創(chuàng)建預(yù)處理語句5. prepareCall(String sql):創(chuàng)建可調(diào)用語句6. getAutoC

4、ommit():獲取門動提交的模式7. setAutoCommit():設(shè)置門動提交的模式8.String getCatalog()9. boolean isReadOnly()10. void setReadOnly() 獲取連接対彖的當(dāng)前I【錄名 判斷連接是否為只讀模式 設(shè)置連接的只讀模式8.3 JDBC數(shù)據(jù)庫操作2013 年6 月 19 FI8 Connection 接口11. commitO:提交所執(zhí)行的SQL語句12. rollback():回滾所執(zhí)行的SQL語句13. getMetaData():獲取一個 DatabaseMetaData 對彖,該對 象包含了有關(guān)數(shù)據(jù)庫的基本信息1

5、4. close():關(guān)閉數(shù)據(jù)庫連接15.isClose():判斷數(shù)據(jù)庫連接是否超時或被顯示關(guān)閉2013 年6 月 19FI8.3 JDBC數(shù)據(jù)庫操作 ConneCtlOn扌斐 I I (JDBCTransation)一、Transation(事務(wù)處理)的概念:在更新數(shù)據(jù)庫時,默認情況下,更改是永久性寫入 到數(shù)據(jù)庫。然而這種默認行為可以通過編寫程序來 關(guān)閉。在自動交付關(guān)閉的情況下,如果在更新時發(fā)牛問題, 則對數(shù)據(jù)庫的每個更改都能夠取消(或者說回退到最 初的值)。如杲更新成功,那么之后可以將這些更改永久性提 交給數(shù)據(jù)庫。這種方式也稱為事務(wù)管理。8.3 JDBC數(shù)據(jù)庫操作 Conn ection

6、接 口 (JDBC-Transation)我們需要確保,要么所有的操作都發(fā)生,要 么所有的操作都不發(fā)生。這就是事務(wù)管理的 原則。事務(wù)的ACID特性。原子性(Atomicity) 一致性(Consistency )隔離性(Isolation)持久性(Durabilily)2013 年6 月 19 Fl8.3 JDBC數(shù)據(jù)庫操作 Conn ection 接 口 (JDBC-Transation)使用T ransation保證數(shù)據(jù)庫的完整性我們使用try-catch-finally塊來止確地應(yīng)對事務(wù)管理:首先,記錄自動提交的當(dāng)前狀態(tài)。然后,在try塊中,調(diào)用setAutoCommit(faIse)并

7、執(zhí)行 一系列的查詢或更新。如果發(fā)生故障,則在catch塊中調(diào)Jtlrollback;如果事務(wù)成功,則在try塊的結(jié)尾調(diào)用commito不管哪種方式,都在finally塊中亟置自動提交的狀態(tài)。 Conn ection 接 口(JDBCTansation)使用Transation保證數(shù)據(jù)庫的完整性(例)Connection connection = DriverManager getConnec:*tion(urls username, password); boolean autoConmit = connection getAtrtoCQmjT.it ();Statement statemen

8、t;tryconnection. setAutoComit(false) ;/庫的自動statement = connection create St atemerit ();statement, execute ();s tatemont. execute ( );UUUUttC tx UXL. CUMLL t 0 ,/如果所訂詒句執(zhí)行成功則擰應(yīng)務(wù)2013年6丿J19II12118.3 JDBC數(shù)據(jù)庫操作 Connection接口(JDBCTransation)使用Transation保證數(shù)據(jù)庫的完整性(例)I catch(SQLException sqle) cunnHcttuu roll

9、back ();/如果1異常發(fā)生則回溯MJ的出勢final lyif (statement! =nul 1) statement closeO ; cunnectiom setAutoCuHLL t (autoCimu. t) # Hl自動提交鴿狀態(tài)2013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 ConnCCtiOn扌妾 I 丨(JDBCTransation)使用Transation保證數(shù)據(jù)庫的完整性從DriverManager獲取連接的語句在try/catch塊之夕卜。 這樣除非成功獲取連接,否則不會調(diào)用rollbacko如果把獲取連接的語句放在try/catch快之內(nèi),一旦在 連接成功

10、后發(fā)生異常,由于rollback的作用會把已經(jīng)建 立的連接斷開。13但是getConnection方法也會拋出SQLException異常 這個異常要么被外圍的方法重新拋出,要么在單獨的 try/catch塊內(nèi)捕獲。2013 年6 月 19 FI8.3 JDBC數(shù)據(jù)庫操作 Statement 接口 Statement用于在已經(jīng)建立的連接的基礎(chǔ)上 向數(shù)據(jù)庫發(fā)送SQL語句的對象。它只是一個接口的定義,其中包括了執(zhí)行 SQL語句和獲取返冋結(jié)果的方法。創(chuàng)建statement對象的方法如下:Statement stmt = con,createStatement(); Statement 接 口實際上有

11、3種Statement對彖:Statement, Statement對象用于執(zhí)彳j:不帶參數(shù)的簡單 SQL語句; PreparedStatement (繼承自Statement ), PreparedStatement對象用于執(zhí)彳j帶或不帶IN參數(shù)的預(yù) 編譯SQL語句; CallableStatement (繼|PreparedStatement), CallableStatement對象用于執(zhí)行對數(shù)據(jù)庫已存儲過程的調(diào) 用。CallableStatement添加了處理OUT參數(shù)的方法。152013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 Statement 接口1. void addBatc

12、h(String sql)Statement語句屮增加用數(shù)據(jù)庫操作的SQL批處理語句2. void cancel()取消Statement中的SQL語句抬定的數(shù)據(jù)庫操作命令3. void clearBatch()清除Statement中的SQL批處理語句4. void clearWarnings()詁除Statement語句中的操作引起的警告5. void close()關(guān)閉Statement語句指定的數(shù)據(jù)炸連接&boolean execute(String sql)執(zhí)行SQL語旬7.int executeBatch()執(zhí)行多個SQL語句2013 年6 月 19 Fl168.3 JDBC數(shù)據(jù)庫

13、操作 Statement 接 口8. ResultSet executeQuery(String sql)進行數(shù)據(jù)庫查詢,返回結(jié) 果集9.int executellpdate(String sql)進彳了數(shù)據(jù)庫更新 lO.Connection getConnection()獲取對數(shù)據(jù)庫的連接 getFetchDirection()獲取從數(shù)據(jù)用農(nóng)中獲収行數(shù)據(jù)的方向 12.int getFetchSize()獲取返冋的數(shù)據(jù)庫結(jié)果集行數(shù)13.int getMaxFieldSize()獲取返回的數(shù)據(jù)庫結(jié)果集最人1字段數(shù)14.int getMaxRows()獲取返回的數(shù)據(jù)庫結(jié)果集故人行數(shù)1

14、5. boolean getMoreResults()獲取Statement的下一個結(jié)果16.int getQueryTimeout()哦取查詢超時設(shè)置172013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 Statement 接 口17.ResultSet getResultSet()獲取結(jié)果集18.int getUpdateCount()唳取更新記錄的數(shù)量19. void setCursorName(String name)設(shè)置數(shù)據(jù)庫Cursor的名稱20. void setFetchDirection(int dir)設(shè)置數(shù)據(jù)庫農(nóng)中獲取行數(shù)據(jù)的 方向21. void setFetchSi

15、ze(int rows)設(shè)置返冋的數(shù)據(jù)庫結(jié)果集行數(shù)22. void setMaxFieldSize(int max)設(shè)置垠人字段數(shù)23. void setMaxRows(int max)設(shè)置最大行數(shù)24. void setQueryTimeout(int seconds)設(shè)置查詢超時時間8.3 JDBC數(shù)據(jù)庫操作 Statement 接口值紂注意的足,Statement接口捉供了3種執(zhí)行SQL語句的方 法: executeQuery executellpdate execute o使用哪一個方法山SQL語句所產(chǎn)生的內(nèi)容決怎。 executeQuery方法用產(chǎn)牛單個結(jié)果集的SQL語句,如SELE

16、CT executeUpdate方法用于執(zhí)行INSERT. UPDATE. DELETE及DDL(數(shù)據(jù)怎義語言)語句,例如CREATE TABLE和DROP TABLE。 executeUpdate的返冋缶足一個整藪,&示它執(zhí)彳j MjSQL出句所 影響的數(shù)瓠庫中的農(nóng)的行數(shù)(更新計數(shù))。 execute方法用于執(zhí)行返回多個結(jié)果集或多個史新計數(shù)的語句。192013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口 PreparedStatement 接 口繼承 了 Statement 接口,但PreparedStatement語句屮包含了 經(jīng)過預(yù)編譯的SQL語

17、句,因此可以獲得更高 的執(zhí)行效率。在PreparedStatement語句中可以包含多個用”? ”代表的字段,在程序中可以利用 setXXX方法設(shè)置該字段的內(nèi)容,從而增強了 程序設(shè)計的動態(tài)性。2013年6丿J19II208.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口l. void addBatch(String sql)在Statement語句中增加用 丁數(shù)據(jù)庫 操作的SQUlt處理語句2. void clearparameters ()清除PreparedStatement111 的設(shè)置參數(shù)3. ResultSet executeQuery()執(zhí)行SQL查詢語句4.i

18、nt executeUpdate()執(zhí)行SQL更新語句5.ResuItSetMetaData getMetaData()進行數(shù)據(jù)庫杳詢,獲取數(shù) 據(jù)庫元數(shù)據(jù)6. void setArray(int index,Array x)設(shè)置為數(shù)組類里7. void setAsciiStream(int index,InputStream stream,!nt length)設(shè)胃為ASCII輸入流212013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口8. void setBigDecimal(int index,BigDecimal x)設(shè)置為 I進制長類 型9.

19、 void setBinarySt佗am(int indexzInputStream stream,int length)設(shè)置為進制輸入流10. void setCharacterStream11. (int index,InputStream stream,int length)設(shè)置為F符輸入流12. void setBoolean(int index, boolean x)設(shè)直為邏輯類型13. void setByte(int index,byte b)設(shè)置為字節(jié)類型14. void setBytes(int byte b)設(shè)置為字節(jié)數(shù)組類型15. void setDate(int ind

20、ex,Date x)設(shè)置為 H 期類型 PreparedStateme nt 接口16. void setFloat(int indexzfloat x)設(shè)置為浮點類型17. void setlnt(int index,int x)設(shè)置為整數(shù)類型18. void setLong(int indexjong x)設(shè)置為 K整數(shù)類糧19. void setRef(int index,int ref)設(shè)置為引用類型20. void setShort(int index,short x)設(shè)置為短整數(shù)類型21. void setString(int index,String x)設(shè)置為字符串類型22.

21、void setTime(int index,Time x)設(shè)置為時間類取232013 年6 月 19 Fl8.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口 PreparedStatement與Statement的區(qū)別在于它構(gòu)造的SQL語句不是完整的語句,而需要在程序中進行動態(tài)設(shè) 置。這一方而增強了程序設(shè)計的靈活性;另一方面,由于 PreparedStatement語句是經(jīng)過預(yù)編譯的,I大1此它構(gòu)造的 SQL語句的執(zhí)行效率比較高。對于某些使川頻繁的SQL語.J, JljPreparedStatement語 U比丿IJ Statement具有明顯的尤勢。2013 年6 月

22、19FI248.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口 PreparedStatement對彖的創(chuàng)建方法如下:PreparedStatement pstmt =con.prepareStatement(update tbl_User set reward = ? where userid = ?H);例如,我們想給第一個注冊的用戶5000點獎勵,則可以用下面的方法設(shè)且空字段的內(nèi)容pstmt.setlnt(l, 5000);pstmt. setlnt (2, 1);252013 年6 月 19 FI8.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口

23、如杲我們想給前50個注冊的用戶每人5000點獎勵, 可以用循環(huán)語句對空字段進行設(shè)置:pstmt.setl5000);for (int i = 0; i 50; i+)pstmt.setl nt(2,i);int rowCount = pstmt.executeUpdate(); 27 PreparedStateme nt 接口2013 年6 月 19 Fl8.3 JDBC數(shù)據(jù)庫操作 PreparedStatement 接 口響觀鑑劇聽則可以通過將IN參數(shù)設(shè)讒歆觀劇跚鬣鸚f盪轟勰燉輸入漩 JDBC捉供了3種將IN參數(shù)設(shè)置為輸入流的方法: setBinaryStream用于含有未說明字節(jié)的流; s

24、etAsciiStrea m用于含彳(ASCII字符的流: setllnicodeStream 用于含有 Unicode 字符的流。這些方法比其他的setXXX方法要多一個用于指定流 的總長度的參數(shù),因為一些數(shù)據(jù)庫在發(fā)送數(shù)據(jù)之前 需要知道它傳送的數(shù)據(jù)的人小。2013年6丿J19II288.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口 一個使用流作為IN參數(shù)發(fā)送文件內(nèi)容的例子:java. io. File file = new java, io FileCVUnp/data1);int fileLength = file. length();java. 10. Inputs

25、tream fin = new javaioTileInputStream(file);java.sql Prepar edStatement pstmt = con. prepar eStatement(update table set stuff = ? where in lex = 4);p stmt. setBinary Str earn (1, fin, fileLength);pstmt. executeUpdate();當(dāng)語句執(zhí)行時,將反復(fù)調(diào)丿IJ輸入流fin以傳遞其數(shù)據(jù)。292013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 CallableStatement 接口 Calla

26、bleStatement對彖用丁執(zhí)行對數(shù)據(jù)庫12存儲過程的 調(diào)用。在CallableStatement對象中,冇一個通用的成員方法call, 這個方法用于以名稱的方式調(diào)用數(shù)據(jù)庫中的存儲過程。在數(shù)據(jù)庫調(diào)用過程中,可以通過設(shè)置IN參數(shù)向調(diào)用的存 儲過程提供執(zhí)行所需的參數(shù)。切外,在存儲過程的調(diào)川中,通過OUT參數(shù)獲取存儲過程的執(zhí)行結(jié)果。2013年6丿J19II318.3 JDBC數(shù)據(jù)庫操作 CallableStatement 接口1 .Array getArray(int I)獲取數(shù)組2. BigDecimal getBigDecimal(int index) BigDecimalgetBigDec

27、imal(int index, int scale)獲取 I 進制小狄3. boolean getBoolean(int index)獲取邏輯類型4. byte getByte(int index)獲取寧節(jié)類型5. Date getDate(int index)6. Date getDate(int index,Calendar cal)獲取 U 期類型7. double getDouble(int index)獲瑕LI期類型雙楮度類型 &float getFloat(int index)獲取H期類型浮點類型9.int getint(int index)獲取H期類型整數(shù)類型312013 年6

28、月 19 Fl8.3 JDBC數(shù)據(jù)庫操作 CallableStatement 接口10.long getLong(int index)獲取口期類型長整數(shù)類型11.Object getObject(int index)12.0bject getObject(int index,Map map)獲取對彖類型13. Ref getRef(int I)獲取 H 期類型Ref類型14. short getShort(int index)獲取口期類型短整數(shù)類型 15.String getString(int index)獲取日期類型字符申類型16. Time getTime(int index)17. T

29、ime getTime(int index,Calendar cal)獲取時間類型2013 年6 月 19 Fl338.3 JDBC數(shù)據(jù)庫操作 CallableStatement 接口18. void registerOutputParameter(int index)19. void registerOutputParameter(int index,!nt type)20. void registerOutputParameter(int index,int type,int scale)注冊輸出參數(shù)332013 年6 月 19 Fl8.3 JDBC數(shù)據(jù)庫操作 CallableStatem

30、ent 接口調(diào)用存儲過程的語法為: call procedure_name過程不需要參數(shù)華all tC?,?,?,.)過程需要若個參 ? = call procedure_name(?z?z?,.)過程需要若 年個參藪菲返回一個參藪其為存儲過程的名字,方括弓小的內(nèi) 容是可選的多個用于存儲過程執(zhí)行的參數(shù)。 CallableStatement對象的創(chuàng)建方法如下:CallableStatement cstmt = con.prepareCall(Hcall getData(?z ?)”);2013 年6 月 19 Fl348.3 JDBC數(shù)據(jù)庫

31、操作 CallableStatement 接口向存儲過程傳遞執(zhí)行需要參數(shù)的方法是通過setXXX語句 完成的。例如,我們可以將兩個參數(shù)設(shè)置如下:cstmt.setByte(l, 25);cstmt.setlnt(2,64.85);352013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 CallableStatement 接口如杲需要存儲過程返凹運行結(jié)杲,則需要調(diào)用registerOutParameter方法設(shè)置存儲過程的輸出參數(shù),然 后調(diào)用getXXX方法來獲取存儲過程的執(zhí)行結(jié)果。cstmt.registerOutParameterfl java.sql.Types.TINYINT); cst

32、mt.registerOutParameterCl java.sql.Types. INTEGER); cstmt.executeUpdate();byte a = cstmt.getByte(l);int b = cstmt.getInt(2);2013年6丿J19II368.3 JDBC數(shù)據(jù)庫操作 CallableStatement 接口 Java皐木數(shù)據(jù)類型和SQL中支持的數(shù)據(jù)類型的對丿應(yīng)關(guān)系SQL數(shù)據(jù)類型CHARVARCHARLONGVARCHARJ咖數(shù)煙類型StringStringStrixigNUIhlERICjav&.inath.BigPcirndDECIMALjflva mat

33、h BigDecirrtdBITbooleanTI1IYINTbyteSMALUNTsliortINTEGERintBIGJNTlongREALflDlFLOATdoubleDOUBLEdoubleBINARYbyteQVARBINARYhyteflLONGVARB1NARY byteQDATEjtr/a sql.DaieTIMEjava sql.TiirieTIMESTAMP2013年6丿J19II38378.3 JDBC數(shù)據(jù)庫操作2013年6丿J19II ResultSet 接口結(jié)果集(ResultSet)用來暫時存放數(shù)據(jù)庫杳詢操作獲得 的結(jié)果。它包含了符合SQL語句中條件的所有行,并且它提供了 一套get方法對這些行中的數(shù)據(jù)進行訪問。8.3 JDBC數(shù)據(jù)庫操作 ResultSet 接口1. boolean absolute(int row)將指針移動到結(jié)果集對彖的杲一行2. void afterLast()將指針移動到結(jié)果卑對球的末尼3. void beforeFirst()將指針移動到結(jié)來集對象的頭部4. boolean first()將指針移動到結(jié)果集對象的第行5. Array getArray(int row)獲取結(jié)果集中的某行并將其存入個數(shù)纟II6. boolean getBo

溫馨提示

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

評論

0/150

提交評論