入門增強(qiáng)dayjdbc加強(qiáng)_第1頁
入門增強(qiáng)dayjdbc加強(qiáng)_第2頁
入門增強(qiáng)dayjdbc加強(qiáng)_第3頁
入門增強(qiáng)dayjdbc加強(qiáng)_第4頁
入門增強(qiáng)dayjdbc加強(qiáng)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

北京傳智播客教育JDBC開發(fā)袁杰北京傳智播客教育獲取元信息DatabaseMetaData DatabaseMetaDatameta=con.getMetaData();getDatabaseProductName()、getDatabaseMajorVersion()、

getDatabaseProductVersion()、getDriverName()、getURL()、getUserName()ResultSetMetaData ResultSetset=meta.getTables(null,null,null,newString[]{"table"});ResultSetMetaDataset_meta=set.getMetaData();//獲取結(jié)果集的元信息

System.out.println("獲取表的列數(shù):"+set_meta.getColumnCount()); for(inti=1;i<=set_meta.getColumnCount();i++){ System.out.println(set_meta.getColumnName(i)); }while(set.next()){ for(inti=1;i<=set_meta.getColumnCount();i++){ System.out.print(set.getString(i)+"\t");} System.out.println(); }北京傳智播客教育獲取元信息Stringsql="select*fromusers"; set=con.createStatement().executeQuery(sql); set_meta=set.getMetaData(); for(inti=1;i<=set_meta.getColumnCount();i++){ System.out.println(set_meta.getColumnName(i)+","+set_meta.getColumnClassName(i)+","+ ""+set_meta.getColumnTypeName(i)); }北京傳智播客教育PreparedStatement預(yù)編譯語句對象SQL注入‘or1=1or’項(xiàng)目實(shí)戰(zhàn)北京傳智播客教育CallableStatement執(zhí)行存儲(chǔ)過程語句無參數(shù)存儲(chǔ)過程執(zhí)行delimiter// createprocedureregist() begin declarepswvarchar(60); setpsw=password('wxw666'); insertintousers(name,password)values('王炫文',psw);end//publicstaticvoidcall1()throwsException{ Connectioncon=getConnection(); CallableStatementstate=con.prepareCall("callregist()"); state.execute(); con.close(); }北京傳智播客教育CallableStatement編寫存儲(chǔ)過程(參看mysql文檔)得到CallableStatement,并調(diào)用存儲(chǔ)過程:CallableStatementcStmt=conn.prepareCall("{calldemoSp(?,?)}");設(shè)置參數(shù),注冊返回值,得到輸出cStmt.registerOutParameter(2,Types.VARCHAR);cStmt.setString(1,"abcdefg");cStmt.execute();System.out.println(cStmt.getString(2));北京傳智播客教育CallableStatement帶參數(shù)存儲(chǔ)過程執(zhí)行delimiter// createprocedurelogin(inin_namevarchar(20),inin_passwordvarchar(20),outout_tagint) begin ifexists(select*fromuserswherename=in_nameandpassword=in_password)then setout_tag=1; else setout_tag=0; endif; end//CallableStatementstate=con.prepareCall("calllogin(?,?,?)");

