第4章_JDBC數(shù)據(jù)庫訪問技術(shù)_第1頁
第4章_JDBC數(shù)據(jù)庫訪問技術(shù)_第2頁
第4章_JDBC數(shù)據(jù)庫訪問技術(shù)_第3頁
第4章_JDBC數(shù)據(jù)庫訪問技術(shù)_第4頁
第4章_JDBC數(shù)據(jù)庫訪問技術(shù)_第5頁
已閱讀5頁,還剩55頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第第4章章 JDBC數(shù)據(jù)庫訪問技術(shù)數(shù)據(jù)庫訪問技術(shù) 數(shù)據(jù)庫是Web應(yīng)用程序重要組成部分,在Java Web應(yīng)用程序中,數(shù)據(jù)庫訪問是通過Java數(shù)據(jù)庫連接(Java DataBase Connectivity,簡稱JDBC )實(shí)現(xiàn)的。JDBC為開發(fā)人員提供了一個標(biāo)準(zhǔn)的API。 本章介紹使用JDBC驅(qū)動程序連接數(shù)據(jù)庫和使用連接池技術(shù)連接數(shù)據(jù)庫并設(shè)計(jì)應(yīng)用程序的方法、步驟和實(shí)例。第第4章章 JDBC數(shù)據(jù)庫訪問技術(shù)數(shù)據(jù)庫訪問技術(shù)4.1 JDBC技術(shù)概述技術(shù)概述4.2 JDBC訪問數(shù)據(jù)庫訪問數(shù)據(jù)庫4.3 綜合案例綜合案例學(xué)生身體體質(zhì)信息管理系統(tǒng)的開發(fā)學(xué)生身體體質(zhì)信息管理系統(tǒng)的開發(fā)4.4 數(shù)據(jù)源與連接池技術(shù)數(shù)

2、據(jù)源與連接池技術(shù)本章小結(jié)本章小結(jié)4.1 JDBC技術(shù)概述技術(shù)概述 JDBC是一種用于執(zhí)行SQL語句的Java API,由一組類與接口組成,通過調(diào)用這些類和接口所提供的方法,可以使用標(biāo)準(zhǔn)的SQL語言來存取數(shù)據(jù)庫中的數(shù)據(jù)。本節(jié)內(nèi)容:4.1.1 驅(qū)動程序接口Driver4.1.2 驅(qū)動程序管理器DriverManager4.1.3 數(shù)據(jù)庫連接接口Connection4.1.4 執(zhí)行SQL語句接口Statement4.1.5 執(zhí)行動態(tài)SQL語句接口PreparedStatement4.1.6 訪問結(jié)果集接口ResultSet類或接口作用java.sql.DriverManager該類處理驅(qū)動程序的加載

3、和建立新數(shù)據(jù)庫連接java.sql.Connection該接口實(shí)現(xiàn)對特定數(shù)據(jù)庫的連接java.sql.Satement該接口表示用于執(zhí)行靜態(tài)SQL語句并返回它所生成結(jié)果的對象java.sql.PreparedStatement該接口表示預(yù)編譯的SQL語句的對象,派生自Satement,預(yù)編譯SQL效率高且支持參數(shù)查詢java.sql.CallableStatement該接口表示用于執(zhí)行SQL語句存儲過程的對象。派生自PreparedStatement,用于調(diào)用數(shù)據(jù)庫中的存儲過程java.sql.ResultSet該接口表示數(shù)據(jù)庫結(jié)果集的數(shù)據(jù)表,統(tǒng)稱通過執(zhí)行查詢數(shù)據(jù)庫的語句生成4.1.1 驅(qū)動程

4、序接口Driver 每種數(shù)據(jù)庫都提供了數(shù)據(jù)庫驅(qū)動程序,并且都提供了一個實(shí)現(xiàn)java.sql.Driver接口的類,簡稱Driver類。 在應(yīng)用程序開發(fā)中,需要通過java.lang.Class類的靜態(tài)方法forName(String className),加載該Driver類。在加載時,創(chuàng)建自己的實(shí)例并向java.sql.DriverManager類注冊該實(shí)例。4.1.2 驅(qū)動程序管理器驅(qū)動程序管理器DriverManager java.sql.DriverManager類負(fù)責(zé)管理JDBC驅(qū)動程序的基本服務(wù),是JDBC的管理層,作用于用戶和驅(qū)動程序之間,負(fù)責(zé)跟蹤可用的驅(qū)動程序,并在數(shù)據(jù)庫和驅(qū)動

