課件2012黑馬程序員jdbc_第1頁
課件2012黑馬程序員jdbc_第2頁
課件2012黑馬程序員jdbc_第3頁
課件2012黑馬程序員jdbc_第4頁
課件2012黑馬程序員jdbc_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、北京傳智播客教育 JDBC開發(fā)王昭珽北京傳智播客教育 Tip:使用JDBC處理大數(shù)據(jù)在實際開發(fā)中,程序需要把大文本或二進制數(shù)據(jù)保存到數(shù)據(jù)庫。基本概念:大數(shù)據(jù)也稱之為LOB(Large Objects),LOB又分為:clob和blobclob用于存儲大文本。blob用于存儲二進制數(shù)據(jù),例如圖像、聲音、二進制文等。對MySQL而言只有blob,而沒有clob,mysql存儲大文本采用的是Text,Text和blob分別又分為:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXTTINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB 北京傳智播客教育 Tip:使用JDBC

2、處理大文本對于MySQL中的Text類型,可調(diào)用如下方法設(shè)置:String path = classLoader();File f = new File(path);PreparedStatement.setCharacterStream(index, reader, length);/注意length長度須設(shè)置,并且設(shè)置為int型,利用File獲取對MySQL中的Text類型,可調(diào)用如下方法獲取:reader = resultSet. getCharacterStream(i);reader = resultSet.getClob(i).getCharacterStream();string

3、 s = resultSet.getString(i);北京傳智播客教育 Tip:使用JDBC處理二進制數(shù)據(jù)對于MySQL中的BLOB類型,可調(diào)用如下方法設(shè)置:PreparedStatement. setBinaryStream(i, inputStream, length);對MySQL中的BLOB類型,可調(diào)用如下方法獲?。篒nputStream in = resultSet.getBinaryStream(i);InputStream in = resultSet.getBlob(i).getBinaryStream(); 北京傳智播客教育 Tip:使用JDBC進行批處理業(yè)務(wù)場景:當需要向

4、數(shù)據(jù)庫發(fā)送一批SQL語句執(zhí)行時,應(yīng)避免向數(shù)據(jù)庫一條條的發(fā)送執(zhí)行,而應(yīng)采用JDBC的批處理機制,以提升執(zhí)行效率。實現(xiàn)批處理有兩種方式,第一種方式:Statement.addBatch(sql) list執(zhí)行批處理SQL語句executeBatch()方法:執(zhí)行批處理命令clearBatch()方法:清除批處理命令北京傳智播客教育 Tip:使用JDBC進行批處理Connection conn = null;Statement st = null;ResultSet rs = null;try conn = JdbcUtil.getConnection();String sql1 = insert

5、into user(name,password,email,birthday) values(kkk,123, ,1978-08-08);String sql2 = update user set password=123456 where id=3;st = conn.createStatement();st.addBatch(sql1); /把SQL語句加入到批命令中st.addBatch(sql2); /把SQL語句加入到批命令中st.executeBatch(); finallyJdbcUtil.free(conn, st, rs);北京傳智播客教育 Tip:使用JDBC進行批處理采用

6、Statement.addBatch(sql)方式實現(xiàn)批處理:優(yōu)點:可以向數(shù)據(jù)庫發(fā)送多條不同的語句。缺點:SQL語句沒有預(yù)編譯。當向數(shù)據(jù)庫發(fā)送多條語句相同,但僅參數(shù)不同的SQL語句時,需重復(fù)寫上很多條SQL語句。例如:Insert into user(name,password) values(aa,111);Insert into user(name,password) values(bb,222);Insert into user(name,password) values(cc,333);Insert into user(name,password) values(dd,444);北京傳

7、智播客教育 Tip:使用JDBC進行批處理實現(xiàn)批處理的第二種方式:PreparedStatement.addBatch()北京傳智播客教育 Tip:使用JDBC進行批處理conn = JdbcUtil.getConnection();String sql = insert into user(name,password,email,birthday) values(?,?,?,?);st = conn.prepareStatement(sql);for(int i=0;i50000;i+)st.setString(1, aaa + i);st.setString(2, 123 + i);st.

