版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 數(shù)據(jù)庫的應(yīng)用在日常的生活和工作中可以說是無處不在,無論是一個(gè)小型的企業(yè)辦公自動(dòng)化系統(tǒng),還是像中國移動(dòng)那樣的大型運(yùn)營系統(tǒng),似乎都離不開數(shù)據(jù)庫。對于大多數(shù)應(yīng)用程序來說,不管它們是Windows桌面應(yīng)用程序,還是Web應(yīng)用程序,存儲(chǔ)和檢索數(shù)據(jù)都是其核心功能,所以針對數(shù)據(jù)庫的開發(fā)已經(jīng)成為軟件開發(fā)的一種必備技能。如果說過去是“學(xué)好數(shù)理化,走遍天下都不怕”,那么,對于今天的軟件開發(fā)者而言就是“學(xué)好數(shù)據(jù)庫,走到哪兒都不怵”。本章
2、將向讀者介紹如何在Java Web中進(jìn)行數(shù)據(jù)庫應(yīng)用開發(fā)。</p><p> 通過閱讀本章,您可以:</p><p> 了解JDBC的結(jié)構(gòu)體系</p><p> 掌握J(rèn)DBC連接數(shù)據(jù)庫的過程</p><p> 熟悉JDBC的常用API</p><p> 掌握通過JDBC向數(shù)據(jù)庫中添加數(shù)據(jù)</p>
3、<p> 掌握通過JDBC查詢數(shù)據(jù)</p><p> 掌握通過JDBC修改數(shù)據(jù)庫中的數(shù)據(jù)</p><p> 掌握通過JDBC刪除數(shù)據(jù)庫中的數(shù)據(jù)</p><p> 掌握進(jìn)行批處理的方法</p><p> 掌握J(rèn)DBC在Java Web中的應(yīng)用 </p><p> 10.1 JDBC技術(shù)</p
4、><p> 視頻講解:光盤\TM\lx\10\JDBC技術(shù).exe</p><p> JDBC(Java Data Base Connectivity)是Java程序與數(shù)據(jù)庫系統(tǒng)通信的標(biāo)準(zhǔn)API,它定義在JDK的API中,通過JDBC技術(shù),Java程序可以非常方便地與各種數(shù)據(jù)庫交互,JDBC在Java程序與數(shù)據(jù)庫系統(tǒng)之間架起了一座橋梁。</p><p> 10.1
5、.1 JDBC簡介</p><p> JDBC是Java程序操作數(shù)據(jù)庫的API,也是Java程序與數(shù)據(jù)庫交互的一門技術(shù)。JDBC是Java操作數(shù)據(jù)庫的規(guī)范,由一組用Java語言編寫的類和接口組成,它對數(shù)據(jù)庫的操作提供了基本方法,但對于數(shù)據(jù)庫的細(xì)節(jié)操作由數(shù)據(jù)庫廠商進(jìn)行實(shí)現(xiàn)。使用JDBC操作數(shù)據(jù)庫,需要數(shù)據(jù)庫廠商提供數(shù)據(jù)庫的驅(qū)動(dòng)程序。Java程序與數(shù)據(jù)庫交互的示意圖如圖10.1所示。</p><
6、;p> 通過圖10.1可以看出,JDBC在Java程序與數(shù)據(jù)庫之間起到了一個(gè)橋梁的作用,有了JDBC就可以方便地與各種數(shù)據(jù)庫進(jìn)行交互,不必為某一個(gè)特定的數(shù)據(jù)庫制定專門的訪問程序。例如,訪問MySQL數(shù)據(jù)庫可以使用JDBC進(jìn)行訪問,訪問SQL Server同樣使用JDBC。因此,JDBC對Java程序員而言,是一套標(biāo)準(zhǔn)的操作數(shù)據(jù)庫的API;而對數(shù)據(jù)庫廠商而言,又是一套標(biāo)準(zhǔn)的模型接口。</p><p> 1
7、0.1.2 JDBC連接數(shù)據(jù)庫的過程</p><p> 在了解了JDBC與數(shù)據(jù)庫后,本節(jié)介紹使用JDBC操作數(shù)據(jù)的開發(fā)流程,其關(guān)鍵步驟如下。</p><p><b> 注冊數(shù)據(jù)庫驅(qū)動(dòng)</b></p><p> 連接數(shù)據(jù)庫前,需要將數(shù)據(jù)庫廠商提供的數(shù)據(jù)庫驅(qū)動(dòng)類注冊到JDBC的驅(qū)動(dòng)管理器中。通常情況下,是通過將數(shù)據(jù)庫驅(qū)動(dòng)類加載到JVM來實(shí)現(xiàn)
8、的。</p><p> 【例10.1】 加載數(shù)據(jù)庫驅(qū)動(dòng),注冊到驅(qū)動(dòng)管理器。代碼如下:</p><p> Class.forName("com.mysql.jdbc.Driver");</p><p> 構(gòu)建數(shù)據(jù)庫連接URL</p><p> 要建立數(shù)據(jù)庫連接,就要構(gòu)建數(shù)據(jù)庫連接的URL,這個(gè)URL由數(shù)據(jù)庫廠商制定
9、,不同的數(shù)據(jù)庫,它的URL也有所區(qū)別,但都符合一個(gè)基本的格式,即“JDBC協(xié)議+IP地址或域名+端口+數(shù)據(jù)庫名稱”。如MySQL的數(shù)據(jù)庫連接URL的字符串為“jdbc:mysql://localhost:3306/test”。</p><p> 獲取Connection對象</p><p> 在注冊了數(shù)據(jù)庫驅(qū)動(dòng)及構(gòu)建數(shù)據(jù)庫URL后,就可以通過驅(qū)動(dòng)管理器獲取數(shù)據(jù)庫的連接Connectio
10、n。Connection對象是JDBC封裝的數(shù)據(jù)庫連接對象,只有創(chuàng)建此對象后,才可以對數(shù)據(jù)進(jìn)行相關(guān)操作,它的獲取方法如下:</p><p> DriverManager.getConnection(url,username,password);</p><p> Connection對象的獲取需要用到DriverManager對象,DriverManager的getConnection
11、()方法通過數(shù)據(jù)庫連接URL、數(shù)據(jù)庫用戶名及數(shù)據(jù)庫密碼創(chuàng)建Connection對象。</p><p> 【例10.2】 通過JDBC連接MySQL數(shù)據(jù)庫。(實(shí)例位置:光盤\TM\sl\10\1)</p><p> ?。?)創(chuàng)建名稱為10.1的動(dòng)態(tài)Web項(xiàng)目,將MySQL數(shù)據(jù)庫的驅(qū)動(dòng)包添加至項(xiàng)目的構(gòu)建路徑,構(gòu)建開發(fā)環(huán)境。</p><p> ?。?)創(chuàng)建程序中的主頁
12、index.jsp,在該頁面中加載數(shù)據(jù)庫驅(qū)動(dòng)并創(chuàng)建數(shù)據(jù)庫連接。關(guān)鍵代碼如下:</p><p><b> <%</b></p><p><b> try {</b></p><p> Class.forName("com.mysql.jdbc.Driver");//加載數(shù)據(jù)庫驅(qū)動(dòng),注
13、冊到驅(qū)動(dòng)管理器</p><p> String url = "jdbc:mysql://localhost:3306/test";//數(shù)據(jù)庫連接字符串</p><p> String username = "root";//數(shù)據(jù)庫用戶名</p><p> String password = &qu
14、ot;111";//數(shù)據(jù)庫密碼</p><p> Connection conn = DriverManager.getConnection(url,username,password); //創(chuàng)建Connection連接</p><p> if(conn != null){ //判斷數(shù)據(jù)庫連接是否為空</p><p>
15、; out.println("數(shù)據(jù)庫連接成功!");//輸出連接信息</p><p> conn.close();//關(guān)閉數(shù)據(jù)庫連接</p><p><b> }else{</b></p><p> out.println("數(shù)據(jù)庫連接失??!");//輸出連接
16、信息</p><p><b> }</b></p><p> } catch (ClassNotFoundException e) {</p><p> e.printStackTrace();</p><p> } catch (SQLException e) {</p><p> e
17、.printStackTrace();</p><p><b> }</b></p><p><b> %></b></p><p> 在index.jsp頁面中,首先通過Class的forName()方法加載數(shù)據(jù)庫驅(qū)動(dòng),然后使用DriverManager對象的getConnection()方法獲取數(shù)據(jù)庫連接C
18、onnection對象,最后將獲取結(jié)果輸出到頁面中。實(shí)例運(yùn)行結(jié)果如圖10.2所示。</p><p> 10.2 JDBC API</p><p> 視頻講解:光盤\TM\lx\10\JDBC API.exe</p><p> JDBC是Java程序操作數(shù)據(jù)庫的標(biāo)準(zhǔn),它由一組用Java語言編寫的類和接口組成,Java通過JDBC可以對多種關(guān)系數(shù)據(jù)庫進(jìn)行統(tǒng)一訪問
19、。所以,學(xué)習(xí)JDBC需要掌握J(rèn)DBC中的類和接口,也就是JDBC API。</p><p> 10.2.1 Connection接口</p><p> Connection接口位于java.sql包中,是與特定數(shù)據(jù)庫的連接會(huì)話,只有獲得特定數(shù)據(jù)庫的連接對象,才能訪問數(shù)據(jù)庫,操作數(shù)據(jù)庫中的數(shù)據(jù)表、視圖和存儲(chǔ)過程等。Connection接口的方法聲明及說明如表10.1所示。</p&
20、gt;<p> 表10.1 Connection接口的方法聲明及說明</p><p><b> 續(xù)表 </b></p><p> 10.2.2 DriverManager類</p><p> 使用JDBC操作數(shù)據(jù)庫,需要使用數(shù)據(jù)庫廠商提供的驅(qū)動(dòng)程序,通過驅(qū)動(dòng)程序可以與數(shù)據(jù)庫進(jìn)行交互。DriverManager類主
21、要作用于用戶及驅(qū)動(dòng)程序之間,它是JDBC中的管理層,通過DriverManager類可以管理數(shù)據(jù)庫廠商提供的驅(qū)動(dòng)程序,并建立應(yīng)用程序與數(shù)據(jù)庫之間的連接,其方法聲明及說明如表10.2所示。</p><p> 表10.2 DriverManager類的方法聲明及說明</p><p> 10.2.3 Statement接口</p><p> 在創(chuàng)建了數(shù)據(jù)庫連接之
22、后,就可以通過程序來調(diào)用SQL語句對數(shù)據(jù)庫進(jìn)行操作,在JDBC中Statement接口封裝了這些操作。Statement接口提供了執(zhí)行語句和獲取查詢結(jié)果的基本方法,其方法聲明及說明如表10.3所示。</p><p> 表10.3 Statement接口的方法聲明及說明</p><p><b> 續(xù)表 </b></p><p> 1
23、0.2.4 PreparedStatement接口</p><p> Statement接口封裝了JDBC執(zhí)行SQL語句的方法,它可以完成Java程序執(zhí)行SQL語句的操作,但在實(shí)際開發(fā)過程中,SQL語句往往需要將程序中的變量做查詢條件參數(shù)等。使用Statement接口進(jìn)行操作過于煩瑣,而且存在安全方面的缺陷,針對這一問題,JDBC API中封裝了Statement的擴(kuò)展PreparedStatement對象。
24、</p><p> PreparedStatement接口繼承于Statement接口,它擁有Statement接口中的方法,而且PreparedStatement接口針對帶有參數(shù)SQL語句的執(zhí)行操作進(jìn)行了擴(kuò)展。應(yīng)用于PreparedStatement接口中的SQL語句,可以使用占位符“?”來代替SQL語句中的參數(shù),然后再對其進(jìn)行賦值。PreparedStatement接口的方法聲明及說明如表10.4所示。&l
25、t;/p><p> 表10.4 PreparedStatement接口的方法聲明及說明</p><p><b> 續(xù)表 </b></p><p> 在實(shí)際的開發(fā)過程中,如果涉及向SQL語句傳遞參數(shù),最好使用PreparedStatement接口實(shí)現(xiàn)。因?yàn)槭褂肞reparedStatement接口,不僅可以提高SQL的執(zhí)行效率,而且還可
26、以避免SQL語句的注入式攻擊。</p><p> 10.2.5 ResultSet接口</p><p> 執(zhí)行SQL語句的查詢語句會(huì)返回查詢的結(jié)果集,在JDBC API中,使用ResultSet對象接收查詢結(jié)果集。</p><p> ResultSet接口位于java.sql包中,封裝了數(shù)據(jù)查詢的結(jié)果集。ResultSet對象包含了符合SQL語句的所有行,針
27、對Java中的數(shù)據(jù)類型提供了一套getXXX()方法,通過這些方法可以獲取每一行中的數(shù)據(jù)。除此之外,ResultSet還提供了光標(biāo)的功能,通過光標(biāo)可以自由定位到某一行中的數(shù)據(jù),其方法聲明及說明如表10.5所示。</p><p> 表10.5 ResultSet接口的方法聲明及說明</p><p><b> 續(xù)表 </b></p><p&
28、gt; 10.3 JDBC操作數(shù)據(jù)庫</p><p> 視頻講解:光盤\TM\lx\10\JDBC操作數(shù)據(jù)庫.exe</p><p> 在了解了JDBC API后,就可以通過JDBC API來操作數(shù)據(jù)庫,實(shí)現(xiàn)對數(shù)據(jù)庫的CRUD操作。</p><p> 10.3.1 添加數(shù)據(jù)</p><p> 通過JDBC向數(shù)據(jù)庫添加數(shù)據(jù),可以使
29、用INSERT語句實(shí)現(xiàn)插入數(shù)據(jù)的SQL語句,對于SQL語句中的參數(shù)可以用占位符“?”代替,然后通過PreparedStatement對其賦值并執(zhí)行SQL。</p><p> 【例10.3】 創(chuàng)建Web項(xiàng)目,通過JDBC實(shí)現(xiàn)圖書信息添加功能。(實(shí)例位置:光盤\TM\sl\10\2)</p><p> ?。?)在MySQL數(shù)據(jù)庫中創(chuàng)建圖書信息表tb_books,其結(jié)構(gòu)如圖10.3所示。&l
30、t;/p><p> 圖10.3 tb_books表結(jié)構(gòu)</p><p> ?。?)創(chuàng)建名稱為Book的類,用于封裝圖書對象信息。關(guān)鍵代碼如下:</p><p> public class Book {</p><p> private int id; //編號</p><p> private String
31、 name; //圖書名稱</p><p> private double price; //價(jià)格</p><p> private int bookCount; //數(shù)量</p><p> private String author; //作者</p><p> public int getId() {</p>
32、<p> return id;</p><p><b> }</b></p><p> public void setId(int id) {</p><p> this.id = id;</p><p><b> }</b></p><p> //省
33、略部分setXXX()與getXXX()方法</p><p><b> }</b></p><p> ?。?)創(chuàng)建index.jsp頁面,它是程序中的主頁,用于放置添加圖書信息所需要的表單,該表單提交到AddBook.jsp頁面進(jìn)行處理。關(guān)鍵代碼如下:</p><p> <form action="AddBook.jsp&q
34、uot; method="post" onsubmit="return check(this);"></p><p> <table align="center" width="450"></p><p><b> <tr></b></p>
35、<p> <td align="center" colspan="2"></p><p> <h2>添加圖書信息</h2></p><p><b> <hr></b></p><p><b> </td></b&
36、gt;</p><p><b> </tr></b></p><p><b> <tr></b></p><p> <td align="right">圖書名稱:</td></p><p> <td><in
37、put type="text" name="name" /></td></p><p><b> </tr></b></p><p><b> <tr></b></p><p> <td align="right&quo
38、t;>價(jià) 格:</td></p><p> <td><input type="text" name="price" /></td></p><p><b> </tr></b></p><p><b> <tr>
39、;</b></p><p> <td align="right">數(shù) 量:</td></p><p> <td><input type="text" name="bookCount" /></td></p><p><b&g
40、t; </tr></b></p><p><b> <tr></b></p><p> <td align="right">作 者:</td></p><p> <td><input type="text" name=
41、"author" /></td></p><p><b> </tr></b></p><p><b> <tr></b></p><p> <td align="center" colspan="2">
42、</p><p> <input type="submit" value="添 加"></p><p><b> </td></b></p><p><b> </tr></b></p><p><b>
43、</table></b></p><p><b> </form></b></p><p> ?。?)創(chuàng)建AddBook.jsp頁面,用于對添加圖書信息請求進(jìn)行處理,該頁面通過JDBC所提交的圖書信息數(shù)據(jù)寫入數(shù)據(jù)庫中。關(guān)鍵代碼如下:</p><p> <%request.setCharacterEn
44、coding("UTF-8); %></p><p> <jsp:useBean id="book" class="com.lyq.bean.Book"></jsp:useBean></p><p> <jsp:setProperty property="*" name="
45、;book"/></p><p><b> <%</b></p><p><b> try {</b></p><p> Class.forName("com.mysql.jdbc.Driver");//加載數(shù)據(jù)庫驅(qū)動(dòng),注冊到驅(qū)動(dòng)管理器</p><
46、;p> String url = "jdbc:mysql://localhost:3306/db_database10";//數(shù)據(jù)庫連接字符串</p><p> String username = "root";//數(shù)據(jù)庫用戶名</p><p> String password = "111";
47、//數(shù)據(jù)庫密碼</p><p> Connection conn = DriverManager.getConnection(url,username,password); //創(chuàng)建Connection連接</p><p> //添加圖書信息的SQL語句</p><p> String sql = "insert into tb_book
48、s(name,price,bookCount,author) values(?,?,?,?)";</p><p> PreparedStatement ps = conn.prepareStatement(sql); //獲取PreparedStatement</p><p> ps.setString(1, book.getName());//對SQL語句中
49、的第1個(gè)參數(shù)賦值</p><p> ps.setDouble(2, book.getPrice());//對SQL語句中的第2個(gè)參數(shù)賦值</p><p> ps.setInt(3,book.getBookCount());//對SQL語句中的第3個(gè)參數(shù)賦值</p><p> ps.setString(4, book.getAuthor(
50、));//對SQL語句中的第4個(gè)參數(shù)賦值</p><p> int row = ps.executeUpdate();//執(zhí)行更新操作,返回所影響的行數(shù)</p><p> if(row > 0){ //判斷是否更新成功</p><p> out.print("成功添加了 " + row +
51、 "條數(shù)據(jù)!");//更新成功輸出信息</p><p><b> }</b></p><p> ps.close();//關(guān)閉PreparedStatement,釋放資源</p><p> conn.close();//關(guān)閉Connection,釋放資源</p>
52、;<p> } catch (Exception e) {</p><p> out.print("圖書信息添加失?。?quot;);</p><p> e.printStackTrace();</p><p><b> }</b></p><p><b> %><
53、/b></p><p><b> <br></b></p><p> <a href="index.jsp">返回</a></p><p> 在AddBook.jsp頁面中,首先通過<jsp:useBean>實(shí)例化JavaBean對象Book,并通過<jsp:
54、setProperty>對Book對象中的屬性賦值,在構(gòu)建了圖書對象后通過JDBC將圖書信息寫入到數(shù)據(jù)中。</p><p> 向數(shù)據(jù)庫插入圖書信息的過程中,主要通過PreparedStatement對象進(jìn)行操作。使用PreparedStatement對象,其SQL語句中的參數(shù)可以使用占位符“?”代替,再通過PreparedStatement對象對SQL語句中的參數(shù)逐一賦值,將圖書信息傳遞到SQL語句中。&
55、lt;/p><p> 通過PreparedStatement對象對SQL語句中的參數(shù)進(jìn)行賦值后,還不能將圖書信息寫入到數(shù)據(jù)庫中,需要調(diào)用它的executeUpdate()方法執(zhí)行更新操作,此時(shí)才能將圖書信息寫入到數(shù)據(jù)庫中。該方法被執(zhí)行后返回int型數(shù)據(jù),其含義是所影響的行數(shù),實(shí)例中將其獲取并輸出到頁面中。</p><p> 編寫完成AddBook.jsp頁面后,部署并運(yùn)行程序,將進(jìn)入到添加
56、圖書信息頁面,其效果如圖10.4所示。</p><p> 正確填寫圖書信息后,單擊“添加”按鈕,圖書信息數(shù)據(jù)將被寫入到數(shù)據(jù)庫中,此時(shí)頁面輸出提示信息,其效果如圖10.5所示。</p><p> 圖10.4 添加圖書信息 圖10.5 圖書信息添加成功</p><p> 圖書信息添加成功后,可通過
57、查看數(shù)據(jù)庫中的數(shù)據(jù)來驗(yàn)證插入結(jié)果。</p><p> 10.3.2 查詢數(shù)據(jù)</p><p> 使用JDBC查詢數(shù)據(jù)與添加數(shù)據(jù)的流程基本相同,但執(zhí)行查詢數(shù)據(jù)操作后需要通過一個(gè)對象來裝載查詢結(jié)果集,這個(gè)對象就是ResultSet對象。</p><p> ResultSet對象是JDBC API中封裝的結(jié)果集對象,從數(shù)據(jù)表中所查詢到的數(shù)據(jù)都放置在這個(gè)集合中,其結(jié)
58、構(gòu)如圖10.6所示。</p><p> 從圖10.6中可以看出,在ResultSet集合中,通過移動(dòng)“光標(biāo)”來獲取所查詢到的數(shù)據(jù),ResultSet對象中的“光標(biāo)”可以進(jìn)行上下移動(dòng),如獲取ResultSet集合中的一條數(shù)據(jù),只需要把“光標(biāo)”定位到當(dāng)前數(shù)據(jù)光標(biāo)行即可。</p><p> 【例10.4】 創(chuàng)建Web項(xiàng)目,通過JDBC查詢圖書信息表中的圖書信息數(shù)據(jù),并將其顯示在JSP頁面中
59、。(實(shí)例位置:光盤\TM\sl\10\3)</p><p> ?。?)創(chuàng)建名稱為Book的類,用于封裝圖書信息。關(guān)鍵代碼如下:</p><p> public class Book {</p><p> private int id; //編號</p><p> private String name;
60、//圖書名稱</p><p> private double price; //價(jià)格</p><p> private int bookCount; //數(shù)量</p><p> private String author; //作者</p><p> public int getId
61、() {</p><p> return id;</p><p><b> }</b></p><p> public void setId(int id) {</p><p> this.id = id;</p><p><b> }</b></p>
62、<p> //省略部分setXXX()與getXXX()方法</p><p><b> }</b></p><p> (2)創(chuàng)建名稱為FindServlet的Servlet對象,用于查詢所有圖書信息。在此Servlet中,編寫doGet()方法,建立數(shù)據(jù)庫連接,并將所查詢的數(shù)據(jù)集合放置到HttpServletRequest對象中,將請求轉(zhuǎn)發(fā)到JSP頁
63、面。關(guān)鍵代碼如下:</p><p> protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {</p><p><b> try {</b></p><p>
64、Class.forName("com.mysql.jdbc.Driver");//加載數(shù)據(jù)庫驅(qū)動(dòng),注冊到驅(qū)動(dòng)管理器</p><p> String url = "jdbc:mysql://localhost:3306/db_database11";//數(shù)據(jù)庫連接字符串</p><p> String username = "r
65、oot";//數(shù)據(jù)庫用戶名</p><p> String password = "111";//數(shù)據(jù)庫密碼</p><p> Connection conn = DriverManager.getConnection(url,username,password); //創(chuàng)建Connection連接</p>&
66、lt;p> Statement stmt = conn.createStatement();//獲取Statement對象</p><p> String sql = "select * from tb_book";//添加圖書信息的SQL語句</p><p> ResultSet rs = stmt.executeQuery(sql);
67、//執(zhí)行查詢</p><p> List<Book> list = new ArrayList<Book>();//實(shí)例化List對象</p><p> while(rs.next()){//光標(biāo)向后移動(dòng),并判斷是否有效</p><p> Book book = new Book();
68、//實(shí)例化Book對象</p><p> book.setId(rs.getInt("id"));//對id屬性賦值</p><p> book.setName(rs.getString("name"));//對name屬性賦值</p><p> book.setPrice(rs.getDoub
69、le("price"));//對price屬性賦值</p><p> book.setBookCount(rs.getInt("bookCount"));//對bookCount屬性賦值</p><p> book.setAuthor(rs.getString("author"));//對author屬性
70、賦值</p><p> list.add(book); //將圖書對象添加到集合中</p><p><b> }</b></p><p> request.setAttribute("list", list); //將圖書集合放置到request中</p><p>
71、 rs.close();//關(guān)閉ResultSet</p><p> stmt.close();//關(guān)閉Statement</p><p> conn.close();//關(guān)閉Connection</p><p> } catch (ClassNotFoundException e) {</p>
72、;<p> e.printStackTrace();</p><p> } catch (SQLException e) {</p><p> e.printStackTrace();</p><p><b> }</b></p><p> request.getRequestDispatcher
73、("book_list.jsp").forward(request, response); //請求轉(zhuǎn)發(fā)到book_list.jsp</p><p><b> }</b></p><p> 在doGet()方法中,首先獲取了數(shù)據(jù)庫的連接Connection;然后通過Statement對象執(zhí)行查詢圖書信息的SELECT語句,并獲取ResultS
74、et結(jié)果集;最后遍歷ResultSet中的數(shù)據(jù)來封裝圖書對象Book,將其添加到List集合中,轉(zhuǎn)發(fā)到顯示頁面進(jìn)行顯示。</p><p> 獲取到ResultSet對象后,就可以通過移動(dòng)光標(biāo)定位到查詢結(jié)果中的指定行,然后通過ResultSet對象提供的一系列g(shù)etXXX()方法來獲取當(dāng)前行的數(shù)據(jù)。</p><p> ?。?)創(chuàng)建book_list.jsp頁面,用于顯示所有圖書信息。關(guān)鍵代
75、碼如下:</p><p> <table align="center" width="450" border="1"></p><p><b> <tr></b></p><p> <td align="center" colsp
76、an="5"></p><p> <h2>所有圖書信息</h2></p><p><b> </td></b></p><p><b> </tr></b></p><p> <tr align="ce
77、nter"></p><p> <td><b>ID</b></td></p><p> <td><b>圖書名稱</b></td></p><p> <td><b>價(jià)格</b></td></p>
78、;<p> <td><b>數(shù)量</b></td></p><p> <td><b>作者</b></td></p><p><b> </tr></b></p><p><b> <%</b>
79、;</p><p> //獲取圖書信息集合</p><p> List<Book> list = (List<Book>)request.getAttribute("list");</p><p> //判斷集合是否有效</p><p> if(list == null || list.si
80、ze() < 1){</p><p> out.print("沒有數(shù)據(jù)!");</p><p><b> }else{</b></p><p> //遍歷圖書集合中的數(shù)據(jù)</p><p> for(Book book : list){</p><p><b&
81、gt; %></b></p><p> <tr align="center"></p><p> <td><%=book.getId()%></td></p><p> <td><%=book.getName()%></td></p
82、><p> <td><%=book.getPrice()%></td></p><p> <td><%=book.getBookCount()%></td></p><p> <td><%=book.getAuthor()%></td></p>
83、<p><b> </tr></b></p><p><b> <%</b></p><p><b> }</b></p><p><b> }</b></p><p><b> %></b&g
84、t;</p><p><b> </table></b></p><p> 由于FindServlet將查詢的所有圖書信息集合放置到了request中,所以在book_list.jsp頁面中,可以通過request的getAttribute()方法獲取到這一集合對象。實(shí)例中在獲取所有圖書信息集合后,通過for循環(huán)遍歷了所有圖書信息集合,并將其輸出到頁面
85、中。</p><p> ?。?)創(chuàng)建index.jsp頁面,該頁面是程序中的主頁,在該頁面中編寫一個(gè)導(dǎo)航鏈接,用于請求查看所有圖書信息。關(guān)鍵代碼如下:</p><p><b> <body></b></p><p> <a href="FindServlet">查看所有圖書</a>&l
86、t;/p><p><b> </body></b></p><p> 部署并運(yùn)行程序后,將打開index.jsp頁面,單擊“查看所有圖書”超鏈接后,可以查看到從數(shù)據(jù)庫中查詢的所有圖書信息,其運(yùn)行結(jié)果如圖10.7所示。</p><p> 圖10.7 查詢所有圖書信息</p><p> 10.3.3 修改
87、數(shù)據(jù)</p><p> 使用JDBC修改數(shù)據(jù)庫中的數(shù)據(jù),其操作方法與添加數(shù)據(jù)相似,只不過修改數(shù)據(jù)需要使用UPDATE語句實(shí)現(xiàn),如把圖書id為1的圖書數(shù)量修改成100,其SQL語句如下:</p><p> update tb_book set bookcount=100 where id=1</p><p> 在實(shí)際開發(fā)中,通常情況下都是由程序傳遞SQL語句中的
88、參數(shù),所以修改數(shù)據(jù)也需要使用PreparedStatement對象進(jìn)行操作。</p><p> 【例10.5】 在查詢所有圖書信息的頁面中,添加修改圖書數(shù)量表單,通過Servlet修改數(shù)據(jù)庫中的圖書數(shù)量。(實(shí)例位置:光盤\TM\sl\10\4)</p><p> (1)在book_list.jsp頁面中增加修改圖書數(shù)量的表單,將該表單的提交地址設(shè)置為UpdateServlet。關(guān)鍵代
89、碼如下:</p><p> <table align="center" width="500" border="1"></p><p><b> <tr></b></p><p> <td align="center" colsp
90、an="6"></p><p> <h2>所有圖書信息</h2></p><p><b> </td></b></p><p><b> </tr></b></p><p> <tr align="ce
91、nter"></p><p> <td><b>ID</b></td></p><p> <td><b>圖書名稱</b></td></p><p> <td><b>價(jià)格</b></td></p>
92、;<p> <td><b>數(shù)量</b></td></p><p> <td><b>作者</b></td></p><p> <td><b>修改數(shù)量</b></td></p><p><b>
93、</tr></b></p><p><b> <%</b></p><p> //獲取圖書信息集合</p><p> List<Book> list = (List<Book>)request.getAttribute("list");</p><
94、;p> //判斷集合是否有效</p><p> if(list == null || list.size() < 1){</p><p> out.print("沒有數(shù)據(jù)!");</p><p><b> }else{</b></p><p> //遍歷圖書集合中的數(shù)據(jù)</
95、p><p> for(Book book : list){</p><p><b> %></b></p><p> <tr align="center"></p><p> <td><%=book.getId()%></td></p&g
96、t;<p> <td><%=book.getName()%></td></p><p> <td><%=book.getPrice()%></td></p><p> <td><%=book.getBookCount()%></td></p><
97、;p> <td><%=book.getAuthor()%></td></p><p><b> <td></b></p><p> <form action="UpdateServlet" method="post" onsubmit="return c
98、heck(this);"></p><p> <input type="hidden" name="id" value="<%=book.getId()%>"></p><p> <input type="text" name="bookCount&q
99、uot; size="3"></p><p> <input type="submit" value="修 改"></p><p><b> </form></b></p><p><b> </td></b><
100、;/p><p><b> </tr></b></p><p><b> <%</b></p><p><b> }</b></p><p><b> }</b></p><p><b> %>
101、</b></p><p><b> </table></b></p><p> 在修改圖書信息的表單中主要包含了兩個(gè)屬性信息,分別為圖書id與圖書數(shù)量bookCount,因?yàn)樾薷膱D書數(shù)量時(shí)需要明確指定圖書的id作為修改的條件,否則,將會(huì)修改所有圖書信息記錄。</p><p> ?。?)創(chuàng)建修改圖書信息請求的Servl
102、et對象,其名稱為UpdateServlet。由于表單提交的請求類型為post,所以在UpdateServlet中編寫doPost()方法,對修改圖書信息請求進(jìn)行處理。關(guān)鍵代碼如下:</p><p> protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, I
103、OException {</p><p> int id = Integer.valueOf(request.getParameter("id"));</p><p> int bookCount = Integer.valueOf(request.getParameter("bookCount")); </p><p>
104、<b> try {</b></p><p> Class.forName("com.mysql.jdbc.Driver");//加載數(shù)據(jù)庫驅(qū)動(dòng),注冊到驅(qū)動(dòng)管理器</p><p> String url = "jdbc:mysql://localhost:3306/db_database11";//數(shù)據(jù)庫連接
105、字符串</p><p> String username = "root";//數(shù)據(jù)庫用戶名</p><p> String password = "111";//數(shù)據(jù)庫密碼</p><p> Connection conn = DriverManager.getConnection(ur
106、l,username,password); //創(chuàng)建Connection連接</p><p> String sql = "update tb_book set bookcount=? where id=?";//更新SQL語句</p><p> PreparedStatement ps = conn.prepareStatement(sql); //獲取Pr
107、eparedStatement</p><p> ps.setInt(1, bookCount); //對SQL語句中的第1個(gè)參數(shù)賦值</p><p> ps.setInt(2, id); //對SQL語句中的第2個(gè)參數(shù)賦值</p><p> ps.executeUpdate();//執(zhí)行更新操作</
108、p><p> ps.close();//關(guān)閉PreparedStatement</p><p> conn.close();//關(guān)閉Connection</p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p>
109、<p><b> } </b></p><p> response.sendRedirect("FindServlet");//重定向到FindServlet</p><p><b> }</b></p><p> 在UpdateServlet的doPost()方法中,
110、首先通過HttpServletRequest獲取圖書的id與修改的圖書數(shù)量,然后建立數(shù)據(jù)庫連接Connection,通過PreparedStatement對SQL語句進(jìn)行預(yù)處理并對SQL語句參數(shù)賦值,最后執(zhí)行更新操作。</p><p> 在執(zhí)行了圖書數(shù)量的更新操作后,實(shí)例中通過HttpServletRequest對象將請求重定向到FindServlet,進(jìn)行查看更新后的結(jié)果。</p><p&
111、gt; 實(shí)例運(yùn)行后,進(jìn)入程序中的首頁頁面,單擊“查看所有圖書”超鏈接后,進(jìn)入到圖書信息列表頁面,在該頁面中可以對圖書數(shù)量進(jìn)行修改,如圖10.8所示。</p><p> 在正確填寫了圖書數(shù)量后,單擊“修改”按鈕即可將圖書數(shù)量更新到數(shù)據(jù)中。</p><p> 10.3.4 刪除數(shù)據(jù)</p><p> 刪除數(shù)據(jù)使用的SQL語句為DELETE語句,如刪除圖書id為
112、1的圖書信息,其SQL語句如下:</p><p> delete from tb_book where id=1</p><p> 在實(shí)際開發(fā)中,通常情況下都是由程序傳遞SQL語句中的參數(shù),所以修改數(shù)據(jù)也需要使用PreparedStatement對象進(jìn)行操作。</p><p> 【例10.6】 在查詢所有圖書信息的頁面中,添加刪除圖書信息的超鏈接,通過Ser
113、vlet實(shí)現(xiàn)對數(shù)據(jù)的刪除操作。(實(shí)例位置:光盤\TM\sl\10\5)</p><p> ?。?)在book_list.jsp頁面中,增加刪除圖書信息的超鏈接,將鏈接的地址指向DeleteServlet。關(guān)鍵代碼如下:</p><p> <table align="center" width="500" border="1"
114、;></p><p><b> <tr></b></p><p> <td align="center" colspan="6"></p><p> <h2>所有圖書信息</h2></p><p><b> &
115、lt;/td></b></p><p><b> </tr></b></p><p> <tr align="center"></p><p> <td><b>ID</b></td></p><p> &
116、lt;td><b>圖書名稱</b></td></p><p> <td><b>價(jià)格</b></td></p><p> <td><b>數(shù)量</b></td></p><p> <td><b>作者<
117、;/b></td></p><p> <td><b>刪 除</b></td></p><p><b> </tr></b></p><p><b> <%</b></p><p> //獲取圖書信息集合<
118、;/p><p> List<Book> list = (List<Book>)request.getAttribute("list");</p><p> //判斷集合是否有效</p><p> if(list == null || list.size() < 1){</p><p> o
119、ut.print("沒有數(shù)據(jù)!");</p><p><b> }else{</b></p><p> //遍歷圖書集合中的數(shù)據(jù)</p><p> for(Book book : list){</p><p><b> %></b></p><p
120、> <tr align="center"></p><p> <td><%=book.getId()%></td></p><p> <td><%=book.getName()%></td></p><p> <td><%=book
121、.getPrice()%></td></p><p> <td><%=book.getBookCount()%></td></p><p> <td><%=book.getAuthor()%></td></p><p><b> <td></b
122、></p><p> <a href="DeleteServlet?id=<%=book.getId()%>">刪除</a></p><p><b> </td></b></p><p><b> </tr></b></p&g
123、t;<p><b> <%</b></p><p><b> }</b></p><p><b> }</b></p><p><b> %></b></p><p><b> </table>&l
124、t;/b></p><p> 在刪除數(shù)據(jù)信息操作中,需要傳遞所要?jiǎng)h除的圖書對象,因此,在刪除圖書信息的超鏈接中加入圖書id值。</p><p> ?。?)編寫處理刪除圖書信息的Servlet,其名稱為DeleteServlet。在doGet()方法中,編寫刪除圖書信息的方法。關(guān)鍵代碼如下:</p><p> protected void doGet(Htt
125、pServletRequest request, HttpServletResponse response) throws ServletException, IOException {</p><p> int id = Integer.valueOf(request.getParameter("id"));//獲取圖書id</p><p><b>
126、 try {</b></p><p> Class.forName("com.mysql.jdbc.Driver");//加載數(shù)據(jù)庫驅(qū)動(dòng),注冊到驅(qū)動(dòng)管理器</p><p> String url = "jdbc:mysql://localhost:3306/db_database10";//數(shù)據(jù)庫連接字符串</p&
127、gt;<p> String username = "root";//數(shù)據(jù)庫用戶名</p><p> String password = "111";//數(shù)據(jù)庫密碼</p><p> Connection conn = DriverManager.getConnection(url,username,p
128、assword); //創(chuàng)建Connection連接</p><p> String sql = "delete from tb_book where id=?";//刪除圖書信息的SQL語句</p><p> PreparedStatement ps = conn.prepareStatement(sql); //獲取PreparedStatement&l
129、t;/p><p> ps.setInt(1, id); //對SQL語句中的第一個(gè)占位符賦值</p><p> ps.executeUpdate();//執(zhí)行更新操作</p><p> ps.close();//關(guān)閉PreparedStatement</p><p> conn.clo
130、se();//關(guān)閉Connection</p><p> } catch (Exception e) {</p><p> e.printStackTrace();</p><p><b> } </b></p><p> response.sendRedirect("FindServ
131、let");//重定向到FindServlet</p><p><b> }</b></p><p> 在DeleteServlet類的doGet()方法中,首先獲取要?jiǎng)h除的圖書id值,然后創(chuàng)建數(shù)據(jù)庫連接Connection,通過PreparedStatement對SQL語句進(jìn)行預(yù)處理并對SQL語句參數(shù)賦值,最后執(zhí)行刪除操作。</p>
132、;<p> 實(shí)例運(yùn)行后,進(jìn)入程序中的首頁,單擊“查看所有圖書”超鏈接后,進(jìn)入到圖書信息列表頁面,在該頁面中可以看到每一條圖書信息的超鏈接,如圖10.9所示。</p><p> 單擊每一條圖書信息對應(yīng)的“刪除”超鏈接后,此條圖書信息將從數(shù)據(jù)庫中刪除。</p><p> 10.3.5 批處理</p><p> 在JDBC開發(fā)中,操作數(shù)據(jù)庫需要與數(shù)
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦公自動(dòng)化什么是辦公自動(dòng)化系統(tǒng)?
- 一個(gè)辦公自動(dòng)化系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 企業(yè)辦公自動(dòng)化系統(tǒng)
- 一個(gè)辦公自動(dòng)化系統(tǒng)的安全技術(shù)研究.pdf
- 小型企業(yè)辦公自動(dòng)化系統(tǒng)設(shè)計(jì).pdf
- 企業(yè)辦公自動(dòng)化
- 一個(gè)中小企業(yè)辦公自動(dòng)化系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 辦公自動(dòng)化外文翻譯--辦公自動(dòng)化系統(tǒng)
- 小型企業(yè)辦公自動(dòng)化系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn).pdf
- cs模式的小型辦公自動(dòng)化系統(tǒng)開發(fā)
- 企業(yè)辦公自動(dòng)化管理系統(tǒng)設(shè)計(jì)
- 某企業(yè)移動(dòng)辦公自動(dòng)化系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 辦公自動(dòng)化論文《辦公自動(dòng)化》課程教改
- oa辦公自動(dòng)化系統(tǒng)
- 辦公自動(dòng)化系統(tǒng)方案
- 行政辦公自動(dòng)化系統(tǒng)
- 辦公自動(dòng)化系統(tǒng).pdf
- 12.2辦公自動(dòng)化系統(tǒng)
- 辦公自動(dòng)化
- 辦公自動(dòng)化與移動(dòng)辦公系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn).pdf
評論
0/150
提交評論