5、程序之間建立連接。 DriverManager類即可用來建立數(shù)據(jù)庫連接。 DriverManager類提供的最常用的方法是: Connection getConnection(String url,String user,String password) 該方法為靜態(tài)方法,用來獲得數(shù)據(jù)庫連接,有3個入口參數(shù),依次為要連接數(shù)據(jù)庫的URL、用戶名和密碼,返回值類型為java.sql.Connection4.1.3 數(shù)據(jù)庫連接接口數(shù)據(jù)庫連接接口Connection java.sql.Connection接口負(fù)責(zé)與特定數(shù)據(jù)庫的連接,形成連接對象。由該對象完成相關(guān)的操作。方法名稱功能描述createSt

6、atement()創(chuàng)建并返回一個Statement實(shí)例,通常在執(zhí)行無參數(shù)的SQL語句時創(chuàng)建該實(shí)例prepareStatement()創(chuàng)建并返回一個PreparedStatement實(shí)例,通常在執(zhí)行包含參數(shù)的SQL語句時創(chuàng)建該實(shí)例,并對SQL語句進(jìn)行了預(yù)編譯處理close()立即釋放Connection實(shí)例占用的數(shù)據(jù)庫和JDBC資源,即關(guān)閉數(shù)據(jù)庫連接表4-2 Connection接口的常用方法4.1.4 執(zhí)行執(zhí)行SQL語句接口語句接口Statement java.sql.Statement接口用來執(zhí)行靜態(tài)的SQL語句,并返回執(zhí)行結(jié)果。Statement接口提供的常用方法。方法名稱功能描述exec

7、uteQuery(String sql)執(zhí)行指定的靜態(tài)SELECT語句,并返回一個永遠(yuǎn)不能為null的ResultSet實(shí)例executeUpdate(String sql)執(zhí)行指定的靜態(tài)INSERT、UPDATE或DELETE語句,并返回一個int型數(shù)值,為同步更新記錄的條數(shù)close()立即釋放Statement實(shí)例占用的數(shù)據(jù)庫和JDBC資源,即關(guān)閉Statement實(shí)例4.1.5 執(zhí)行動態(tài)SQL語句接口 PreparedStatement java.sql.PreparedStatement接口繼承于Statement接口,是Statement接口的擴(kuò)展,用來執(zhí)行動態(tài)的SQL語句,即包含

8、參數(shù)的SQL語句。PreparedStatement接口提供的常用方法。方法名稱功能描述executeQuery()執(zhí)行前面包含參數(shù)的動態(tài)SELECT語句,并返回一個永遠(yuǎn)不能為null的ResultSet實(shí)例executeUpdate()執(zhí)行前面包含參數(shù)的動態(tài)INSERT、UPDATE或DELETE語句,并返回一個int型數(shù)值,為同步更新記錄的條數(shù)setXxx()為指定參數(shù)設(shè)置Xxx型值close()立即釋放Statement實(shí)例占用的數(shù)據(jù)庫和JDBC資源,即關(guān)閉Statement實(shí)例4.1.6 訪問結(jié)果集接口訪問結(jié)果集接口ResultSet 通過該接口的實(shí)例可以獲得檢索結(jié)果集,以及對應(yīng)數(shù)據(jù)表

9、的相關(guān)信息。ResultSet實(shí)例是通過執(zhí)行查詢數(shù)據(jù)庫的語句生成。ResultSet接口提供的常用方法。方法名稱功能描述first()移動指針到第一行;如果結(jié)果集為空則返回false,否則返回true;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常last()移動指針到最后一行;如果結(jié)果集為空則返回false,否則返回true;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常previous()移動指針到上一行;如果存在上一行則返回true,否則返回false;如果結(jié)果集類型為TYPE_FORWARD_ONLY將拋出異常next()移動指針到下一行;指針最初位于第一行

10、之前,第一次調(diào)用該方法將移動到第一行;如果存在下一行則返回true,否則返回falsegetRow()查看當(dāng)前行的索引編號;索引編號從1開始,如果位于有效記錄行上則返回一個int型索引編號,否則返回0findColumn()查看指定列名的索引編號;該方法有一個String型入口參數(shù),為要查看列的名稱,如果包含指定列,則返回int型索引編號,否則將拋出異常close()釋放ResultSet實(shí)例占用的數(shù)據(jù)庫和JDBC資源,當(dāng)關(guān)閉所屬的Statement實(shí)例時也將執(zhí)行此操作4.2 JDBC訪問數(shù)據(jù)庫使用使用JDBC訪問數(shù)據(jù)庫,其訪問流程是:訪問數(shù)據(jù)庫,其訪問流程是:(1)注冊驅(qū)動。)注冊驅(qū)動。(2

11、)建立連接)建立連接(Connection)。(3)創(chuàng)建數(shù)據(jù)庫操作對象用于執(zhí)行)創(chuàng)建數(shù)據(jù)庫操作對象用于執(zhí)行SQL的語句。的語句。(4)執(zhí)行語句。)執(zhí)行語句。(5)處理執(zhí)行結(jié)果)處理執(zhí)行結(jié)果(ResultSet)。(6)釋放資源。)釋放資源。本節(jié)內(nèi)容:本節(jié)內(nèi)容:4.2.1 注冊驅(qū)動注冊驅(qū)動MySQL的驅(qū)動程序的驅(qū)動程序4.2.2 JDBC連接數(shù)據(jù)庫創(chuàng)建連接對象連接數(shù)據(jù)庫創(chuàng)建連接對象4.2.3 創(chuàng)建數(shù)據(jù)庫的操作對象創(chuàng)建數(shù)據(jù)庫的操作對象4.2.4 執(zhí)行執(zhí)行SQL4.2.5 獲得查詢結(jié)果并進(jìn)行處理獲得查詢結(jié)果并進(jìn)行處理4.2.6 釋放資源釋放資源4.2.7 數(shù)據(jù)庫亂碼解決方案數(shù)據(jù)庫亂碼解決方案4.2.