state.registerOutParameter(3,Types.INTEGER); state.setString(1,name); state.setString(2,password); state.execute(); intrel=state.getInt(3);北京傳智播客教育Tip:使用JDBC進(jìn)行批處理業(yè)務(wù)場景:當(dāng)需要向數(shù)據(jù)庫發(fā)送一批SQL語句執(zhí)行時(shí),應(yīng)避免向數(shù)據(jù)庫一條條的發(fā)送執(zhí)行,而應(yīng)采用JDBC的批處理機(jī)制,以提升執(zhí)行效率。實(shí)現(xiàn)批處理有兩種方式,第一種方式:Statement.addBatch(sql)list執(zhí)行批處理SQL語句executeBatch()方法:執(zhí)行批處理命令clearBatch()方法:清除批處理命令北京傳智播客教育Tip:使用JDBC進(jìn)行批處理Connectionconn=null;Statementst=null;ResultSetrs=null;try{conn=JdbcUtil.getConnection();Stringsql1="insertintouser(name,password,email,birthday) values('kkk','123','','1978-08-08')";Stringsql2="updateusersetpassword='123456'whereid=3";st=conn.createStatement();st.addBatch(sql1);//把SQL語句加入到批命令中st.addBatch(sql2);//把SQL語句加入到批命令中st.executeBatch();}finally{ JdbcUtil.free(conn,st,rs);}北京傳智播客教育Tip:使用JDBC進(jìn)行批處理采用Statement.addBatch(sql)方式實(shí)現(xiàn)批處理:優(yōu)點(diǎn):可以向數(shù)據(jù)庫發(fā)送多條不同的SQL語句。缺點(diǎn):SQL語句沒有預(yù)編譯。當(dāng)向數(shù)據(jù)庫發(fā)送多條語句相同,但僅參數(shù)不同的SQL語句時(shí),需重復(fù)寫上很多條SQL語句。例如:

Insertintouser(name,password)values(‘a(chǎn)a’,’111’); Insertintouser(name,password)values(‘bb’,’222’); Insertintouser(name,password)values(‘cc’,’333’); Insertintouser(name,password)values(‘dd’,’444’);北京傳智播客教育Tip:使用JDBC進(jìn)行批處理實(shí)現(xiàn)批處理的第二種方式:PreparedStatement.addBatch()北京傳智播客教育Tip:使用JDBC進(jìn)行批處理conn=JdbcUtil.getConnection();Stringsql="insertintouser(name,password,email,birthday)values(?,?,?,?)";st=conn.prepareStatement(sql);for(inti=0;i<50000;i++){st.setString(1,"aaa"+i);st.setString(2,"123"+i);st.setString(3,"aaa"+i+"");st.setDate(4,newDate(1980,10,10));st.addBatch();if(i%1000==0){st.executeBatch();st.clearBatch();}}st.executeBatch();北京傳智播客教育Tip:使用JDBC進(jìn)行批處理采用PreparedStatement.addBatch()實(shí)現(xiàn)批處理優(yōu)點(diǎn):發(fā)送的是預(yù)編譯后的SQL語句,執(zhí)行效率高。缺點(diǎn):只能應(yīng)用在SQL語句相同,但參數(shù)不同的批處理中。因此此種形式的批處理經(jīng)常用于在同一個(gè)表中批量插入數(shù)據(jù),或批量更新表的數(shù)據(jù)。北京傳智播客教育Tip:使用JDBC處理大數(shù)據(jù)在實(shí)際開發(fā)中,程序需要把大文本或二進(jìn)制數(shù)據(jù)保存到數(shù)據(jù)庫?;靖拍睿捍髷?shù)據(jù)也稱之為LOB(LargeObjects),LOB又分為:clob和blobclob用于存儲(chǔ)大文本。blob用于存儲(chǔ)二進(jìn)制數(shù)據(jù),例如圖像、聲音、二進(jìn)制文等。對MySQL而言只有blob,而沒有clob,mysql存儲(chǔ)大文本采用的是Text,Text和blob分別又分為:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXTTINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB北京傳智播客教育大數(shù)據(jù)類型北京傳智播客教育Tip:使用JDBC處理大文本對于MySQL中的Text類型,可調(diào)用如下方法設(shè)置:PreparedStatement.setCharacterStream(index,reader,length);//注意length長度須設(shè)置,并且設(shè)置為int型對于MySQL中的Text類型,可調(diào)用如下方法獲?。簉eader=resultSet.getCharacterStream(i);reader=resultSet.getClob(i).getCharacterStream();strings=resultSet.getString(i);北京傳智播客教育Tip:使用JDBC處理二進(jìn)制數(shù)據(jù)對于MySQL中的BLOB類型,可調(diào)用如下方法設(shè)置:PreparedStatement.setBinaryStream(i,inputStream,length);對MySQL中的BLOB類型,可調(diào)用如下方法獲?。篒nputStreamin=resultSet.getBinaryStream(i);InputStreamin=resultSet.getBlob(i).getBinaryStream();北京傳智播客教育Tip:Oracle中大數(shù)據(jù)處理Oracle定義了一個(gè)BLOB字段用于保存二進(jìn)制數(shù)據(jù),但這個(gè)字段并不能存放真正的二進(jìn)制數(shù)據(jù),只能向這個(gè)字段存一個(gè)指針,然后把數(shù)據(jù)放到指針?biāo)赶虻腛racle的LOB段中,LOB段是在數(shù)據(jù)庫內(nèi)部表的一部分。因而在操作Oracle的Blob之前,必須獲得指針(定位器)才能進(jìn)行Blob數(shù)據(jù)的讀取和寫入。如何獲得表中的Blob指針呢?可以先使用insert語句向表中插入一個(gè)空的blob(調(diào)用oracle的函數(shù)empty_blob()

),這將創(chuàng)建一個(gè)blob的指針,然后再把這個(gè)empty的blob的指針查詢出來,這樣就可得到BLOB對象,從而讀寫blob數(shù)據(jù)了。北京傳智播客教育Tip:Oracle中LOB類型的處理1、插入空blob

