




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
北京傳智播客教育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ù)編譯語(yǔ)句對(duì)象SQL注入‘or1=1or’項(xiàng)目實(shí)戰(zhàn)北京傳智播客教育CallableStatement執(zhí)行存儲(chǔ)過(guò)程語(yǔ)句無(wú)參數(shù)存儲(chǔ)過(guò)程執(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ǔ)過(guò)程(參看mysql文檔)得到CallableStatement,并調(diào)用存儲(chǔ)過(guò)程:CallableStatementcStmt=conn.prepareCall("{calldemoSp(?,?)}");設(shè)置參數(shù),注冊(cè)返回值,得到輸出cStmt.registerOutParameter(2,Types.VARCHAR);cStmt.setString(1,"abcdefg");cStmt.execute();System.out.println(cStmt.getString(2));北京傳智播客教育CallableStatement帶參數(shù)存儲(chǔ)過(guò)程執(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ù)場(chǎng)景:當(dāng)需要向數(shù)據(jù)庫(kù)發(fā)送一批SQL語(yǔ)句執(zhí)行時(shí),應(yīng)避免向數(shù)據(jù)庫(kù)一條條的發(fā)送執(zhí)行,而應(yīng)采用JDBC的批處理機(jī)制,以提升執(zhí)行效率。實(shí)現(xiàn)批處理有兩種方式,第一種方式:Statement.addBatch(sql)list執(zhí)行批處理SQL語(yǔ)句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語(yǔ)句加入到批命令中st.addBatch(sql2);//把SQL語(yǔ)句加入到批命令中st.executeBatch();}finally{ JdbcUtil.free(conn,st,rs);}北京傳智播客教育Tip:使用JDBC進(jìn)行批處理采用Statement.addBatch(sql)方式實(shí)現(xiàn)批處理:優(yōu)點(diǎn):可以向數(shù)據(jù)庫(kù)發(fā)送多條不同的SQL語(yǔ)句。缺點(diǎn):SQL語(yǔ)句沒(méi)有預(yù)編譯。當(dāng)向數(shù)據(jù)庫(kù)發(fā)送多條語(yǔ)句相同,但僅參數(shù)不同的SQL語(yǔ)句時(shí),需重復(fù)寫上很多條SQL語(yǔ)句。例如:
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語(yǔ)句,執(zhí)行效率高。缺點(diǎn):只能應(yīng)用在SQL語(yǔ)句相同,但參數(shù)不同的批處理中。因此此種形式的批處理經(jīng)常用于在同一個(gè)表中批量插入數(shù)據(jù),或批量更新表的數(shù)據(jù)。北京傳智播客教育Tip:使用JDBC處理大數(shù)據(jù)在實(shí)際開發(fā)中,程序需要把大文本或二進(jìn)制數(shù)據(jù)保存到數(shù)據(jù)庫(kù)?;靖拍睿捍髷?shù)據(jù)也稱之為L(zhǎng)OB(LargeObjects),LOB又分為:clob和blobclob用于存儲(chǔ)大文本。blob用于存儲(chǔ)二進(jìn)制數(shù)據(jù),例如圖像、聲音、二進(jìn)制文等。對(duì)MySQL而言只有blob,而沒(méi)有clob,mysql存儲(chǔ)大文本采用的是Text,Text和blob分別又分為:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXTTINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB北京傳智播客教育大數(shù)據(jù)類型北京傳智播客教育Tip:使用JDBC處理大文本對(duì)于MySQL中的Text類型,可調(diào)用如下方法設(shè)置:PreparedStatement.setCharacterStream(index,reader,length);//注意length長(zhǎng)度須設(shè)置,并且設(shè)置為int型對(duì)于MySQL中的Text類型,可調(diào)用如下方法獲?。簉eader=resultSet.getCharacterStream(i);reader=resultSet.getClob(i).getCharacterStream();strings=resultSet.getString(i);北京傳智播客教育Tip:使用JDBC處理二進(jìn)制數(shù)據(jù)對(duì)于MySQL中的BLOB類型,可調(diào)用如下方法設(shè)置:PreparedStatement.setBinaryStream(i,inputStream,length);對(duì)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ù)庫(kù)內(nèi)部表的一部分。因而在操作Oracle的Blob之前,必須獲得指針(定位器)才能進(jìn)行Blob數(shù)據(jù)的讀取和寫入。如何獲得表中的Blob指針呢?可以先使用insert語(yǔ)句向表中插入一個(gè)空的blob(調(diào)用oracle的函數(shù)empty_blob()
),這將創(chuàng)建一個(gè)blob的指針,然后再把這個(gè)empty的blob的指針查詢出來(lái),這樣就可得到BLOB對(duì)象,從而讀寫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ù)庫(kù)讀寫數(shù)據(jù)注意:以上操作需開啟事務(wù)。北京傳智播客教育Tip:獲得數(shù)據(jù)庫(kù)自動(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ù)僅對(duì)insert操作有效。北京傳智播客教育分頁(yè)技術(shù)分頁(yè)技術(shù)分頁(yè)原理分頁(yè)實(shí)現(xiàn)北京傳智播客教育多層分頁(yè)原理北京傳智播客教育Tip:事務(wù)事務(wù)的概念事務(wù)指邏輯上的一組操作,組成這組操作的各個(gè)單元,要不全部成功,要不全部不成功。例如:A——B轉(zhuǎn)帳,對(duì)應(yīng)于如下兩條sql語(yǔ)句
updatefromaccountsetmoney=money+100wherename=‘b’;updatefromaccountsetmoney=money-100wherename=‘a(chǎn)’;數(shù)據(jù)庫(kù)開啟事務(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ù)庫(kù)獲得一個(gè)Connection對(duì)象時(shí),默認(rèn)情況下這個(gè)Connection對(duì)象會(huì)自動(dòng)向數(shù)據(jù)庫(kù)提交在它上面發(fā)送的SQL語(yǔ)句。若想關(guān)閉這種默認(rèn)提交方式,讓多條SQL在一個(gè)事務(wù)中執(zhí)行,可使用下列語(yǔ)句:JDBC控制事務(wù)語(yǔ)句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ù)庫(kù)從一個(gè)一致性狀態(tài)變換到另外一個(gè)一致性狀態(tài)。隔離性(Isolation)
事務(wù)的隔離性是多個(gè)用戶并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)為每一個(gè)用戶開啟的事務(wù),不能被其他事務(wù)的操作數(shù)據(jù)所干擾,多個(gè)并發(fā)事務(wù)之間要相互隔離。持久性(Durability)
持久性是指一個(gè)事務(wù)一旦被提交,它對(duì)數(shù)據(jù)庫(kù)中數(shù)據(jù)的改變就是永久性的,接下來(lái)即使數(shù)據(jù)庫(kù)發(fā)生故障也不應(yīng)該對(duì)其有任何影響。北京傳智播客教育Tip:事務(wù)的隔離級(jí)別多個(gè)線程開啟各自事務(wù)操作數(shù)據(jù)庫(kù)中數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)系統(tǒng)要負(fù)責(zé)隔離操作,以保證各個(gè)線程在獲取數(shù)據(jù)時(shí)的準(zhǔn)確性。如果不考慮隔離性,可能會(huì)引發(fā)如下問(wèn)題:北京傳智播客教育Tip:事務(wù)的隔離性臟讀:指一個(gè)事務(wù)讀取了另外一個(gè)事務(wù)未提交的數(shù)據(jù)。 這是非常危險(xiǎn)的,假設(shè)A向B轉(zhuǎn)帳100元,對(duì)應(yīng)sql語(yǔ)句如下所示
1.updateaccountsetmoney=money-100whilename=‘a(chǎn)’; 2.updateaccountsetmoney=money+100whilename=‘b’;
當(dāng)?shù)?條sql執(zhí)行完,第2條還沒(méi)執(zhí)行(A未提交時(shí)),如果此時(shí)B查詢自己的帳戶,就會(huì)發(fā)現(xiàn)自己多了100元錢。如果A
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年食品質(zhì)檢員考試復(fù)習(xí)的重點(diǎn)內(nèi)容及答案
- 湖南省雅禮中學(xué)2025屆高三3月綜合自主測(cè)試數(shù)學(xué)試題及答案
- 電信電纜施工合同范本
- 婦科護(hù)理技術(shù)模擬練習(xí)題及參考答案
- 食品營(yíng)養(yǎng)與健康飲食
- 供水配套合同標(biāo)準(zhǔn)文本
- 產(chǎn)品研發(fā)服務(wù)合同樣本
- 《經(jīng)濟(jì)法基礎(chǔ)》模考卷(二)-附答案
- 公路做工合同樣本
- daycare合同標(biāo)準(zhǔn)文本
- JTG∕T F30-2014 公路水泥混凝土路面施工技術(shù)細(xì)則
- 加油站安全巡檢檢查
- 植物生理學(xué)課件(王小菁-第8版)-第五章-植物同化物的運(yùn)輸
- 《國(guó)家綜合性消防救援隊(duì)伍處分條令(試行)》知識(shí)考試題庫(kù)(含答案)
- 吉林油田公司管理手冊(cè)
- 個(gè)人簡(jiǎn)歷電子版表格下載
- 甲狀腺炎-橋本氏甲狀腺炎
- 癥瘕的中醫(yī)療法課件
- 私募基金管理人登記備案資料表(批注版)
- 確診甲狀腺癌的病例報(bào)告
- 大學(xué)食堂檔口管理制度
評(píng)論
0/150
提交評(píng)論