12、1 注冊驅(qū)動MySQL的驅(qū)動程序1將驅(qū)動程序文件添加到應(yīng)用項(xiàng)目將驅(qū)動程序文件添加到應(yīng)用項(xiàng)目 將驅(qū)動程序?qū)Ⅱ?qū)動程序mysql-connector-java-5.1.6-bin,拷貝到,拷貝到Web應(yīng)應(yīng)用程序的用程序的WEB-INFlib目錄下,目錄下,Web應(yīng)用程序就可以通過應(yīng)用程序就可以通過JDBC接口訪問接口訪問MySQL數(shù)據(jù)庫了。數(shù)據(jù)庫了。2加載注冊指定的數(shù)據(jù)庫驅(qū)動程序加載注冊指定的數(shù)據(jù)庫驅(qū)動程序 對于對于MySQL數(shù)據(jù)庫,其驅(qū)動程序加載格式:數(shù)據(jù)庫,其驅(qū)動程序加載格式: Class.forName(com.mysql.jdbc.Driver); 其中,其中,“com.mysql.jdbc

13、.Driver”為為MySQL數(shù)據(jù)庫驅(qū)動程序數(shù)據(jù)庫驅(qū)動程序類名。類名。4.2.2 JDBC連接數(shù)據(jù)庫創(chuàng)建連接對象 創(chuàng)建數(shù)據(jù)庫連接對象,需要首先形成創(chuàng)建數(shù)據(jù)庫連接對象,需要首先形成“連接符號字連接符號字(URL)”,然后利用,然后利用“連接符號字連接符號字”實(shí)現(xiàn)連接并創(chuàng)建連接對象。實(shí)現(xiàn)連接并創(chuàng)建連接對象。1數(shù)據(jù)庫連接的數(shù)據(jù)庫連接的URL 對于對于MySQL數(shù)據(jù)庫的連接符號字,可采用如下方式數(shù)據(jù)庫的連接符號字,可采用如下方式創(chuàng)建:創(chuàng)建:String url1=jdbc:mysql:/數(shù)據(jù)庫服務(wù)器數(shù)據(jù)庫服務(wù)器IP:3306/數(shù)據(jù)庫名數(shù)據(jù)庫名;String url2=?user=root&pa

14、ssword=密碼密碼;String url3=&useUnicode=true&characterEncoding=UTF-8;String url=url1+url2+ url3;2利用連接符號字實(shí)現(xiàn)連接,獲取連接對象利用連接符號字實(shí)現(xiàn)連接,獲取連接對象 DriverManager類提供了類提供了getConnection方法,用來建立與數(shù)方法,用來建立與數(shù)據(jù)庫的連接。調(diào)用據(jù)庫的連接。調(diào)用getConnection()方法可返回一個數(shù)據(jù)庫連接方法可返回一個數(shù)據(jù)庫連接對象。對象。getConnection方法有方法有3種不同的重載形式:種不同的重載形式:第第1種:通過種:通過

15、url指定的數(shù)據(jù)庫建立連接,其語法原型為:指定的數(shù)據(jù)庫建立連接,其語法原型為: static Connection getConnection(String url)第第2種:通過種:通過url指定的數(shù)據(jù)庫建立連接,指定的數(shù)據(jù)庫建立連接,info提供了一些屬性,提供了一些屬性,這些屬性里包括了這些屬性里包括了user和和password等屬性,其語法原型為:等屬性,其語法原型為: static Connection getConnection(String url,Properties info);第第3種:傳入?yún)?shù)用戶名為種:傳入?yún)?shù)用戶名為user,密碼為,密碼為password,通過,通

