Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(二)_第1頁
Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(二)_第2頁
Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(二)_第3頁
Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(二)_第4頁
Java Web程序開發(fā)與分析課件:數(shù)據(jù)庫訪問(二)_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論