無論是一個(gè)小型的企業(yè)辦公自動(dòng)化系統(tǒng),還是像移動(dòng)那_第1頁
已閱讀1頁,還剩34頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

評論

0/150

提交評論