16、過url指指定的數(shù)據(jù)庫建立連接,其語法原型為:定的數(shù)據(jù)庫建立連接,其語法原型為: static Connection getConnection(String url,String user,String password):3.利用利用JDBC連接連接MySQL數(shù)據(jù)庫,獲取連接對象的通用格數(shù)據(jù)庫,獲取連接對象的通用格式式 設(shè)設(shè)MySQL數(shù)據(jù)庫為:數(shù)據(jù)庫為:“students”,用戶名為,用戶名為“root”,密碼為,密碼為“123456”,數(shù)據(jù)庫讀寫的編碼采用,數(shù)據(jù)庫讀寫的編碼采用UTF-8,連接格式:,連接格式:String driverName = com.mysql.jdbc.Driv

17、er; /驅(qū)動程序名驅(qū)動程序名String userName = root; /數(shù)據(jù)庫用戶名數(shù)據(jù)庫用戶名String userPwd = 123456; /密碼密碼String dbName = students; /數(shù)據(jù)庫名數(shù)據(jù)庫名String url1=jdbc:mysql:/localhost:3306/+dbName;String url2 =?user=+userName+&password=+userPwd;String url3=&useUnicode=true&characterEncoding=UTF-8;String url =url1+url2+u

18、rl3; /形成連接字形成連接字Class.forName(driverName); /加載并注冊驅(qū)動程序加載并注冊驅(qū)動程序/獲取數(shù)據(jù)庫連接對象獲取數(shù)據(jù)庫連接對象Connection conn=DriverManager.getConnection(url); 4.2.3 創(chuàng)建數(shù)據(jù)庫的操作對象 數(shù)據(jù)庫的操作對象是指能執(zhí)行SQL語句的對象,需要Connection類中創(chuàng)建數(shù)據(jù)庫的操作對象的方法實(shí)現(xiàn)創(chuàng)建。 可創(chuàng)建兩種不同的數(shù)據(jù)庫操作對象: Statement對象、PrepareStatement對象。1創(chuàng)建創(chuàng)建Statement對象對象 利用Connection類的方法createStatemen

19、t()可以創(chuàng)建一個Statement類實(shí)例,用來執(zhí)行SQL操作。 例如,假設(shè)通過數(shù)據(jù)庫連接,得到其連接對象為conn,那么,可創(chuàng)建Statement的一個實(shí)例stmt: Statement stmt = conn.createStatement(); 2創(chuàng)建創(chuàng)建PrepareStatement對象對象(1)PreparedStatement對象使用PreparedStatement()方法創(chuàng)建,并且在創(chuàng)建時直接指定SQL語句。例如: String sql=select * from stu_info PreparedStatement pstmt= conn.preparedStatement

20、(sql); (2)使用帶參數(shù)的SQL語句(“?”表示參數(shù)值),創(chuàng)建PreparedStatement對象。例如: String ss=select * from stu_info where age=? and sex=?; PreparedStatement pstmt= conn.preparedStatement(ss); 但在SQL語句中,沒有指定具體的年齡和性別,在實(shí)際執(zhí)行該SQL前,需要向PreparedStatement對象傳遞參數(shù)值。設(shè)置參數(shù)值的格式為: PreparedStatement對象.setXXX(position,value);4.2.4 執(zhí)行SQL 創(chuàng)建操作對象

21、后,就可以利用該對象,實(shí)現(xiàn)對數(shù)據(jù)庫的具體操作,即執(zhí)行SQL語句。1. Statement對象執(zhí)行對象執(zhí)行SQL語句語句 Statement主要提供了兩種執(zhí)行SQL語句的方法:(1)ResultSet executeQuery(String sql): 執(zhí)行select語句,返回一個結(jié)果集。(2)int executeUpdate(String sql): 執(zhí)行update、insert、delete,返回一個整數(shù),表示執(zhí)行SQL語句影響的數(shù)據(jù)行數(shù)。2 . PreparedStatemen對象執(zhí)行對象執(zhí)行SQL語句語句 PreparedStatement也有ResultSet executeQu

22、ery()和int executeUpdate()兩個方法,但都不帶參數(shù)。PreparedStatement兩種執(zhí)行SQL語句的方法:(1)ResultSet executeQuery(): 執(zhí)行select語句,返回一個結(jié)果集。(2)int executeUpdate(): 執(zhí)行update、insert、delete的SQL語句。它返回一個整數(shù),表示執(zhí)行SQL語句影響的數(shù)據(jù)行數(shù)。4.2.5 獲得查詢結(jié)果并進(jìn)行處理 如果SQL語句是查詢語句,執(zhí)行executeQuery()方法返回的是ResultSet對象。ResultSet對象是一個由查詢結(jié)果構(gòu)成的數(shù)據(jù)表。 對查詢結(jié)果的處理,一般需要,首