insertintotest(id,image)values(?,empty_blob());2、獲得blob的cursor

selectimagefromtestwhereid=?forupdate;

Blobb=rs.getBlob(“image”);注意:須加forupdate,鎖定該行,直至該行被修改完畢,保證不產(chǎn)生并發(fā)沖突。3、利用io,和獲取到的cursor往數(shù)據(jù)庫讀寫數(shù)據(jù)注意:以上操作需開啟事務(wù)。北京傳智播客教育Tip:獲得數(shù)據(jù)庫自動(dòng)生成的主鍵示例:Connectionconn=JdbcUtil.getConnection();Stringsql="insertintouser(name,password,email,birthday) values('abc','123','','1978-08-08')";PreparedStatementst=conn. prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);st.executeUpdate();ResultSetrs=st.getGeneratedKeys();//得到插入行的主鍵if(rs.next()) System.out.println(rs.getObject(1));注:此參數(shù)僅對insert操作有效。北京傳智播客教育分頁技術(shù)分頁技術(shù)分頁原理分頁實(shí)現(xiàn)北京傳智播客教育多層分頁原理北京傳智播客教育Tip:事務(wù)事務(wù)的概念事務(wù)指邏輯上的一組操作,組成這組操作的各個(gè)單元,要不全部成功,要不全部不成功。例如:A——B轉(zhuǎn)帳,對應(yīng)于如下兩條sql語句

updatefromaccountsetmoney=money+100wherename=‘b’;updatefromaccountsetmoney=money-100wherename=‘a(chǎn)’;數(shù)據(jù)庫開啟事務(wù)命令starttransaction開啟事務(wù)rollback回滾事務(wù)commit提交事務(wù)starttransaction….….commit北京傳智播客教育Tip:事務(wù)

命令行模擬合法的事務(wù)(轉(zhuǎn)賬)

命令行模擬轉(zhuǎn)賬中發(fā)生異常并回滾命令行模擬多次轉(zhuǎn)賬,使用保存點(diǎn)回滾starttransaction;

updateaccountssetmoney=money-100wherename='jack';updateaccountssetmoney=money+100wherename='lucy';commit;starttransaction;updateaccountssetmoney=money-100wherename='jack';select*fromaccounts;rollback;starttransaction;updateaccountssetmoney=money-100wherename='jack';updateaccountssetmoney=money+100wherename='lucy';select*fromaccounts;savepointsp;updateaccountssetmoney=money-100wherename='lucy';rollbacktosp;

北京傳智播客教育Tip:使用事務(wù)當(dāng)Jdbc程序向數(shù)據(jù)庫獲得一個(gè)Connection對象時(shí),默認(rèn)情況下這個(gè)Connection對象會(huì)自動(dòng)向數(shù)據(jù)庫提交在它上面發(fā)送的SQL語句。若想關(guān)閉這種默認(rèn)提交方式,讓多條SQL在一個(gè)事務(wù)中執(zhí)行,可使用下列語句:JDBC控制事務(wù)語句mit(false);starttransactionConnection.rollback();rollbackmit();commit北京傳智播客教育Tip:演示銀行轉(zhuǎn)帳案例在JDBC代碼中使如下轉(zhuǎn)帳操作在同一事務(wù)中執(zhí)行。updatefromaccountsetmoney=money-100wherename=‘a(chǎn)’;updatefromaccountsetmoney=money+100wherename=‘b’;設(shè)置事務(wù)回滾點(diǎn)Savepointsp=conn.setSavepoint();Conn.rollback(sp);mit();//回滾后必須要提交北京傳智播客教育Tip:事務(wù)的特性(ACID)原子性(Atomicity)

原子性是指事務(wù)是一個(gè)不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。

一致性(Consistency)

事務(wù)必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變換到另外一個(gè)一致性狀態(tài)。隔離性(Isolation)

事務(wù)的隔離性是多個(gè)用戶并發(fā)訪問數(shù)據(jù)庫時(shí),數(shù)據(jù)庫為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作數(shù)據(jù)所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。持久性(Durability)

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

1.updateaccountsetmoney=money-100whilename=‘a(chǎn)’; 2.updateaccountsetmoney=money+100whilename=‘b’;

當(dāng)?shù)?條sql執(zhí)行完,第2條還沒執(zhí)行(A未提交時(shí)),如果此時(shí)B查詢自己的帳戶,就會(huì)發(fā)現(xiàn)自己多了100元錢。如果A

溫馨提示

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

評論

0/150

提交評論