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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、8.3 JDBC數(shù)據(jù)庫操作2013 年6 月 19 Fl4甲第8章Java Web數(shù)據(jù)庫程序設計2013 年6 19IIJava Web數(shù)據(jù)庫程序設計8.1數(shù)據(jù)庫訪問技術 8-2 JDBC體系結構 8.3 JDBC數(shù)據(jù)庫操作8.4數(shù)據(jù)庫連接池8.5數(shù)據(jù)庫應用實例分析與設計 Connection 接口 Statement 接 口 ResultSet 接口2013 年6 月 19 Fl8.3 JDBC數(shù)據(jù)庫操作 Connection 接口 Connection是用*表示數(shù)據(jù)庫連接的對象,對數(shù)據(jù) 庫的一切操作都是在這個連接的基礎上進行的。 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ā)性的結果集resultSetType:1) TYPE_FORWARD_ONLY是默認值,僅支持結果集forward ,不支持滾動/也 不圧SENSITIVE的 ResultSet

3、.TYPE SCROLL INSENSITIVE,支持結果集backforward , last first等操作 一一3)ResultSet.TYPE_SCROLL SENSITIVE丈持結果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)建預處理語句5. prepareCall(String sql):創(chuàng)建可調用語句6. getAutoC

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

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

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

7、執(zhí)行 一系列的查詢或更新。如果發(fā)生故障,則在catch塊中調Jtlrollback;如果事務成功,則在try塊的結尾調用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í)行成功則擰應務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塊之夕卜。 這樣除非成功獲取連接,否則不會調用rollbacko如果把獲取連接的語句放在try/catch快之內,一旦在 連接成功

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

11、3種Statement對彖:Statement, Statement對象用于執(zhí)彳j:不帶參數(shù)的簡單 SQL語句; PreparedStatement (繼承自Statement ), PreparedStatement對象用于執(zhí)彳j帶或不帶IN參數(shù)的預 編譯SQL語句; CallableStatement (繼|PreparedStatement), CallableStatement對象用于執(zhí)行對數(shù)據(jù)庫已存儲過程的調 用。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()關閉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ù)庫查詢,返回結 果集9.int executellpdate(String sql)進彳了數(shù)據(jù)庫更新 lO.Connection getConnection()獲取對數(shù)據(jù)庫的連接 getFetchDirection()獲取從數(shù)據(jù)用農中獲収行數(shù)據(jù)的方向 12.int getFetchSize()獲取返冋的數(shù)據(jù)庫結果集行數(shù)13.int getMaxFieldSize()獲取返回的數(shù)據(jù)庫結果集最人1字段數(shù)14.int getMaxRows()獲取返回的數(shù)據(jù)庫結果集故人行數(shù)1

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

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

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

17、句,因此可以獲得更高 的執(zhí)行效率。在PreparedStatement語句中可以包含多個用”? ”代表的字段,在程序中可以利用 setXXX方法設置該字段的內容,從而增強了 程序設計的動態(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ù)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ù)組類里7. void setAsciiStream(int index,InputStream stream,!nt length)設胃為ASCII輸入流212013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口8. void setBigDecimal(int index,BigDecimal x)設置為 I進制長類 型9.

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

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

21、void setTime(int index,Time x)設置為時間類取232013 年6 月 19 Fl8.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口 PreparedStatement與Statement的區(qū)別在于它構造的SQL語句不是完整的語句,而需要在程序中進行動態(tài)設 置。這一方而增強了程序設計的靈活性;另一方面,由于 PreparedStatement語句是經過預編譯的,I大1此它構造的 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點獎勵,則可以用下面的方法設且空字段的內容pstmt.setlnt(l, 5000);pstmt. setlnt (2, 1);252013 年6 月 19 FI8.3 JDBC數(shù)據(jù)庫操作 PreparedStateme nt 接口

23、如杲我們想給前50個注冊的用戶每人5000點獎勵, 可以用循環(huán)語句對空字段進行設置: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ù)設讒歆觀劇跚鬣鸚f盪轟勰燉輸入漩 JDBC捉供了3種將IN參數(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ā)送文件內容的例子: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();當語句執(zhí)行時,將反復調丿IJ輸入流fin以傳遞其數(shù)據(jù)。292013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 CallableStatement 接口 Calla

26、bleStatement對彖用丁執(zhí)行對數(shù)據(jù)庫12存儲過程的 調用。在CallableStatement對象中,冇一個通用的成員方法call, 這個方法用于以名稱的方式調用數(shù)據(jù)庫中的存儲過程。在數(shù)據(jù)庫調用過程中,可以通過設置IN參數(shù)向調用的存 儲過程提供執(zhí)行所需的參數(shù)。切外,在存儲過程的調川中,通過OUT參數(shù)獲取存儲過程的執(zhí)行結果。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 接口調用存儲過程的語法為: call procedure_name過程不需要參數(shù)華all tC?,?,?,.)過程需要若個參 ? = call procedure_name(?z?z?,.)過程需要若 年個參藪菲返回一個參藪其為存儲過程的名字,方括弓小的內 容是可選的多個用于存儲過程執(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ù)設置如下:cstmt.setByte(l, 25);cstmt.setlnt(2,64.85);352013年6丿J19II8.3 JDBC數(shù)據(jù)庫操作 CallableStatement 接口如杲需要存儲過程返凹運行結杲,則需要調用registerOutParameter方法設置存儲過程的輸出參數(shù),然 后調用getXXX方法來獲取存儲過程的執(zhí)行結果。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ù)類型的對丿應關系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 接口結果集(ResultSet)用來暫時存放數(shù)據(jù)庫杳詢操作獲得 的結果。它包含了符合SQL語句中條件的所有行,并且它提供了 一套get方法對這些行中的數(shù)據(jù)進行訪問。8.3 JDBC數(shù)據(jù)庫操作 ResultSet 接口1. boolean absolute(int row)將指針移動到結果集對彖的杲一行2. void afterLast()將指針移動到結果卑對球的末尼3. void beforeFirst()將指針移動到結來集對象的頭部4. boolean first()將指針移動到結果集對象的第行5. Array getArray(int row)獲取結果集中的某行并將其存入個數(shù)纟II6. boolean getBo

溫馨提示

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

評論

0/150

提交評論