23、先定位記錄位置,然。后對確定記錄的字段項(xiàng)實(shí)現(xiàn)操作。1記錄定位操作記錄定位操作 在ResultSet結(jié)果記錄集中隱含著一個數(shù)據(jù)行指針,可使用4.1節(jié)中表4-5中的方法將指針移動到指定的數(shù)據(jù)行。2.讀取指定字段的數(shù)據(jù)操作讀取指定字段的數(shù)據(jù)操作 有兩種格式,一是用整數(shù)指定字段的索引(索引從1開始),二是用字段名來指定字段。下表列出采用“指定字段的索引號”獲取各種類型的字段值的方法。方法名稱方法說明boolean getBoolean(int ColumnIndex)返回指定字段的以Java的booelan類型表示的字段值String getString(int ColumnIndex)返回指定字段的

24、以Java的String類型表示的字段值byte getByte(int ColumnIndex)返回指定字段的以Java的byte類型表示的字段值short getShort(int ColumnIndex)返回指定字段的以Java的short類型表示的字段值int getInt(int ColumnIndex)返回指定字段的以Java的int類型表示的字段值long getLong(int ColumnIndex)返回指定字段的以Java的long類型表示的字段值float getFloat(int ColumnIndex)返回指定字段的以Java的float類型表示的字段值double

25、getDouble(int ColumnIndex)返回指定字段的以Java的Double類型表示的字段值byte getBytes(int ColumnIndex)返回指定字段的以Java的字節(jié)數(shù)組類型表示的字段值Date getDate(int ColumnIndex)返回指定字段的以Java.sql.Date的Date類型表示的字段值3修改指定字段的數(shù)據(jù)操作修改指定字段的數(shù)據(jù)操作 移到指定的數(shù)據(jù)行后,可使用updateXxx()方法設(shè)置字段新的數(shù)值,其中“Xxx”指的是Java的數(shù)據(jù)類型。方法的參數(shù)也有兩種格式,一是用整數(shù)指定字段的索引(索引從1開始),二是用字段名來指定字段。格式: u

26、pdateXxx(字段名或字段序號,新數(shù)值)例如: 對數(shù)據(jù)表stu,其中的字段是xh(學(xué)號,字符串),name(姓名,字符串),cj(成績,整型),并且查詢結(jié)果集為rs,則對數(shù)據(jù)表stu當(dāng)前記錄中成績改為90,則需要執(zhí)行:String sql=select xh,name,cj from stu;RrsultSet rs=stmt.executeQuery(sql); rs.updateInt(3,90); /或rs.updateInt(cj,90);4.2.6 釋放資源 當(dāng)完成對數(shù)據(jù)庫記錄的一次操作后,應(yīng)及時關(guān)閉這些對象并釋放資源。 假設(shè)建立的對象依次為:連接對象為conn(Connecti

27、on conn),操作對象為pstmt (PreparedStatement pstmt),得到的查詢結(jié)果集對象為rs(RrsultSet rs),則需要依次關(guān)閉的對象是:rs.close();stmt.close();con.close();4.2.7 數(shù)據(jù)庫亂碼解決方案 在實(shí)現(xiàn)對數(shù)據(jù)庫操作時,對于漢字信息,有時不能正確處理,其原因是由于漢字編碼的不同所造成的。為了正確處理漢字信息,必須使?jié)h字編碼使用統(tǒng)一的編碼格式。漢字編碼,目前主要使用UTF-8和GB2312。本教材中統(tǒng)一使用UTF-8編碼。在設(shè)計(jì)Web應(yīng)用程序時,涉及到漢字信息編碼的組件主要有: (1)數(shù)據(jù)庫和數(shù)據(jù)表建立時,所建立的數(shù)據(jù)

28、庫和數(shù)據(jù)表及其各字段的編碼格式。(2)對數(shù)據(jù)庫中記錄的讀寫訪問所采用的編碼格式。(3)在JSP頁面之間傳遞參數(shù)(request對象)時,其漢字編碼格式。(4)在JSP頁面(HTML頁面)本身中漢字編碼格式。(5)由服務(wù)器響應(yīng)(response),返回到客戶端的信息編碼格式。 在所設(shè)計(jì)應(yīng)用程序時,需要將這幾部分的編碼格式統(tǒng)一為一種漢字編碼方式,就可以解決漢字亂碼問題。4.3 綜合案例 學(xué)生身體體質(zhì)信息管理系統(tǒng)的開發(fā)【案例說明】描述一個學(xué)生身體體質(zhì)的信息有:有id(序號,整型),name(姓名,字符串),sex(性別,字符串),age(年齡,整型),weight(體重,實(shí)型),hight(身高,實(shí)

29、型)。存放學(xué)生體質(zhì)信息的數(shù)據(jù)庫為students,數(shù)據(jù)表為stu_info。要求,利用JDBC技術(shù)實(shí)現(xiàn)對學(xué)生身體體質(zhì)信息的管理。 該問題是一個簡單的數(shù)據(jù)庫信息管理系統(tǒng),基本操作主要有:數(shù)據(jù)庫和數(shù)據(jù)表的建立;數(shù)據(jù)庫記錄信息的添加(插入);數(shù)據(jù)庫記錄信息的查詢;數(shù)據(jù)庫記錄信息的刪除;數(shù)據(jù)庫記錄信息的修改。1.功能劃分功能劃分 整個系統(tǒng)的業(yè)務(wù)邏輯,可以分為4個功能模塊:(1)添加記錄模塊:完成向數(shù)據(jù)庫添加新記錄。(2)查詢記錄模塊:完成將數(shù)據(jù)庫的記錄以網(wǎng)頁的方式顯示出來,一般需要采用有條件的查詢。(3)修改記錄模塊:完成對指定條件的數(shù)據(jù)庫記錄實(shí)現(xiàn)修改。(4)刪除記錄模塊:完成對指定條件記錄從數(shù)據(jù)庫中

