




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
JDBC2025/5/2112025/5/21《Web程序設計》21JDBC介紹2JDBC訪問數(shù)據(jù)庫3JDBC案例4相關應用技術本章課程目標知識目標掌握JDBC基本原理、主要函數(shù)及使用方法;掌握常用數(shù)據(jù)庫的連接方法及數(shù)據(jù)讀取和存儲處理過程。能力要求:能夠運用JDBC技術從數(shù)據(jù)庫中讀取和向數(shù)據(jù)寫入數(shù)據(jù);能夠針對應用需要,設計并實現(xiàn)數(shù)據(jù)訪問的方法;能夠認識不同JDBC訪問方法的局限性,選擇恰當?shù)姆椒ㄓ糜趹弥械臄?shù)據(jù)訪問。2025/5/21《Web程序設計》37.1JDBC介紹JavaDataBaseConnectivity(Java數(shù)據(jù)庫連接),是一套Java語言編寫的數(shù)據(jù)庫連接標準的JavaAPI,用于Java程序訪問數(shù)據(jù)庫數(shù)據(jù)。從本質上看,JDBC是一種規(guī)范,它提供了一套完整的數(shù)據(jù)庫訪問接口,這些接口對程序員而言,可以無需了解具體實現(xiàn)細節(jié)即可訪問業(yè)務數(shù)據(jù)庫。2025/5/21《Web程序設計》4JDBC結構JDBCAPI支持兩層和三層處理模型進行數(shù)據(jù)庫訪問,但一般的JDBC體系結構由兩層組成:JDBCAPI:提供了應用程序對JDBC的管理連接。JDBCDriverAPI:支持JDBC管理到驅動器連接。2025/5/21《Web程序設計》5驅動程序管理器(DriverManager)JDBCAPI的使用驅動程序管理器和數(shù)據(jù)庫特定的驅動程序提供透明的連接到異構數(shù)據(jù)庫。JDBC驅動程序管理器可確保正確的驅動程序來訪問每個數(shù)據(jù)源。該驅動程序管理器能夠支持連接到多個異構數(shù)據(jù)庫的多個并發(fā)的驅動程序。數(shù)據(jù)庫廠商要支持JDBC,必須在JDBC規(guī)范下,實現(xiàn)其中規(guī)定的接口API,使用自己的方式實現(xiàn)這些數(shù)據(jù)查詢/操作接口,返回數(shù)據(jù)。這種具體的實現(xiàn)就稱為廠商的JDBC驅動程序。2025/5/21《Web程序設計》6JDBCAPI主要組件(1)Driver接口Driver接口由數(shù)據(jù)庫廠家提供,對于Java應用開發(fā)人員,只需要使用Driver接口進行驅動的實例化。在編程中要連接數(shù)據(jù)庫,必須先裝載特定廠商的數(shù)據(jù)庫驅動程序,不同的數(shù)據(jù)庫有不同的裝載方法。驅動器的主類完整名稱是要使用的數(shù)據(jù)庫廠商驅動程序主類名稱。2025/5/21《Web程序設計》7class.forName(“驅動器的主類完整名稱”);class.forName(“com.mysql.jdbc.Driver”)動態(tài)實例化方法無需import該類JDBCAPI主要組件(2)DriverManager接口這個類管理數(shù)據(jù)庫驅動程序的列表。根據(jù)所提供的數(shù)據(jù)庫連接協(xié)議URL以及初始化參數(shù),建立與數(shù)據(jù)庫的連接,該方法如果操作成功,則返回Connection接口的一個實例,表明成功地建立了與指定數(shù)據(jù)庫的連接。url:與數(shù)據(jù)庫連接的URL,包含訪問協(xié)議、數(shù)據(jù)庫服務的地址與端口、連接參數(shù)等信息;username:用于數(shù)據(jù)庫訪問的用戶名稱;password:用于數(shù)據(jù)庫訪問的密碼。2025/5/21《Web程序設計》8ConnectionDriverManager.getConnection(Stringurl,Stringusername,Stringpassword);URL協(xié)議示例2025/5/21《Web程序設計》92025/5/21《Web程序設計》101JDBC介紹2JDBC訪問數(shù)據(jù)庫3JDBC案例4相關應用技術訪問過程加載JDBC驅動程序創(chuàng)建數(shù)據(jù)庫的連接創(chuàng)建語句執(zhí)行對象執(zhí)行SQL語句訪問結果集關閉連接資源2025/5/21《Web程序設計》11(1)加載JDBC驅動程序在連接數(shù)據(jù)庫之前,首先要加載數(shù)據(jù)庫驅動到JVM中,主要通過java.lang.Class類的靜態(tài)方法forName()實現(xiàn)。2025/5/21《Web程序設計》12try{//加載MySql的驅動類Class.forName("com.mysql.jdbc.Driver");//后續(xù)操作
}catch(ClassNotFoundExceptione){System.out.println("找不到驅動程序類,加載驅動失敗!");e.printStackTrace();}(2)創(chuàng)建數(shù)據(jù)庫的連接成功加載JDBC驅動程序后,需要向java.sql.DriverManager請求并獲得Connection對象,該對象就代表一個數(shù)據(jù)庫的連接。2025/5/21《Web程序設計》13Stringurl="jdbc:mysql://localhost:3306/testdb";Stringusername="user";Stringpassword="user666";try{Connectioncon=DriverManager.getConnection(url,username,password);}catch(SQLExceptionex){System.out.println("數(shù)據(jù)庫連接失??!");ex.printStackTrace();}(3)創(chuàng)建語句執(zhí)行對象數(shù)據(jù)庫連接成功后,需要先創(chuàng)建一個Statement對象或其子類PreparedStatement、CallableStatement,用于執(zhí)行SQL語句。Statement類的對象是用于執(zhí)行靜態(tài)SQL語句,PreparedStatement類的對象用于執(zhí)行動態(tài)SQL語句,CallableStatement類的對象主要用于執(zhí)行存儲過程語句。2025/5/21《Web程序設計》14Connectioncon=DriverManager.getConnection(url,username,password);Statementstmt=conn.createStatement();(4)執(zhí)行SQL語句執(zhí)行SQL語句主要是通過Statement對象的方法executeQuery()和executeUpdate(),這兩個方法分別用于執(zhí)行查詢和更新語句。executeQuery(),用于執(zhí)行select的數(shù)據(jù)查詢SQL語句executeUpdate(),用于執(zhí)行insert/update/delete等SQL語句2025/5/21《Web程序設計》15Connectioncon=DriverManager.getConnection(url,username,password);Statementstmt=conn.createStatement();Stringsql=“select*fromt_orderorderbyiddesc”;ResultSetrs=stmt.executeQuery(sql);(5)訪問結果集對于數(shù)據(jù)查詢的結果集,需要通過遍歷的方法,訪問返回的數(shù)據(jù)。遍歷主要通過rs.next()方法,判斷結果集是否有數(shù)據(jù)并繼續(xù)向下移動,訪問下一行數(shù)據(jù)。2025/5/21《Web程序設計》16ResultSetrs=stmt.executeQuery(sql);while(rs.next()){System.out.println(“id:”+rs.getInt(“order_id”));System.out.println(“address:”+rs.getString(“address”));System.out.println(“createTime:”+rs.getDate(“create_time”));...}(6)關閉連接資源數(shù)據(jù)查詢/更新操作完成以后,要把所有使用的JDBC對象都關閉,以釋放JDBC資源。關閉的順序和創(chuàng)建順序相反:先關閉ResultSet,再是Statement對象,最后是Connection對象。2025/5/21《Web程序設計》17if(rs!=null){//關閉記錄集對象rs.close();}if(stmt!=null){//關閉語句執(zhí)行對象stmt.close();}if(conn!=null){//關閉連接對象conn.close();}Connection接口Connection是一個接口,用于創(chuàng)建與特定數(shù)據(jù)庫的連接(會話),連接成功后可在會話中訪問和操作數(shù)據(jù)表。Connection對象的常用方法是創(chuàng)建Statement類的對象,主要有三個方法,createStatement()、prepareStatement()與prepareCall(),分別創(chuàng)建Statement、PreparedStatement、CallableStatement的對象,用于SQL語句的執(zhí)行。2025/5/21《Web程序設計》18Statement接口Statement是JDBC用于執(zhí)行SQL語句并返回它所生成結果的對象。Statement本質上是一個接口,由各個數(shù)據(jù)庫廠商負責具體的實現(xiàn)??紤]到不同的用途,Statement又額外有兩個子接口:PreparedStatement和CallableStatement,分別負責執(zhí)行動態(tài)SQL語句和存儲過程語句。2025/5/21《Web程序設計》19Statement接口Statement接口專門用于執(zhí)行靜態(tài)的SQL語句,即該語句在執(zhí)行前已確定SQL語句,沒有動態(tài)參數(shù)需要傳入。2025/5/21《Web程序設計》20方法說明voidaddBatch(Stringsql)將給定的SQL命令添加到此Statement對象的當前命令列表中。voidclearBatch()清空此Statement對象的當前SQL命令列表。voidclose()立即釋放此Statement對象的數(shù)據(jù)庫和JDBC資源,而不是等待該對象自動關閉時發(fā)生此操作。booleanexecute(Stringsql)執(zhí)行給定的SQL語句,該語句可能返回多個結果。booleanexecute(Stringsql,intautoGeneratedKeys)執(zhí)行給定的SQL語句(該語句可能返回多個結果),并通知驅動程序所有自動生成的鍵都應該可用于檢索。int[]executeBatch()將一批命令提交給數(shù)據(jù)庫來執(zhí)行,如果全部命令執(zhí)行成功,則返回更新計數(shù)組成的數(shù)組。ResultSetexecuteQuery(Stringsql)執(zhí)行給定的SQL語句,該語句返回單個ResultSet對象。intexecuteUpdate(Stringsql)執(zhí)行給定SQL語句,該語句可能為INSERT、UPDATE或DELETE語句,或者不返回任何內容的SQL語句(如SQLDDL語句)。voidsetQueryTimeout(intseconds)將驅動程序等待Statement對象執(zhí)行的秒數(shù)設置為給定秒數(shù)。同一時間每個Statement對象在只能打開一個ResultSet對象。因此,如果讀取一個ResultSet對象與讀取另一個交叉,則這兩個對象必須是由不同的Statement對象生成的。如果存在某個語句的打開的當前ResultSet對象,則Statement接口中的所有執(zhí)行方法都會隱式關閉它。2025/5/21《Web程序設計》21PreparedStatement接口PreparedStatement表示預編譯的SQL語句對象,支持動態(tài)SQL語句執(zhí)行,即SQL語句中的某些數(shù)據(jù)可以在執(zhí)行時通過參數(shù)動態(tài)的傳入。PreparedStatement接口的實例化是通過connection對象的prepareStatement(sql)方法來實現(xiàn)的,其中sql為要執(zhí)行的參數(shù)化SQL語句,其中的參數(shù)可用“?”表示,支持多個參數(shù),通過PreparedStatement對象的setXXX(i,value)方法設置,“XXX”表示該參數(shù)的數(shù)據(jù)類型,這個數(shù)據(jù)類型必須與該字段數(shù)據(jù)庫的數(shù)據(jù)類型一致。2025/5/21《Web程序設計》22示例2025/5/21《Web程序設計》23try{Stringsql=“insertintot_order(user_id,count,total,address)values(?,?,?,?)”;PreparedStatementpstmt=conn.prepareStatement(sql);//obj對象為傳入的訂單對象,已為每個屬性賦了相應的值
pstmt.setInt(1,obj.getUserId());//用戶id(int)pstmt.setInt(2,obj.getCount());//訂單物品數(shù)量(int)pstmt.setFloat(3,obj.getTotal());//訂單總金額(float)pstmt.setString(4,obj.getAddress());//地址(varchar)intresult=pstmt.executeUpdate();if(result>0){//如果插入成功
}}PreparedStatement的主要方法方法描述ResultSetexecuteQuery()在此PreparedStatement對象中執(zhí)行SQL查詢,并返回該查詢生成的ResultSet對象。intexecuteUpdate()在此PreparedStatement對象中執(zhí)行SQL語句,該語句必須是一個SQLINSERT、UPDATE或DELETE語句;或者是一個什么都不返回的SQL語句,比如DDL語句。voidsetBlob(inti,Blobx)將指定參數(shù)設置為給定Blob對象。voidsetBoolean(intparameterIndex,booleanx)將指定參數(shù)設置為給定Javaboolean值。voidsetDate(intparameterIndex,Datex,Calendarcal)使用給定的Calendar對象將指定參數(shù)設置為給定java.sql.Date值。voidsetDouble(intparameterIndex,doublex)將指定參數(shù)設置為給定Javadouble值。voidsetFloat(intparameterIndex,floatx)將指定參數(shù)設置為給定Javafloat值。voidsetInt(intparameterIndex,intx)將指定參數(shù)設置為給定Javaint值。voidsetLong(intparameterIndex,longx)將指定參數(shù)設置為給定Javalong值。voidsetShort(intparameterIndex,shortx)將指定參數(shù)設置為給定Javashort值。voidsetString(intparameterIndex,Stringx)將指定參數(shù)設置為給定JavaString值。voidsetTimestamp(intparameterIndex,Timestampx)將指定參數(shù)設置為給定java.sql.Timestamp值。2025/5/21《Web程序設計》24相比于Statement,PreparedStatement具有以下優(yōu)勢:代碼的可讀性和可維護性比Statement高。能最大可能提高性能。因為預編譯語句有可能被重復調用,所以語句在被DBServer的編譯器編譯后的執(zhí)行代碼被緩存下來,下次調用時只要是相同的預編譯語句就不需要編譯,只要將參數(shù)直接傳入編譯過的語句執(zhí)行代碼中就會得到執(zhí)行。能保證安全性,可以避免使用Statement時存在的sql注入等安全問題。2025/5/21《Web程序設計》25CallableStatement接口CallableStatement接口是專門用于訪問數(shù)據(jù)庫中的存儲過程而設置的,通過創(chuàng)建該對象,傳入存儲過程的名稱與所需參數(shù),即可調用數(shù)據(jù)庫中預先定義好的存儲過程。如果使用結果參數(shù),則必須將其注冊為OUT型參數(shù)。其他參數(shù)可用于輸入、輸出或同時用于二者。參數(shù)是根據(jù)編號按順序引用的,順序號從1開始。CallableStatement接口繼承了PreparedStatement接口中的方法,也包括從Statement接口中繼承的方法。2025/5/21《Web程序設計》26CallableStatement的主要方法方法描述Blob getBlob(inti)Blob getBlob(StringparameterName)以Blob對象的形式檢索JDBCBLOB參數(shù)的值。booleangetBoolean(intparameterIndex)booleangetBoolean(StringparameterName)以boolean值的形式檢索指定的JDBCBIT參數(shù)的值。byte[]getBytes(intparameterIndex)byte[]getBytes(StringparameterName)以byte數(shù)組值的形式檢索指定的JDBCBINARY或VARBINARY參數(shù)的值。Date getDate(intparameterIndex)DategetDate(intparameterIndex,Calendarcal)以java.sql.Date對象的形式檢索指定JDBCDATE參數(shù)的值。double getDouble(intparameterIndex)doublegetDouble(StringparameterName)以double值的形式檢索指定的JDBCDOUBLE參數(shù)的值。float getFloat(intparameterIndex)floatgetFloat(StringparameterName)以float值的形式檢索指定的JDBCFLOAT參數(shù)的值。int getInt(intparameterIndex)intgetInt(StringparameterName)以int值的形式檢索指定的JDBCINTEGER參數(shù)的值。long getLong(intparameterIndex)longgetLong(StringparameterName)以long值的形式檢索指定的JDBCBIGINT參數(shù)的值。StringgetString(intparameterIndex)StringgetString(StringparameterName)以String的形式檢索指定的JDBCCHAR、VARCHAR或LONGVARCHAR參數(shù)的值。void registerOutParameter(intparameterIndex,intsqlType)按順序位置parameterIndex將OUT參數(shù)注冊為JDBC類型sqlType。sqlType為枚舉型java.sql.Types。2025/5/21《Web程序設計》27示例2025/5/21《Web程序設計》28//示例代碼片段,conn為已建立的數(shù)據(jù)庫連接對象Stringsql=“{callsp_getBookNameById(?,?)}”;CallableStatementcstmt=conn.prepareCall(sql);//圖書id為傳入的int數(shù)據(jù)cstmt.setInt(1,id);//圖書名稱為out參數(shù)cstmt.registerOutParameter(2,java.sql.Types.VARCHAR);cstmt.execute();//按參數(shù)名稱獲取執(zhí)行結果StringbookName=cstmt.getString(“bookName”);ResultSetResultSet接口表示數(shù)據(jù)庫結果集,通過執(zhí)行查詢數(shù)據(jù)庫的SQL語句生成。ResultSet對象具有指向其當前數(shù)據(jù)行的指針。最初,指針被置于第一行之前。next()方法將指針移動到下一行;因為該方法在ResultSet對象中沒有下一行時返回false,因此可以在while循環(huán)中使用它來迭代結果集。2025/5/21《Web程序設計》29示例ResultSet的典型遍歷代碼如下2025/5/21《Web程序設計》30//假設Statement對象stmt已成功創(chuàng)建try{Stringsql=“select*fromt_order”;rs=stmt.executeQuery(sql);while(rs.next()){//循環(huán)處理rs中的每一行記錄
}...}catch()ResultSet的常用遍歷方法方法說明boolean absolute(introw)將指針移動到此ResultSet對象的給定行編號。void afterLast()指針移動到此ResultSet對象的末尾,正好位于最后一行之后。void beforeFirst()將指針移動到此ResultSet對象的開頭,正好位于第一行之前。boolean first()將指針移動到此ResultSet對象的第一行。boolean last()將指針移動到此ResultSet對象的最后一行。boolean next()將指針從當前位置下移一行。boolean previous()將指針移動到此ResultSet對象的上一行。boolean relative(introws)按相對行數(shù)(或正或負)移動指針。2025/5/21《Web程序設計》31ResultSet數(shù)據(jù)檢索值說明Blob getBlob(inti)BlobgetBlob(StringcolumnName)以Blob對象的形式檢索此ResultSet對象的當前行中指定列的值。boolean getBoolean(inti)boolean getBoolean(StringcolumnName)以boolean的形式檢索此ResultSet對象的當前行中指定列的值。Date getDate(inti)Date getDate(StringcolumnName)以java.sql.Date對象的形式檢索此ResultSet對象的當前行中指定列的值。doublegetDouble(inti)doublegetDouble(StringcolumnName)以double類型檢索此ResultSet對象的當前行中指定列的值。floatgetFloat(inti)float getFloat(StringcolumnName)以float類型檢索此ResultSet對象的當前行中指定列的值。intgetInt(inti)intgetInt(StringcolumnName)以int類型檢索此ResultSet對象的當前行中指定列的值。longgetLong(inti)long getLong(StringcolumnName)以long類型檢索此ResultSet對象的當前行中指定列的值。Object getObject(StringcolumnName)以Object類型獲取此ResultSet對象的當前行中指定列的值。short getShort(StringcolumnName)以short類型檢索此ResultSet對象的當前行中指定列的值。ResultSetMetaData getMetaData()檢索此ResultSet對象的元數(shù)據(jù),例如列的編號、類型和屬性等。2025/5/21《Web程序設計》32ResultSet
getXXX()示例2025/5/21《Web程序設計》33//假設Statement對象stmt已成功創(chuàng)建intorderId;Stringaddress;floattotal;try{Stringsql=“select*fromt_order”;rs=stmt.executeQuery(sql);while(rs.next()){//通過getXXX方法讀取相應字段的值orderId=rs.getInt(“order_id”);address=rs.getString(“address”);total=rs.getFloat(“total”);
}2025/5/21《Web程序設計》341JDBC介紹2JDBC訪問數(shù)據(jù)庫3JDBC案例4相關應用技術假設MySql數(shù)據(jù)庫book_db中有一個圖書表(t_book),主要存儲網(wǎng)上商城中的圖書基本信息2025/5/21《Web程序設計》35字段名含義數(shù)據(jù)類型備注idIDint自增長IDbook_name圖書名稱varchar(200)
book_type圖書類型int外鍵,參照t_book_type表note圖書介紹varchar(1000)
price圖書價格float
publisher出版社varchar(200)
publish_date出版日期Date
isbnISBN號varchar(20)
2025/5/21《Web程序設計》36(1)查詢展示圖書該模塊的主要功能為根據(jù)輸入的字段查詢圖書資料信息,將結果以表格的形式展現(xiàn)在頁面上。查詢展示數(shù)據(jù)的操作流程如下:點擊“圖書查詢”頁面,進入到該頁面,顯示所有圖書列表信息;輸入某個查詢字符,如出版社、ISBN,點擊查詢;從數(shù)據(jù)表中查詢與該查詢字段匹配的圖書記錄,顯示在頁面上的表格中;2025/5/21《Web程序設計》372025/5/21《Web程序設計》38<divid="location">當前位置:圖書模塊》查詢圖書信息</div><divid="queryArea"><formname="frmMain"action="book_list.jsp"method="post"><span>圖書ISBN:<inputtype="text"name="pisdn"value="<%=pCode%>"></span><span>出版社:<inputtype="text"name="ppublisher"value="<%=pPublisher%>"></span><span><inputtype="submit"value="查詢"><inputtype="reset"value="清空"></span></form></div>//建立數(shù)據(jù)庫連接Connectionconn=DriverManager.getConnection(url,"user","user123");//動態(tài)組裝SQL語句//“1=1”是為了方便后面查詢條件的組合Stringsql="select*fromt_bookwhere1=1";if(pCode!=null&&!"".equals(pCode))sql+="andisbn=?";if(pPublisher!=null&&!"".equals(pPublisher))sql+="andpublisher=?";//采用PreparedStatement對象PreparedStatementpstmt=conn.prepareStatement(sql);intparamIndex=0;//根據(jù)參數(shù)的實際值確定參數(shù)的序號if(pCode!=null&&!"".equals(pCode)){paramIndex++;pstmt.setString(paramIndex,pCode);}if(pPublisher!=null&&!"".equals(pPublisher)){paramIndex++;pstmt.setString(paramIndex,pPublisher);}<%while(rs.next()){//循環(huán)遍歷結果集,以表格行的形式展示結果%><tr><td><%=rs.getString("isbn")%></td><td><%=rs.getString("book_name")%></td><td><%=rs.getString("publisher")%></td><td><%=rs.getDate("publish_Date")%></td><td><%=rs.getFloat("price")%></td><td><%=rs.getString("note")%></td><td><ahref="book_edit.jsp?id=<%=rs.getInt("id")%>">修改</a><ahref="book_delete.jsp?id=<%=rs.getString("id")%>">刪除</a></td></tr><%}rs.close();stmt.close();conn.close();%>(2)添加圖書該模塊的主要功能需求為將用戶輸入的圖書信息提交至數(shù)據(jù)庫t_book表中。主要的操作流程如下:在圖書列表頁面(book_list.jsp)中,點擊“添加圖書”鏈接,跳轉至圖書添加頁面(book_add.jsp);提供圖書信息表單,包含了圖書信息的各個字段,等待用戶填寫;填寫完成后,點擊“保存”按鈕,將圖書信息提交到保存頁面(book_add_do.jsp);圖書保存頁面(book_add_do.jsp)首先讀取提交的表單信息,進行基本業(yè)務規(guī)則的判斷,不符合則返回至添加頁面(book_add.jsp);數(shù)據(jù)符合業(yè)務規(guī)則后,進行數(shù)據(jù)庫連接,組裝數(shù)據(jù)插入語句,執(zhí)行SQL語句;操作成功則返回至圖書列表頁面(book_list.jsp),不成功則返回圖書添加頁面(book_add.jsp)。2025/5/21《Web程序設計》39book_add.jsp2025/5/21《Web程序設計》40<formname="frmMain"action="book_add_do.jsp"method="post"><tablewidth="600"border="0"><caption><h2>填寫圖書信息</h2></caption><tr><td>圖書編號:</td><td><inputtype="text"name="isbn_code"placeholder="ISBN"></td></tr><tr><td>圖書名稱:</td><td><inputtype="text"name="book_name"></td></tr><tr><td>出版社:</td><td><inputtype="text"name="publisher"></td></tr><tr><td>出版日期:</td><td><inputtype="text"name="publish_date"placeholder="格式:yyyy-mm-dd"></td></tr><tr><td>單價:</td><td><inputtype="text"name="price"placeholder="最多兩位
小數(shù)"></td></tr><tr><td>圖書簡介:</td><td><textareaname="note"cols="80"rows="10"></textarea></td></tr><tr><td></td><td><inputtype="submit"value="保存"><inputtype="reset"value="重置信息"></td></tr></table></form>book_add_do.jsp2025/5/21《Web程序設計》41//獲取表單提交的數(shù)據(jù)項,StringUtil.toCN為自定義的中文字符處理函數(shù)Stringisbn=request.getParameter("isbn");StringbookName=StringUtil.toCN(request.getParameter("book_name"));Stringprice=request.getParameter("price");Stringnote=StringUtil.toCN(request.getParameter("note"));Stringpublisher=StringUtil.toCN(request.getParameter("publisher"));StringpublishDate=request.getParameter("publish_date");]//判斷字段值是否符合業(yè)務規(guī)則if(isbn==null||"".equals(isbn.trim())//如果isbn為空
或者bookName為空||bookName==null||"".equals(bookName.trim())){%><scripttype="text/javascript">window.alert("isbn號或圖書名稱不能為空!");history.back(-1);</script><%}//endforif%>book_add_do.jsp2025/5/21《Web程序設計》42Stringsql="insertintot_book(isbn,book_name,price,note,publisher,publishDate)values(?,?,?,?,?,?)";SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");//連接數(shù)據(jù)庫Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/book_db";Connectionconn=DriverManager.getConnection(url,"user","user123");PreparedStatementpstmt=conn.prepareStatement(sql);//設置參數(shù)pstmt.setString(1,isbn);pstmt.setString(2,bookName);pstmt.setFloat(3,Float.parseFloat(price));pstmt.setString(4,note);pstmt.setString(5,publisher);pstmt.setDate(6,sdf.format(publish_date));intret=pstmt.executeUpdate();//獲取插入語句的影響記錄數(shù)if(ret>0){//插入成功}(3)修改圖書該模塊的主要功能需求為將用戶填寫的圖書信息修改提交至數(shù)據(jù)庫t_book表中。主要的操作流程如下:在圖書列表頁面(book_list.jsp)中,選擇要修改的圖書,點擊該行的“修改”鏈接,跳轉至圖書修改頁面(book_edit.jsp);從數(shù)據(jù)庫中獲取要修改的圖書信息,顯示到圖書修改頁面上(book_edit.jsp)的表單字段項中,讀取要修改的圖書信息,用戶可根據(jù)需要修改其中的字段項;修改完成后,點擊“保存”按鈕,將圖書信息提交到修改保存頁面(book_edit_do.jsp);圖書修改保存頁面(book_edit_do.jsp)首先讀取提交的表單信息,進行基本業(yè)務規(guī)則的判斷,不符合則返回至修改頁面(book_edit.jsp);數(shù)據(jù)符合業(yè)務規(guī)則后,進行數(shù)據(jù)庫連接,組裝數(shù)據(jù)更新語句,執(zhí)行SQL語句;操作成功則返回至圖書列表頁面(book_list.jsp),不成功則返回圖書修改頁面(book_edit.jsp)。2025/5/21《Web程序設計》43book_edit.jsp2025/5/21《Web程序設計》44//獲取參數(shù)Stringid=request.getParameter("id");Stringisbn="",bookName="",publisher="",publishDate="",note="";//建立連接Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/book_db";Connectionconn=DriverManager.getConnection(url,"user","user123");Stringsql="select*fromt_bookwhereid=?";PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setInt(1,Integer.parseInt(id));ResultSetrs=pstmt.executeQuery();//獲取數(shù)據(jù)if(rs.next()){bookName=rs.getString("book_name");publisher=rs.getString("publisher");publishDate=rs.getString("publish_date");price=rs.getFloat("price");note=rs.getString("note");}<formname="frmMain"action="book_edit_do.jsp"method="post"><tablewidth="600"border="0"><caption><h2>填寫圖書信息</h2></caption><tr><td>圖書ISBN:</td><td><inputtype="text"name="isbn"value="<%=isbn%>"></td></tr><tr><td>圖書名稱:</td><td><inputtype="text"name="book_name"value="<%=bookName%>"></td></tr><tr><td>出版社:</td><td><inputtype="text"name="publisher"value="<%=publisher%>"></td></tr><tr><td>出版日期:</td><td><inputtype="text"name="publish_date"placeholder="yyyy-mm-dd"value="<%=publishDate%>"></td></tr><tr><td>單價:</td><td><inputtype="text"name="price" placeholder="最多兩位小數(shù)"value="<%=price%>"></td></tr><tr><td>圖書簡介:</td><td><textareaname="note"cols="80"rows="10"> <%=note%></textarea></td></tr><tr><td><inputtype="hidden"name="id"value="<%=id%>"></td><td><inputtype="submit"value="保存"><inputtype="reset"value="重置"></td></tr></table>book_edit_do.jsp2025/5/21《Web程序設計》45Stringsql="updatet_booksetisbn=?,book_name=?,publisher=?,publish_date=?,price=?,note=?whereid=?";//更新到數(shù)據(jù)庫Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/book_db";Connectionconn=DriverManager.getConnection(url,"user","user123");PreparedStatementpstmt=conn.prepareStatement(sql);//設置參數(shù)值pstmt.setString(1,isbn);pstmt.setString(2,bookName);pstmt.setString(3,publisher);pstmt.setString(4,publishDate);pstmt.setFloat(5,Float.parseFloat(price));pstmt.setString(6,note);pstmt.setInt(7,Integer.parseInt(id));intret=pstmt.executeUpdate();(4)刪除圖書該模塊的主要功能為根據(jù)用戶選擇的要刪除圖書信息,從數(shù)據(jù)庫中直接刪除該記錄。具體的操作流程如下:在圖書列表頁面,選擇要刪除的圖書信息,點擊“刪除”鏈接;跳轉至圖書刪除頁面(book_delete.jsp),獲取圖書id;根據(jù)圖書id,組裝刪除圖書的SQL語句,執(zhí)行語句進行刪除;2025/5/21《Web程序設計》46book_delete.jsp2025/5/21《Web程序設計》47Stringid=request.getParameter("id");Stringsql="deletefromt_bookwhereid=?";//建立數(shù)據(jù)庫連接Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/book_db";Connectionconn=DriverManager.getConnection(url,"user","user123");PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setInt(1,Integer.parseInt(id));intret=pstmt.executeUpdate();if(ret>0){//刪除成功%><scripttype="text/javascript">window.alert("刪除圖書信息成功!");location.href='book_list.jsp';</script>(5)關鍵字模糊查詢關鍵字模糊查詢是業(yè)務系統(tǒng)中一種典型的應用,操作中為用戶提供極大的便利,用戶只需要輸入某個關鍵字,后臺實現(xiàn)時,會在數(shù)據(jù)庫表的某個字段或某幾個字段中搜索包含該關鍵字的記錄,展現(xiàn)給用戶匹配的結果。本質上這種功能實現(xiàn)主要依賴于SQL語句中的模糊查詢,即通過SQL語句中的like語句,配合“?”或“%”通配符,實現(xiàn)模糊查詢。代碼實現(xiàn)時主要體現(xiàn)在SQL語句中相應位置添加like語句及通配符,以及相應參數(shù)的傳入。2025/5/21《Web程序設計》482025/5/21《Web程序設計》49Stringsql="select*fromt_bookwhere1=1";if(pKeyword!=null&&!"".equals(pKeyword)){//從兩個字段中匹配sql+="and(book_namelike?ornotelike?)";}if(pCode!=null&&!"".equals(pCode))sql+="andisbn=?";if(pPublisher!=null&&!"".equals(pPublisher))sql+="andpublisher=?";PreparedStatementpstmt=conn.prepareStatement(sql);intparamIndex=0;if(pKeyword!=null&&!"".equals(pKeyword)){pKeyword="%"+pKeyword+"%";//兩端加上通配符paramIndex++;pstmt.setString(paramIndex,pKeyword);paramIndex++;//重復執(zhí)行兩遍,因為是從兩個字段中查找pstmt.setString(paramIndex,pKeyword);}if(pCode!=null&&!"".equals(pCode)){paramIndex++;pstmt.setString(paramIndex,pCode);}2025/5/21《Web程序設計》501JDBC介紹2JDBC訪問數(shù)據(jù)庫3JDBC案例4相關應用技術數(shù)據(jù)分頁瀏覽數(shù)據(jù)分頁瀏覽,是一種將所有業(yè)務數(shù)據(jù)分成多頁、每頁固定大小的方式展示給用戶。用戶在選擇查瀏覽的數(shù)據(jù)后,根據(jù)設置的頁大小以及當前的頁數(shù),瀏覽該頁的數(shù)據(jù)。用戶每次看到的不是全部數(shù)據(jù),而是其中的一部分,如果該頁中沒有找到想要的內容,可以通過前后翻頁或是指定頁碼的方式切換到不同的頁面,瀏覽該頁的數(shù)據(jù)。2025/5/21《Web程序設計》512025/5/21《Web程序設計》52分頁原理在JSP中實現(xiàn)查詢數(shù)據(jù)的分頁瀏覽,需要先定義幾個參數(shù):page_size:每頁記錄數(shù)的大小,通常為10,20等常數(shù)cur_page:當前第幾頁,表明當前請求的是第幾頁數(shù)據(jù),默認為1total_co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財務管理背景下的綜合能力測評試題及答案
- 2025至2030年中國印染裝飾布市場分析及競爭策略研究報告
- 2025年鋼筋接頭機械行業(yè)深度研究報告
- 靈活應對2025年工程法規(guī)考試難點試題及答案
- 護理安全教育事件標準化管理
- 回顧中國近現(xiàn)代史的重要改革試題及答案
- 2025年工程法規(guī)考試復習中的總結與思考試題及答案
- 公司用房分割協(xié)議書
- 單位職工安全協(xié)議書
- 2025年財務管理考試復習需知及試題與答案
- 大學文化主題辯論賽巔峰對決辯論辯答ppt模板
- 廣東旅游車隊公司一覽
- ESD標準培訓資料ppt課件
- 河南省確山縣三里河治理工程
- 水利工程合同工程完工驗收工程建設管理工作報告
- 多級泵檢修及維護(1)
- 涵洞孔徑計算
- 測量未知電阻的方法
- 中國民主同盟入盟申請表
- 觀感質量檢查表
- 電子公章模板
評論
0/150
提交評論