8、setString(3, aaa + i + );st.setDate(4,new Date(1980, 10, 10);st.addBatch();if(i%1000=0)st.executeBatch();st.clearBatch();st.executeBatch();北京傳智播客教育 Tip:使用JDBC進行批處理采用PreparedStatement.addBatch()實現(xiàn)批處理優(yōu)點:發(fā)送的是預(yù)編譯后的SQL語句,執(zhí)行效率高。缺點:只能應(yīng)用在SQL語句相同,但參數(shù)不同的批處理中。因此此種形式的批處理經(jīng)常用于在同一個表中批量插入數(shù)據(jù),或批量更新表的數(shù)據(jù)。北京傳智播客教育 Tip:獲

9、得數(shù)據(jù)庫自動生成的主鍵示例:Connection conn = JdbcUtil.getConnection();String sql = insert into user(name,password,email,birthday) values(abc,123, ,1978-08-08);PreparedStatement st = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS );st.executeUpdate();ResultSet rs = st.getGeneratedKeys(); /得到插入行的主鍵if(rs

10、.next()System.out.println(rs.getObject(1);注:此參數(shù)僅對insert操作有效。北京傳智播客教育 Tip:JDBC調(diào)用存儲過程編寫存儲過程(參看mysql文檔)得到CallableStatement,并調(diào)用存儲過程:CallableStatement cStmt = conn.prepareCall(call demoSp(?, ?);設(shè)置參數(shù),注冊返回值,得到輸出cStmt.registerOutParameter(2, Types.VARCHAR);cStmt.setString(1, abcdefg);cStmt.execute();System.

11、out.println(cStmt.getString(2);北京傳智播客教育 Tip:事務(wù)事務(wù)的概念事務(wù)指邏輯上的一組操作,組成這組操作的各個單元,要不全部成功,要不全部不成功。例如:AB轉(zhuǎn)帳,對應(yīng)于如下兩條sql語句 update from account set money=money+100 where name=b; update from account set money=money-100 where name=a;數(shù)據(jù)庫開啟事務(wù)命令start transaction 開啟事務(wù)Rollback 回滾事務(wù)Commit 提交事務(wù)Start mit北京傳智播客教育 Tip:使用事務(wù)當

12、Jdbc程序向數(shù)據(jù)庫獲得一個Connection對象時,默認情況下這個Connection對象會自動向數(shù)據(jù)庫提交在它上面發(fā)送的SQL語句。若想關(guān)閉這種默認提交方式,讓多條SQL在一個事務(wù)中執(zhí)行,可使用下列語句:JDBC控制事務(wù)語句 mit(false); start transactionConnection.rollback(); rollback mit(); commit北京傳智播客教育 Tip:演示銀行轉(zhuǎn)帳案例在JDBC代碼中使如下轉(zhuǎn)帳操作在同一事務(wù)中執(zhí)行。 update from account set money=money-100 where name=a; update fro

13、m account set money=money+100 where name=b;設(shè)置事務(wù)回滾點Savepoint sp = conn.setSavepoint();Conn.rollback(sp); mit(); /回滾后必須要提交北京傳智播客教育 Tip:事務(wù)的特性(ACID)原子性(Atomicity)原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。一致性(Consistency)事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。隔離性(Isolation)事務(wù)的隔離性是多個用戶并發(fā)訪問數(shù)據(jù)庫時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操

14、作數(shù)據(jù)所干擾,多個并發(fā)事務(wù)之間要相互隔離。持久性(Durability)持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。北京傳智播客教育 Tip:事務(wù)的隔離級別多個線程開啟各自事務(wù)操作數(shù)據(jù)庫中數(shù)據(jù)時,數(shù)據(jù)庫系統(tǒng)要負責隔離操作,以保證各個線程在獲取數(shù)據(jù)時的準確性。如果不考慮隔離性,可能會引發(fā)如下問題:北京傳智播客教育 Tip:事務(wù)的隔離性臟讀:指一個事務(wù)讀取了另外一個事務(wù)未提交的數(shù)據(jù)。這是非常危險的,假設(shè)向轉(zhuǎn)帳元,對應(yīng)sql語句如下所示1.update account set money=money+100 while name=

15、b;2.update account set money=money-100 while name=a;當?shù)?條sql執(zhí)行完,第2條還沒執(zhí)行(A未提交時),如果此時查詢自己的帳戶,就會發(fā)現(xiàn)自己多了100元錢。如果A等B走后再回滾,B就會損失100元。北京傳智播客教育 Tip:事務(wù)的隔離性不可重復(fù)讀:在一個事務(wù)內(nèi)讀取表中的某一行數(shù)據(jù),多次讀取結(jié)果不同。例如銀行想查詢A帳戶余額,第一次查詢A帳戶為200元,此時A向帳戶內(nèi)存了100元并提交了,銀行接著又進行了一次查詢,此時A帳戶為300元了。銀行兩次查詢不一致,可能就會很困惑,不知道哪次查詢是準的。和臟讀的區(qū)別是,臟讀是讀取前一事務(wù)未提交的臟數(shù)據(jù),

16、不可重復(fù)讀是重新讀取了前一事務(wù)已提交的數(shù)據(jù)。很多人認為這種情況就對了,無須困惑,當然是后面的為準。我們可以考慮這樣一種情況,比如銀行程序需要將查詢結(jié)果分別輸出到電腦屏幕和寫到文件中,結(jié)果在一個事務(wù)中針對輸出的目的地,進行的兩次查詢不一致,導(dǎo)致文件和屏幕中的結(jié)果不一致,銀行工作人員就不知道以哪個為準了。北京傳智播客教育 Tip:事務(wù)的隔離性虛讀(幻讀)是指在一個事務(wù)內(nèi)讀取到了別的事務(wù)插入的數(shù)據(jù),導(dǎo)致前后讀取不一致。如丙存款100元未提交,這時銀行做報表統(tǒng)計account表中所有用戶的總額為500元,然后丙提交了,這時銀行再統(tǒng)計發(fā)現(xiàn)帳戶為600元了,造成虛讀同樣會使銀行不知所措,到底以哪個為準。北京傳智播客教育 Tip:事務(wù)隔離性的設(shè)置語句數(shù)據(jù)庫共定義了四種隔離級別:Serializable:可避免臟讀、不可重復(fù)讀、虛讀情況的發(fā)生。(串行化)Repeatable read:可避免臟讀、不可重復(fù)讀情況的發(fā)生。(可重復(fù)讀)Read committed:可避免臟讀情況發(fā)生(讀已提交)。Read mitt

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論