30、刪除。2每個模塊的操作流程每個模塊的操作流程 對數(shù)據(jù)庫記錄的每種操作,需要的操作步驟是:(1)注冊驅(qū)動,并建立數(shù)據(jù)庫的連接;(2)創(chuàng)建執(zhí)行SQL的語句;(3)執(zhí)行語句;(4)處理執(zhí)行結(jié)果;(5)釋放資源; 下面按各功能模塊和實(shí)現(xiàn)操作步驟,分別給出其設(shè)計(jì)思想和設(shè)計(jì)過程。設(shè)計(jì)過程:4.3.1 數(shù)據(jù)庫和數(shù)據(jù)表的建立4.3.2 注冊驅(qū)動并建立數(shù)據(jù)庫的連接4.3.3 添加記錄模塊的設(shè)計(jì)與實(shí)現(xiàn)4.3.4 查詢記錄模塊的設(shè)計(jì)與實(shí)現(xiàn)4.3.5 修改記錄模塊的設(shè)計(jì)與實(shí)現(xiàn)4.3.6 刪除記錄模塊的設(shè)計(jì)與實(shí)現(xiàn)4.3.7 數(shù)據(jù)庫操作的模板4.3.8 整合各設(shè)計(jì)模塊形成完整的應(yīng)用系統(tǒng)4.3.9 問題與思考4.3.1 數(shù)

31、據(jù)庫和數(shù)據(jù)表的建立 該系統(tǒng)需要創(chuàng)建一個數(shù)據(jù)庫以及該庫中的一個數(shù)據(jù)表在MySQL中創(chuàng)建一個數(shù)據(jù)庫:students,并在數(shù)據(jù)庫students中創(chuàng)建表students_info。字段中文描述數(shù)據(jù)類型是否為空id學(xué)生學(xué)號int否name學(xué)生名字Varchar(20)是sex性別Varchar(4)是age年齡int是weight體重double是hight身高double是數(shù)據(jù)庫和數(shù)據(jù)表的建立代碼4.3.2 注冊驅(qū)動并建立數(shù)據(jù)庫的連接 對數(shù)據(jù)庫進(jìn)行查詢、添加、刪除、修改等操作時,都必須通過JDBC建立應(yīng)用程序與數(shù)據(jù)庫的連接,在本小節(jié)中給出實(shí)現(xiàn)“注冊驅(qū)動并建立數(shù)據(jù)庫的連接”的公共代碼。 連接數(shù)據(jù)庫時

32、,一般需要指定數(shù)據(jù)庫讀寫的編碼,這里采用“UTF-8”編碼。 實(shí)現(xiàn)注冊驅(qū)動并建立數(shù)據(jù)庫的連接的關(guān)鍵代碼段。4.3.3 添加記錄模塊的設(shè)計(jì)與實(shí)現(xiàn)【例4-1】利用PreparedStatement對象實(shí)現(xiàn)在數(shù)據(jù)庫中插入一條記錄。其相應(yīng)的記錄信息是:序號、姓名、性別、年齡、體重、身高,分別為:16、“張三”、“男”、20、70.0、175?!痉治觥渴褂肞reparedStatement對象向數(shù)據(jù)庫中插入(添加)記錄,其處理步驟:(1)建立數(shù)據(jù)庫的連接。(2)形成SQL語句(可以帶參數(shù),也可以不帶參數(shù))。(3)利用連接對象建立PreparedStatement對象。(4)若是帶參數(shù)的SQL執(zhí)行語句,則

33、需要對各參數(shù)設(shè)置相應(yīng)的參數(shù)值。(5)調(diào)用PreparedStatement對象,執(zhí)行executeUpdate()方法。(6)根據(jù)executeUpdate()方法返回的整數(shù),判定是否執(zhí)行成功,如果大于0表示成功,否則執(zhí)行失敗。(7)關(guān)閉所有資源。【設(shè)計(jì)與實(shí)現(xiàn)】源代碼 【運(yùn)行】 程序運(yùn)行 【例4-2】設(shè)計(jì)程序,實(shí)現(xiàn)利用提交頁面提交要添加的學(xué)生信息。然后進(jìn)入添加處理程序?qū)崿F(xiàn)將信息添加到數(shù)據(jù)庫?!痉治龇治觥啃枰獌蓚€JSP程序,程序insert_stu_2_tijiao.jsp將提交信息存放到request對象中,而程序insert_stu_2.jsp從request對象中獲取數(shù)據(jù),形成插入記錄的S

