




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
JavaWeb程序設(shè)計
——數(shù)據(jù)庫訪問(2)2主要內(nèi)容JDBC操作數(shù)據(jù)庫
Statement接口執(zhí)行SQL語句
PreparedStatement接口
ResultSet結(jié)果集3使用Statement執(zhí)行SQL語句java.sql包下有兩個非常重要的接口:
Statement:定義了運(yùn)行SQL指令所需的方法,在使用Statement的方法之前,需要取得其對象,Statement類型的對象是通過Connection接口的方法creatStatement()產(chǎn)生的;
ResultSet:如果運(yùn)行的SQL是Select類型的指令,ResultSet將封裝運(yùn)行后返回的數(shù)據(jù)內(nèi)容;4返回結(jié)果集Statement與ResultSet之間的運(yùn)行過程Statement對象Connection對象ResultSet對象數(shù)據(jù)庫數(shù)據(jù)庫連接傳送SQL指令5Statement主要提供運(yùn)行SQL指令的方法,主要包括:executeQuery(Stringsql):用于運(yùn)行SQL查詢語句,如:Select語句;executeUpdate(Stringsql):運(yùn)行SQL更改指令,如:insert,delete,update;
execute(Stringsql):用于執(zhí)行返回結(jié)果集、更新計數(shù)的SQL語句;executeBatch():運(yùn)行SQL批處理指令;close():結(jié)束對象,釋放資源;6
該方法用于執(zhí)行產(chǎn)生單個結(jié)果集的查詢SQL語句,如:Select語句,該方法在Statement接口中的定義為:
ResultSetexecuteQuery(Stringsql)throwsSQLException
例:通過使用executeQuery()方法對某數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行訪問,將數(shù)據(jù)用表格方式顯示;(1)executeQuery()方法7<body><%Stringurl=“jdbc:sqlserver://localhost:1433/Data"; StringuserName="sa"; Stringpassword=""; Stringsql=null; Connectionconn=null; Statementstmt=null; try{ Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); }catch(ClassNotFoundExceptione){ ut.println("加載驅(qū)動器類時出現(xiàn)異常"); }
加載數(shù)據(jù)庫驅(qū)動程序8在Eclipse開發(fā)環(huán)境中加載數(shù)據(jù)庫驅(qū)動(1)打開Reference窗口9(2)在當(dāng)前運(yùn)行的JRE中加載數(shù)據(jù)庫驅(qū)動10(3)打開所使用Web工程的Property窗口,選擇JavaBuildPath,在libraries中加載數(shù)據(jù)庫驅(qū)動;11try{
conn=DriverManager.getConnection(url,userName,password);
//創(chuàng)建Statement語句
stmt=conn.createStatement();
sql=“SELECT*FROMstudent”;
//使用executeQuery執(zhí)行SQL查詢語句
ResultSetrs=stmt.executeQuery(sql);
%>
連接數(shù)據(jù)庫生成Statement對象12<tablewidth=“740”border=“1”cellspacing=“0”cellpadding=“6”>
<tr>
<tdwidth=“120”align=“center”valign=“middle”>編號</td>
<tdwidth="145"align="center">姓名</td>
<tdwidth="253"align="center">地址</td>
<tdwidth="148"align="center">出生日期</td>
</tr>
13<%
//顯示返回的結(jié)果集
while(rs.next()){
intid=rs.getInt(1);
Stringname=rs.getString(2);
Stringaddress=rs.getString(3);
Stringbirthday=rs.getString(4); %>
<tr>
<tdheight=“40”align=“center”valign=“middle”><%=id%></td>
<tdalign=“center”valign=“middle”><%=name%></td>
<tdvalign=“middle”><%=address%></td>
<tdalign=“center”valign=“middle”><%=birthday%></td>
</tr>
<%}------while循環(huán)結(jié)束14
rs.close();
stmt.close();
}catch(SQLExceptione){
out.println("出現(xiàn)SQLException異常");
}finally{
//關(guān)閉語句和數(shù)據(jù)庫連接
try{
if(conn!=null)conn.close();
}catch(SQLExceptione){
out.println("關(guān)閉數(shù)據(jù)庫連接時出現(xiàn)異常");
}}
%></body>釋放Statement和ResultSet對象15(2)executeUpdate()方法executeUpdate()方法執(zhí)行SQL中的更改語句,如:insert,update,delete語句;CREATETable,DROPTable語句。其在Statement接口中的定義為:
intexecuteUpdate(Stringsql)throwsSQLException
對于insert等更改語句,其返回值為受影響的行數(shù);對于CreateTable等語句,其返回值為0。16例:使用executeUpdate()方法更新數(shù)據(jù)庫中的數(shù)據(jù)。
<body>
<%
----加載SQLServer數(shù)據(jù)庫驅(qū)動程序;
Class.forName();
----與數(shù)據(jù)庫建立連接;
DriveManager.getConnection();17try{ //創(chuàng)建Statement語句
stmt=conn.createStatement();
sql="DELETEFROMstudentWHEREstu_id=10";
//使用executeUpdate執(zhí)行更新語句
intaffectedRowCount=stmt.executeUpdate(sql); out.println("刪除操作影響的數(shù)據(jù)行數(shù)為:"+affectedRowCount+"<br>");
//使用executeUpdate執(zhí)行更新語句
sql="INSERTINTOstudent(name,address,birthday)"+ "VALUES('小王','北京','1980-05-10')"; affectedRowCount=stmt.executeUpdate(sql); out.println("插入操作影響的數(shù)據(jù)行數(shù)為:"+affectedRowCount+"<br>");創(chuàng)建Statement對象執(zhí)行Insert更新語句18sql="updatestudentsetaddress='shanghai'wherestu_id=11";
affectedRowCount=stmt.executeUpdate(sql);
out.println("修改操作影響的數(shù)據(jù)行數(shù)為:"+affectedRowCount+"<br>");
stmt.close();
}catch(SQLExceptione){
out.println("出現(xiàn)SQLException異常");
}執(zhí)行Update更新語句19finally{
//關(guān)閉語句和數(shù)據(jù)庫連接
try{
if(conn!=null)conn.close();
}catch(SQLExceptione){
out.println("關(guān)閉數(shù)據(jù)庫連接時出現(xiàn)異常");
}
}
%></body>20(3)execute()方法execute()方法應(yīng)用于執(zhí)行作為參數(shù)傳遞的SQL語句,返回:①ResultSet對象;②更新計數(shù)(受影響的行數(shù));該方法定義如下:
booleanexecute(Stringsql)throwsSQLException
其返回值為true時,執(zhí)行結(jié)果為ResultSet對象,為false時,為更新的行數(shù)。21(3)execute()方法
執(zhí)行SQL查詢語句
Statementstmt=conn.creatStatement();stringstrsql=“select*fromtable1”;booleanisResult=stmt.execute(strsql);if(isResult){
ResultSetrs=stmt.getResultSet();}22(3)execute()方法
執(zhí)行數(shù)據(jù)更新語句
stringstrsql=“DeleteFromtable1whereid=10”;boolisResult=stmt.execute(strsql);if(!isResult){//isResult==false
intcount=stmt.getUpdateCount();}23例:使用execute()方法訪問數(shù)據(jù)庫中的數(shù)據(jù),如果SQL語句正確(SQL語句未知),將返回結(jié)果。
<body>
<%Stringsql=request.getParameter("sqltest");
if(sql==null){%>
<formname="Example"method="post"action="">
<p>sql語句:<inputtype="text"name="sqltest"size="100"maxlength="100"></p>
<p><inputtype="submit"value="傳送"></p>
<%}24else{----加載SQLServer數(shù)據(jù)庫驅(qū)動程序
-----建立與數(shù)據(jù)庫的連接try{ //創(chuàng)建Statement語句
stmt=conn.createStatement();
out.println("執(zhí)行的SQL語句為:"+sql+"<br>");
//使用execute執(zhí)行未知SQL語句
booleanisResultSet=stmt.execute(sql);
25if(isResultSet){
ResultSetrs=stmt.getResultSet(); out.println("返回的執(zhí)行結(jié)果"+count+"為結(jié)果集"+"<br>"); //顯示返回的結(jié)果集
while(rs.next()){ intf1=rs.getInt(1); Stringf2=rs.getString(2); Stringf3=rs.getString(3); out.println(f1+""+f2+""+f3); out.println("<br>"); } rs.close(); }獲取ResultSet對象26else{ intaffectedRowCount=stmt.getUpdateCount(); if(affectedRowCount==-1)break; out.println("更新計數(shù)為:"+affectedRowCount+"<br>"); }
stmt.close();}catch(SQLExceptione){ out.println("出現(xiàn)SQLException異常");}}%></form></body>27(4)executeBatch()方法executeBatch()方法用于成批地執(zhí)行SQL語句,但不能執(zhí)行返回值為ResultSet結(jié)果集的SQL語句,如:Select語句,該方法定義如下:
int[]executeBatch()throwsSQLException
另外還有兩個輔助方法:
addBatch():向批處理中加入SQL語句;
clearBatch():清空批處理中的SQL語句;28----加載SQLServer數(shù)據(jù)庫驅(qū)動程序
-----建立與數(shù)據(jù)庫的連接try{ //創(chuàng)建Statement語句
stmt=conn.createStatement();
stmt.addBatch(“DeleteFromtabel1whereid=09”);stmt.addBatch(“DropTabletable1”); //使用execute執(zhí)行未知SQL語句
int[]Counts=stmt.executeBatch();
29for(inti=0;i<Counts.length;i++){out.println(“更新的語句行數(shù):”+Counts[i]);} stmt.close();}catch(SQLExceptione){ out.println("出現(xiàn)SQLException異常");}}%>30主要內(nèi)容JDBC操作數(shù)據(jù)庫
Statement接口執(zhí)行SQL語句
PreparedStatement接口
ResultSet結(jié)果集31PreparedStatement接口PreparedStatement接口繼承自Statement接口,與Statement接口相比,有兩方面的不同:
PreparedStatement實(shí)例包含預(yù)編譯的SQL語句,使得SQL語句“準(zhǔn)備好”;
PreparedStatement對象包含的SQL語句可具有一個或多個IN參數(shù)。IN參數(shù)的值在SQL語句創(chuàng)建時未被指定,由“?”保留。每個IN參數(shù)的值由適當(dāng)?shù)姆椒▉硖峁?2
作為Statement的子類,PreparedStatement繼承了Statement的所有功能;另外它還添加了一整套方法,用于設(shè)置發(fā)送給數(shù)據(jù)庫以取代IN參數(shù)占位符的值。(1)創(chuàng)建PreparedStatement對象
PreparedStatementps=con.prepareStatement(“UPDATEtestSETa=?Whereb=?”)
其中,con為Connection對象,該SQL語句包含2個IN參數(shù)。33(2)傳遞IN參數(shù):在執(zhí)行PreparedStatement對象之前,必須設(shè)置每個IN參數(shù)的值。可以通過調(diào)用:setXXXX()方法,其中XXX代表該參數(shù)的數(shù)據(jù)類型,如:String、int、long型。例如:
ps.setLong(1,1);ps.setString(2,”name”);
其中,setXXX()方法中的第一個參數(shù)為所設(shè)置參數(shù)的位置,第二個參數(shù)為所設(shè)定的值。34
(3)IN參數(shù)中的數(shù)據(jù)類型的一致性
setXXX()方法中的XXX代表參數(shù)的數(shù)據(jù)類型,這里的數(shù)據(jù)類型是Java類型。但驅(qū)動程序會將Java數(shù)據(jù)類型映射為JDBC類型,然后發(fā)送給數(shù)據(jù)庫:
Java數(shù)據(jù)類型JDBC類型如:ps.setShort(2,4)
short(Java數(shù)據(jù)類型)SMALLINT(JDBC類型)
驅(qū)動程序35Java數(shù)據(jù)類型到JDBC數(shù)據(jù)類型的映射:
Java數(shù)據(jù)類型JDBC數(shù)據(jù)類型
StringVARCHAR,LONGVARCHAR
BooleanBIT
ByteTINYINT
ShortSMALLINT
Int
Long
Float
DoubleDOUBLEREALINTEGERBIGINT36(4)數(shù)據(jù)流發(fā)送IN參數(shù)值在PreparedStatement對象中,可以通過輸入流的方式進(jìn)行參數(shù)數(shù)據(jù)的傳輸,提供了3種將IN參數(shù)設(shè)置為Java輸入流的方法:
setBinaryStream():字節(jié)流
setAsciiStream():含有ASCII字符的流
setUnicodeStream():含有Unicode字符的流其中,這三個方法相比于setXXX()方法,多了一個指定流的總長度的參數(shù)。37例:使用PreparedStatement執(zhí)行SQL語句(預(yù)編譯)。
<body>
<%
----加載SQLServer數(shù)據(jù)庫驅(qū)動程序
-----建立與數(shù)據(jù)庫的連接
38try{ //創(chuàng)建PreparedStatement語句
PreparedStatementpstmtDelete=conn.prepareStatement( "DELETEFROMstudentWHEREstu_id=?");
PreparedStatementpstmtInsert=conn.prepareStatement( "INSERTINTOstudent(name,address,birthday)VALUES(?,?,?)");
PreparedStatementpstmtSelect=conn.prepareStatement( "SELECT*FROMstudentWHEREstu_id>=?"+ "ORDERBYstu_id");pstmtSelect.setInt(1,1);創(chuàng)建執(zhí)行Delete語句的對象創(chuàng)建執(zhí)行Insert語句的對象創(chuàng)建執(zhí)行Select語句的對象39//多次執(zhí)行同一語句
for(inti=1;i<4;i++){
//使用setXXX方法設(shè)置IN參數(shù)
pstmtDelete.setInt(1,i);
pstmtInsert.setString(1,"name"+i);
pstmtInsert.setString(2,"city"+i);
pstmtInsert.setDate(3,newDate(85,12,i));
//執(zhí)行PreparedStatement語句
pstmtDelete.executeUpdate();
pstmtInsert.executeUpdate();
ResultSetrs=pstmtSelect.executeQuery();
設(shè)置參數(shù)值40
// 顯示返回的結(jié)果集
while(rs.next()){ intstuID=rs.getInt(1); Stringname=rs.getString(2); Stringaddress=rs.getString(3); Stringbirthday=rs.getString(4); out.prin
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC 60670-24:2024 EXV EN Boxes and enclosures for electrical accessories for household and similar fixed electrical installations - Part 24: Particular requirements for encl
- 2025-2030年中國鎂錳電池市場規(guī)模分析及發(fā)展建議研究報告
- 2025-2030年中國辣椒制品行業(yè)運(yùn)行動態(tài)與投資戰(zhàn)略研究報告
- 2025-2030年中國蒿甲醚行業(yè)市場現(xiàn)狀調(diào)研與前景規(guī)模預(yù)測報告
- 2025-2030年中國自動高壓蒸汽滅菌器市場發(fā)展?fàn)顩r及前景趨勢分析報告
- 2025-2030年中國育發(fā)水市場發(fā)展?fàn)顩r及投資規(guī)劃研究報告
- 2025安全員-C證考試題庫
- 2025-2030年中國糯玉米汁飲料市場發(fā)展預(yù)測及前景調(diào)研分析報告
- 2025-2030年中國粉針類頭孢制劑行業(yè)需求分析與十三五規(guī)劃研究報告
- 2025-2030年中國移動電源車產(chǎn)業(yè)運(yùn)行動態(tài)及前景趨勢預(yù)測報告
- 2025年云南省昆明國家高新技術(shù)產(chǎn)業(yè)開發(fā)區(qū)招聘合同聘用制專業(yè)技術(shù)人員47人歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 1.1青春的邀約 教學(xué)課件 2024-2025學(xué)年七年級道德與法治下冊(統(tǒng)編版2024)
- 2024年財政部會計法律法規(guī)答題活動題目及答案一
- 2024年01月廣州期貨交易所2024年招考筆試歷年參考題庫附帶答案詳解
- 中小學(xué)教師家訪記錄表內(nèi)容(18張)8
- 《冠心病》課件(完整版)
- 2024年聊城職業(yè)技術(shù)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- 精品資料(2021-2022年收藏)垃圾焚燒發(fā)電廠監(jiān)理規(guī)劃
- 聲屏障工程施工組織設(shè)計方案
- 五年級美術(shù)下冊全冊教材分析
- 第五章:毒物泄漏及擴(kuò)散模型-第四次
評論
0/150
提交評論