34、QL語句,并實(shí)現(xiàn)插入。request對象insert_stu_2.jspinsert_stu_2_tijiao.jsp【設(shè)計(jì)關(guān)鍵】【設(shè)計(jì)關(guān)鍵】(1)該例題有兩個組件,其關(guān)鍵是實(shí)現(xiàn)這兩個組件之間的數(shù)據(jù)共享,即,使用request對象實(shí)現(xiàn)兩個頁面信息的共享,分別使用了id,name,sex,age,weight,hight等變量。(2)在添加處理頁面,設(shè)置查詢參數(shù)值時,必須注意各字段的數(shù)據(jù)類型,不同的類型采用不同的設(shè)置方法。【實(shí)現(xiàn)】(1)提交頁面程序insert_stu_2_tijiao.jsp (2)插入記錄程序insert_stu_2.jsp【運(yùn)行】 程序運(yùn)行 4.3.4 查詢記錄模塊的設(shè)計(jì)與

35、實(shí)現(xiàn)【例4-3】采用PreparedStatement的對象實(shí)現(xiàn)記錄的查詢操作,要求查詢表stu_info中的所有學(xué)生信息并顯示在網(wǎng)頁上。【分析】使用PreparedStatement對象實(shí)現(xiàn)數(shù)據(jù)庫查詢,其處理步驟:(1)建立數(shù)據(jù)庫的連接。(2)形成查詢SQL語句(可以帶參數(shù),也可以不帶參數(shù)。)(3)利用連接對象建立PreparedStatement對象。(4)若是帶參數(shù)的SQL執(zhí)行語句,則需要對各參數(shù)設(shè)置相應(yīng)的參數(shù)值(若SQL語句不帶參數(shù),該步可以省)。(5)再調(diào)用PreparedStatement對象的executeQuery()方法,并返回ResultSet對象。(6)對所得到的Resu

36、ltSet對象中的各記錄依次進(jìn)行處理。(7)關(guān)閉所有資源?!驹O(shè)計(jì)關(guān)鍵】該題目要求是顯示出所有的記錄,對于查詢SQL語句不需要參數(shù),其查詢語句為:String sql=select * from stu_info 另外,對于獲得的查詢結(jié)果集ResultSet中每條記錄的處理方式,在本例中采用HTML的表格標(biāo)簽實(shí)現(xiàn)數(shù)據(jù)的顯示?!緦?shí)現(xiàn)】源代碼【運(yùn)行】 程序運(yùn)行 【例4-4】采用PreparedStatement的對象實(shí)現(xiàn)有條件的查詢操作,要求在表stu_info中,查詢出體重介于60至80之間的所有同學(xué)并在網(wǎng)頁上顯示。【分析】其處理步驟與例4-3的處理步驟一樣,這里采用帶參數(shù)的查詢SQL語句?!驹O(shè)計(jì)

37、關(guān)鍵】該例題的設(shè)計(jì)關(guān)鍵是查詢SQL語句的形成,即:String sql=select * from stu_info where weight=? and weight=60 and weight=?;另外,對于該題目,其條件是固定的,其參數(shù)值的設(shè)置是:pstmt.setFloat(1,80);【實(shí)現(xiàn)】源代碼【運(yùn)行】 程序運(yùn)行 【例4-9】對數(shù)據(jù)庫students中的數(shù)據(jù)表stu_info,刪除滿足條件(由提交頁面提供)的所有記錄。【分析】該例題要2個組件,一個是delete_stu_2_tijiao.jsp,實(shí)現(xiàn)條件的提交;第二個是delete_stu_2.jsp,刪除滿足條件的所有記錄。r

38、equest對象delete_stu_2.jspdelete_stu_2_tijiao.jsp【設(shè)計(jì)關(guān)鍵】(1)該例題需要在2個頁面之間共享信息,需要使用JSP內(nèi)置對象request實(shí)現(xiàn)共享。為了簡化設(shè)計(jì),按“姓名”、“性別”、“體重范圍段”設(shè)置查詢條件。(2)在提交頁面,提交信息可以是“空值”,表示該字段不受限制。(3)在查詢處理頁面,設(shè)置查詢參數(shù)值時,必須注意各字段的數(shù)據(jù)類型。【實(shí)現(xiàn)】 (1)delete_stu_2_tijiao.jsp,實(shí)現(xiàn)條件的提交; (2)delete_stu_2.jsp,刪除滿足條件的所有記錄【運(yùn)行】程序運(yùn)行4.3.7 數(shù)據(jù)庫操作的模板“數(shù)據(jù)庫操作的模板”代碼。實(shí)

39、現(xiàn)數(shù)據(jù)庫的添加、查詢、修改、刪除操作。由于實(shí)現(xiàn)數(shù)據(jù)庫操作,存在數(shù)據(jù)庫連接等各種異常,通常需要異常處理,其數(shù)據(jù)庫操作的通用結(jié)構(gòu)。4.3.8 整合各設(shè)計(jì)模塊形成完整的應(yīng)用系統(tǒng) 系統(tǒng)的應(yīng)用界面如圖4-10所示。頁面的左部分是操作功能菜單選項(xiàng),當(dāng)單擊某選項(xiàng)時,會相應(yīng)的執(zhí)行該選項(xiàng)的功能,圖4-10所示是選擇“按條件修改學(xué)生”后所顯示的網(wǎng)頁界面。功能模塊劃分:1.列出全部學(xué)生模塊:該功能模塊在【例4-3】中已實(shí)現(xiàn),其程序?yàn)閒ind_stu_1.jsp。2.按條件查詢學(xué)生模塊:該功能模塊在【例4-5】中已實(shí)現(xiàn),其程序?yàn)閒ind_stu_3_tijiao.jsp和find_stu_3.jsp。3新添加學(xué)生模塊

40、:該功能模塊在【例4-2】中已實(shí)現(xiàn),其程序?yàn)閕nsert_stu_2_tijiao.jsp和insert_stu_2.jsp。4按條件刪除學(xué)生模塊:該功能模塊在【例4-9】中已實(shí)現(xiàn),其程序?yàn)閐elete_stu_2_tijiao.jsp和delete_stu_2.jsp。5按條件修改學(xué)生模塊:該功能模塊在【例4-7】中已實(shí)現(xiàn),其程序?yàn)閡pdate_stu_2_tijiao.jsp、update_stu_2_edit.jsp、update_stu_2.jsp。6主頁面框架的設(shè)計(jì) 該應(yīng)用系統(tǒng)的主頁面框架如圖4-10所示,由3部分組成: 最上方的顯示標(biāo)題部分(index_title.jap), 左邊

41、的顯示操作菜單的顯示(index_stu_left.jsp), 右邊顯示運(yùn)行界面部分(index_stu_right.jsp), 另外,由這3部分組合形成主頁面的程序(index_stu.jsp)。設(shè)計(jì)過程與源代碼設(shè)計(jì)過程與源代碼運(yùn)行程序運(yùn)行程序4.4 數(shù)據(jù)源與連接池技術(shù) 使用連接池技術(shù)連接數(shù)據(jù)庫需要兩步處理:首先配置數(shù)據(jù)源,然后在程序中通過連接池建立數(shù)據(jù)庫的連接,從而再訪問數(shù)據(jù)庫。本節(jié)主要內(nèi)容:4.4.1 配置數(shù)據(jù)源4.4.2 使用連接池技術(shù)訪問數(shù)據(jù)庫處理步驟4.4.3 連接池應(yīng)用 學(xué)生身體體質(zhì)信息顯示模塊的設(shè)計(jì)與實(shí)現(xiàn)4.4.4 問題與思考4.4.1 配置數(shù)據(jù)源 在通過連接池技術(shù)訪問數(shù)據(jù)庫時

42、,首先需要Web服務(wù)器下配置數(shù)據(jù)庫連接池。 下面以MySQL數(shù)據(jù)庫為例介紹在服務(wù)器Tomcat下配置數(shù)據(jù)庫連接池的方法。1在服務(wù)器上添加在服務(wù)器上添加MySQL數(shù)據(jù)庫驅(qū)動程序數(shù)據(jù)庫驅(qū)動程序 將MySQL數(shù)據(jù)庫的驅(qū)動程序復(fù)制到Tomcat安裝路徑下的commonlib文件夾中。2數(shù)據(jù)源參數(shù)配置數(shù)據(jù)源參數(shù)配置 在Web工程目錄下的META-INFcontext.xml文件中,若在Web工程目錄下META-INF不存在context.xml文件,則需要自己建立該文件。配置數(shù)據(jù)源的具體代碼如下: 配置數(shù)據(jù)源時需要配置的元素的屬性及其說明屬性名稱說 明name設(shè)置數(shù)據(jù)源的JNDI名type設(shè)置數(shù)據(jù)源的類型auth設(shè)置數(shù)據(jù)源的管理者,有兩個可選值Container和Application,Container表示由容器來創(chuàng)建和管理數(shù)據(jù)源,Application表示由Web應(yīng)用來創(chuàng)建和管理數(shù)據(jù)源dri

溫馨提示

  • 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

提交評論