




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章JDBC主講人:2025/2/612025/2/6《Web程序設計》21JDBC介紹2JDBC訪問數據庫3JDBC案例4相關應用技術本章課程目標知識目標掌握JDBC基本原理、主要函數及使用方法;掌握常用數據庫的連接方法及數據讀取和存儲處理過程。能力要求:能夠運用JDBC技術從數據庫中讀取和向數據寫入數據;能夠針對應用需要,設計并實現數據訪問的方法;能夠認識不同JDBC訪問方法的局限性,選擇恰當的方法用于應用中的數據訪問。2025/2/6《Web程序設計》37.1JDBC介紹JavaDataBaseConnectivity(Java數據庫連接),是一套Java語言編寫的數據庫連接標準的JavaAPI,用于Java程序訪問數據庫數據。從本質上看,JDBC是一種規范,它提供了一套完整的數據庫訪問接口,這些接口對程序員而言,可以無需了解具體實現細節即可訪問業務數據庫。2025/2/6《Web程序設計》4JDBC結構JDBCAPI支持兩層和三層處理模型進行數據庫訪問,但一般的JDBC體系結構由兩層組成:JDBCAPI:提供了應用程序對JDBC的管理連接。JDBCDriverAPI:支持JDBC管理到驅動器連接。2025/2/6《Web程序設計》5驅動程序管理器(DriverManager)JDBCAPI的使用驅動程序管理器和數據庫特定的驅動程序提供透明的連接到異構數據庫。JDBC驅動程序管理器可確保正確的驅動程序來訪問每個數據源。該驅動程序管理器能夠支持連接到多個異構數據庫的多個并發的驅動程序。數據庫廠商要支持JDBC,必須在JDBC規范下,實現其中規定的接口API,使用自己的方式實現這些數據查詢/操作接口,返回數據。這種具體的實現就稱為廠商的JDBC驅動程序。2025/2/6《Web程序設計》6JDBCAPI主要組件(1)Driver接口Driver接口由數據庫廠家提供,對于Java應用開發人員,只需要使用Driver接口進行驅動的實例化。在編程中要連接數據庫,必須先裝載特定廠商的數據庫驅動程序,不同的數據庫有不同的裝載方法。驅動器的主類完整名稱是要使用的數據庫廠商驅動程序主類名稱。2025/2/6《Web程序設計》7class.forName(“驅動器的主類完整名稱”);class.forName(“com.mysql.jdbc.Driver”)動態實例化方法無需import該類JDBCAPI主要組件(2)DriverManager接口這個類管理數據庫驅動程序的列表。根據所提供的數據庫連接協議URL以及初始化參數,建立與數據庫的連接,該方法如果操作成功,則返回Connection接口的一個實例,表明成功地建立了與指定數據庫的連接。url:與數據庫連接的URL,包含訪問協議、數據庫服務的地址與端口、連接參數等信息;username:用于數據庫訪問的用戶名稱;password:用于數據庫訪問的密碼。2025/2/6《Web程序設計》8ConnectionDriverManager.getConnection(Stringurl,Stringusername,Stringpassword);URL協議示例2025/2/6《Web程序設計》92025/2/6《Web程序設計》101JDBC介紹2JDBC訪問數據庫3JDBC案例4相關應用技術訪問過程加載JDBC驅動程序創建數據庫的連接創建語句執行對象執行SQL語句訪問結果集關閉連接資源2025/2/6《Web程序設計》11(1)加載JDBC驅動程序在連接數據庫之前,首先要加載數據庫驅動到JVM中,主要通過java.lang.Class類的靜態方法forName()實現。2025/2/6《Web程序設計》12try{//加載MySql的驅動類Class.forName("com.mysql.jdbc.Driver");//后續操作
}catch(ClassNotFoundExceptione){System.out.println("找不到驅動程序類,加載驅動失敗!");e.printStackTrace();}(2)創建數據庫的連接成功加載JDBC驅動程序后,需要向java.sql.DriverManager請求并獲得Connection對象,該對象就代表一個數據庫的連接。2025/2/6《Web程序設計》13Stringurl="jdbc:mysql://localhost:3306/testdb";Stringusername="user";Stringpassword="user666";try{Connectioncon=DriverManager.getConnection(url,username,password);}catch(SQLExceptionex){System.out.println("數據庫連接失敗!");ex.printStackTrace();}(3)創建語句執行對象數據庫連接成功后,需要先創建一個Statement對象或其子類PreparedStatement、CallableStatement,用于執行SQL語句。Statement類的對象是用于執行靜態SQL語句,PreparedStatement類的對象用于執行動態SQL語句,CallableStatement類的對象主要用于執行存儲過程語句。2025/2/6《Web程序設計》14Connectioncon=DriverManager.getConnection(url,username,password);Statementstmt=conn.createStatement();(4)執行SQL語句執行SQL語句主要是通過Statement對象的方法executeQuery()和executeUpdate(),這兩個方法分別用于執行查詢和更新語句。executeQuery(),用于執行select的數據查詢SQL語句executeUpdate(),用于執行insert/update/delete等SQL語句2025/2/6《Web程序設計》15Connectioncon=DriverManager.getConnection(url,username,password);Statementstmt=conn.createStatement();Stringsql=“select*fromt_orderorderbyiddesc”;ResultSetrs=stmt.executeQuery(sql);(5)訪問結果集對于數據查詢的結果集,需要通過遍歷的方法,訪問返回的數據。遍歷主要通過rs.next()方法,判斷結果集是否有數據并繼續向下移動,訪問下一行數據。2025/2/6《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)關閉連接資源數據查詢/更新操作完成以后,要把所有使用的JDBC對象都關閉,以釋放JDBC資源。關閉的順序和創建順序相反:先關閉ResultSet,再是Statement對象,最后是Connection對象。2025/2/6《Web程序設計》17if(rs!=null){//關閉記錄集對象rs.close();}if(stmt!=null){//關閉語句執行對象stmt.close();}if(conn!=null){//關閉連接對象conn.close();}Connection接口Connection是一個接口,用于創建與特定數據庫的連接(會話),連接成功后可在會話中訪問和操作數據表。Connection對象的常用方法是創建Statement類的對象,主要有三個方法,createStatement()、prepareStatement()與prepareCall(),分別創建Statement、PreparedStatement、CallableStatement的對象,用于SQL語句的執行。2025/2/6《Web程序設計》18Statement接口Statement是JDBC用于執行SQL語句并返回它所生成結果的對象。Statement本質上是一個接口,由各個數據庫廠商負責具體的實現。考慮到不同的用途,Statement又額外有兩個子接口:PreparedStatement和CallableStatement,分別負責執行動態SQL語句和存儲過程語句。2025/2/6《Web程序設計》19Statement接口Statement接口專門用于執行靜態的SQL語句,即該語句在執行前已確定SQL語句,沒有動態參數需要傳入。2025/2/6《Web程序設計》20方法說明voidaddBatch(Stringsql)將給定的SQL命令添加到此Statement對象的當前命令列表中。voidclearBatch()清空此Statement對象的當前SQL命令列表。voidclose()立即釋放此Statement對象的數據庫和JDBC資源,而不是等待該對象自動關閉時發生此操作。booleanexecute(Stringsql)執行給定的SQL語句,該語句可能返回多個結果。booleanexecute(Stringsql,intautoGeneratedKeys)執行給定的SQL語句(該語句可能返回多個結果),并通知驅動程序所有自動生成的鍵都應該可用于檢索。int[]executeBatch()將一批命令提交給數據庫來執行,如果全部命令執行成功,則返回更新計數組成的數組。ResultSetexecuteQuery(Stringsql)執行給定的SQL語句,該語句返回單個ResultSet對象。intexecuteUpdate(Stringsql)執行給定SQL語句,該語句可能為INSERT、UPDATE或DELETE語句,或者不返回任何內容的SQL語句(如SQLDDL語句)。voidsetQueryTimeout(intseconds)將驅動程序等待Statement對象執行的秒數設置為給定秒數。同一時間每個Statement對象在只能打開一個ResultSet對象。因此,如果讀取一個ResultSet對象與讀取另一個交叉,則這兩個對象必須是由不同的Statement對象生成的。如果存在某個語句的打開的當前ResultSet對象,則Statement接口中的所有執行方法都會隱式關閉它。2025/2/6《Web程序設計》21PreparedStatement接口PreparedStatement表示預編譯的SQL語句對象,支持動態SQL語句執行,即SQL語句中的某些數據可以在執行時通過參數動態的傳入。PreparedStatement接口的實例化是通過connection對象的prepareStatement(sql)方法來實現的,其中sql為要執行的參數化SQL語句,其中的參數可用“?”表示,支持多個參數,通過PreparedStatement對象的setXXX(i,value)方法設置,“XXX”表示該參數的數據類型,這個數據類型必須與該字段數據庫的數據類型一致。2025/2/6《Web程序設計》22示例2025/2/6《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());//訂單物品數量(int)pstmt.setFloat(3,obj.getTotal());//訂單總金額(float)pstmt.setString(4,obj.getAddress());//地址(varchar)intresult=pstmt.executeUpdate();if(result>0){//如果插入成功
}}PreparedStatement的主要方法方法描述ResultSetexecuteQuery()在此PreparedStatement對象中執行SQL查詢,并返回該查詢生成的ResultSet對象。intexecuteUpdate()在此PreparedStatement對象中執行SQL語句,該語句必須是一個SQLINSERT、UPDATE或DELETE語句;或者是一個什么都不返回的SQL語句,比如DDL語句。voidsetBlob(inti,Blobx)將指定參數設置為給定Blob對象。voidsetBoolean(intparameterIndex,booleanx)將指定參數設置為給定Javaboolean值。voidsetDate(intparameterIndex,Datex,Calendarcal)使用給定的Calendar對象將指定參數設置為給定java.sql.Date值。voidsetDouble(intparameterIndex,doublex)將指定參數設置為給定Javadouble值。voidsetFloat(intparameterIndex,floatx)將指定參數設置為給定Javafloat值。voidsetInt(intparameterIndex,intx)將指定參數設置為給定Javaint值。voidsetLong(intparameterIndex,longx)將指定參數設置為給定Javalong值。voidsetShort(intparameterIndex,shortx)將指定參數設置為給定Javashort值。voidsetString(intparameterIndex,Stringx)將指定參數設置為給定JavaString值。voidsetTimestamp(intparameterIndex,Timestampx)將指定參數設置為給定java.sql.Timestamp值。2025/2/6《Web程序設計》24相比于Statement,PreparedStatement具有以下優勢:代碼的可讀性和可維護性比Statement高。能最大可能提高性能。因為預編譯語句有可能被重復調用,所以語句在被DBServer的編譯器編譯后的執行代碼被緩存下來,下次調用時只要是相同的預編譯語句就不需要編譯,只要將參數直接傳入編譯過的語句執行代碼中就會得到執行。能保證安全性,可以避免使用Statement時存在的sql注入等安全問題。2025/2/6《Web程序設計》25CallableStatement接口CallableStatement接口是專門用于訪問數據庫中的存儲過程而設置的,通過創建該對象,傳入存儲過程的名稱與所需參數,即可調用數據庫中預先定義好的存儲過程。如果使用結果參數,則必須將其注冊為OUT型參數。其他參數可用于輸入、輸出或同時用于二者。參數是根據編號按順序引用的,順序號從1開始。CallableStatement接口繼承了PreparedStatement接口中的方法,也包括從Statement接口中繼承的方法。2025/2/6《Web程序設計》26CallableStatement的主要方法方法描述Blob getBlob(inti)Blob getBlob(StringparameterName)以Blob對象的形式檢索JDBCBLOB參數的值。booleangetBoolean(intparameterIndex)booleangetBoolean(StringparameterName)以boolean值的形式檢索指定的JDBCBIT參數的值。byte[]getBytes(intparameterIndex)byte[]getBytes(StringparameterName)以byte數組值的形式檢索指定的JDBCBINARY或VARBINARY參數的值。Date getDate(intparameterIndex)DategetDate(intparameterIndex,Calendarcal)以java.sql.Date對象的形式檢索指定JDBCDATE參數的值。double getDouble(intparameterIndex)doublegetDouble(StringparameterName)以double值的形式檢索指定的JDBCDOUBLE參數的值。float getFloat(intparameterIndex)floatgetFloat(StringparameterName)以float值的形式檢索指定的JDBCFLOAT參數的值。int getInt(intparameterIndex)intgetInt(StringparameterName)以int值的形式檢索指定的JDBCINTEGER參數的值。long getLong(intparameterIndex)longgetLong(StringparameterName)以long值的形式檢索指定的JDBCBIGINT參數的值。StringgetString(intparameterIndex)StringgetString(StringparameterName)以String的形式檢索指定的JDBCCHAR、VARCHAR或LONGVARCHAR參數的值。void registerOutParameter(intparameterIndex,intsqlType)按順序位置parameterIndex將OUT參數注冊為JDBC類型sqlType。sqlType為枚舉型java.sql.Types。2025/2/6《Web程序設計》27示例2025/2/6《Web程序設計》28//示例代碼片段,conn為已建立的數據庫連接對象Stringsql=“{callsp_getBookNameById(?,?)}”;CallableStatementcstmt=conn.prepareCall(sql);//圖書id為傳入的int數據cstmt.setInt(1,id);//圖書名稱為out參數cstmt.registerOutParameter(2,java.sql.Types.VARCHAR);cstmt.execute();//按參數名稱獲取執行結果StringbookName=cstmt.getString(“bookName”);ResultSetResultSet接口表示數據庫結果集,通過執行查詢數據庫的SQL語句生成。ResultSet對象具有指向其當前數據行的指針。最初,指針被置于第一行之前。next()方法將指針移動到下一行;因為該方法在ResultSet對象中沒有下一行時返回false,因此可以在while循環中使用它來迭代結果集。2025/2/6《Web程序設計》29示例ResultSet的典型遍歷代碼如下2025/2/6《Web程序設計》30//假設Statement對象stmt已成功創建try{Stringsql=“select*fromt_order”;rs=stmt.executeQuery(sql);while(rs.next()){//循環處理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)按相對行數(或正或負)移動指針。2025/2/6《Web程序設計》31ResultSet數據檢索值說明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對象的元數據,例如列的編號、類型和屬性等。2025/2/6《Web程序設計》32ResultSet
getXXX()示例2025/2/6《Web程序設計》33//假設Statement對象stmt已成功創建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/2/6《Web程序設計》341JDBC介紹2JDBC訪問數據庫3JDBC案例4相關應用技術假設MySql數據庫book_db中有一個圖書表(t_book),主要存儲網上商城中的圖書基本信息2025/2/6《Web程序設計》35字段名含義數據類型備注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/2/6《Web程序設計》36(1)查詢展示圖書該模塊的主要功能為根據輸入的字段查詢圖書資料信息,將結果以表格的形式展現在頁面上。查詢展示數據的操作流程如下:點擊“圖書查詢”頁面,進入到該頁面,顯示所有圖書列表信息;輸入某個查詢字符,如出版社、ISBN,點擊查詢;從數據表中查詢與該查詢字段匹配的圖書記錄,顯示在頁面上的表格中;2025/2/6《Web程序設計》372025/2/6《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>//建立數據庫連接Connectionconn=DriverManager.getConnection(url,"user","user123");//動態組裝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;//根據參數的實際值確定參數的序號if(pCode!=null&&!"".equals(pCode)){paramIndex++;pstmt.setString(paramIndex,pCode);}if(pPublisher!=null&&!"".equals(pPublisher)){paramIndex++;pstmt.setString(paramIndex,pPublisher);}<%while(rs.next()){//循環遍歷結果集,以表格行的形式展示結果%><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)添加圖書該模塊的主要功能需求為將用戶輸入的圖書信息提交至數據庫t_book表中。主要的操作流程如下:在圖書列表頁面(book_list.jsp)中,點擊“添加圖書”鏈接,跳轉至圖書添加頁面(book_add.jsp);提供圖書信息表單,包含了圖書信息的各個字段,等待用戶填寫;填寫完成后,點擊“保存”按鈕,將圖書信息提交到保存頁面(book_add_do.jsp);圖書保存頁面(book_add_do.jsp)首先讀取提交的表單信息,進行基本業務規則的判斷,不符合則返回至添加頁面(book_add.jsp);數據符合業務規則后,進行數據庫連接,組裝數據插入語句,執行SQL語句;操作成功則返回至圖書列表頁面(book_list.jsp),不成功則返回圖書添加頁面(book_add.jsp)。2025/2/6《Web程序設計》39book_add.jsp2025/2/6《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="最多兩位
小數"></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/2/6《Web程序設計》41//獲取表單提交的數據項,StringUtil.toCN為自定義的中文字符處理函數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");]//判斷字段值是否符合業務規則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/2/6《Web程序設計》42Stringsql="insertintot_book(isbn,book_name,price,note,publisher,publishDate)values(?,?,?,?,?,?)";SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");//連接數據庫Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/book_db";Connectionconn=DriverManager.getConnection(url,"user","user123");PreparedStatementpstmt=conn.prepareStatement(sql);//設置參數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();//獲取插入語句的影響記錄數if(ret>0){//插入成功}(3)修改圖書該模塊的主要功能需求為將用戶填寫的圖書信息修改提交至數據庫t_book表中。主要的操作流程如下:在圖書列表頁面(book_list.jsp)中,選擇要修改的圖書,點擊該行的“修改”鏈接,跳轉至圖書修改頁面(book_edit.jsp);從數據庫中獲取要修改的圖書信息,顯示到圖書修改頁面上(book_edit.jsp)的表單字段項中,讀取要修改的圖書信息,用戶可根據需要修改其中的字段項;修改完成后,點擊“保存”按鈕,將圖書信息提交到修改保存頁面(book_edit_do.jsp);圖書修改保存頁面(book_edit_do.jsp)首先讀取提交的表單信息,進行基本業務規則的判斷,不符合則返回至修改頁面(book_edit.jsp);數據符合業務規則后,進行數據庫連接,組裝數據更新語句,執行SQL語句;操作成功則返回至圖書列表頁面(book_list.jsp),不成功則返回圖書修改頁面(book_edit.jsp)。2025/2/6《Web程序設計》43book_edit.jsp2025/2/6《Web程序設計》44//獲取參數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();//獲取數據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="最多兩位小數"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/2/6《Web程序設計》45Stringsql="updatet_booksetisbn=?,book_name=?,publisher=?,publish_date=?,price=?,note=?whereid=?";//更新到數據庫Class.forName("com.mysql.jdbc.Driver");Stringurl="jdbc:mysql://localhost:3306/book_db";Connectionconn=DriverManager.getConnection(url,"user","user123");PreparedStatementpstmt=conn.prepareStatement(sql);//設置參數值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)刪除圖書該模塊的主要功能為根據用戶選擇的要刪除圖書信息,從數據庫中直接刪除該記錄。具體的操作流程如下:在圖書列表頁面,選擇要刪除的圖書信息,點擊“刪除”鏈接;跳轉至圖書刪除頁面(book_delete.jsp),獲取圖書id;根據圖書id,組裝刪除圖書的SQL語句,執行語句進行刪除;2025/2/6《Web程序設計》46book_delete.jsp2025/2/6《Web程序設計》47Stringid=request.getParameter("id");Stringsql="deletefromt_bookwhereid=?";//建立數據庫連接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)關鍵字模糊查詢關鍵字模糊查詢是業務系統中一種典型的應用,操作中為用戶提供極大的便利,用戶只需要輸入某個關鍵字,后臺實現時,會在數據庫表的某個字段或某幾個字段中搜索包含該關鍵字的記錄,展現給用戶匹配的結果。本質上這種功能實現主要依賴于SQL語句中的模糊查詢,即通過SQL語句中的like語句,配合“?”或“%”通配符,實現模糊查詢。代碼實現時主要體現在SQL語句中相應位置添加like語句及通配符,以及相應參數的傳入。2025/2/6《Web程序設計》482025/2/6《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++;//重復執行兩遍,因為是從兩個字段中查找pstmt.setString(paramIndex,pKeyword);}if(pCode!=null&&!"".equals(pCode)){paramIndex++;pstmt.setString(paramIndex,pCode);}2025/2/6《Web程序設計》501JDBC介紹2JDBC訪問數據庫3JDBC案例4相關應用技術數據分頁瀏覽數據分頁瀏覽,是一種將所有業務數據分成多頁、每頁固定大小的方式展示給用戶。用戶在選擇查瀏覽的數據后,根據設置的頁大小以及當前的頁數,瀏覽該頁的數據。用戶每次看到的不是全部數據,而是其中的一部分,如果該頁中沒有找到想要的內容,可以通過前后翻頁或是指定頁碼的方式切換到不同的頁面,瀏覽該頁的數據。2025/2/6《Web程序設計》512025/2/6《Web程序設計》52分頁原理在JSP中實現查詢數據的分頁瀏覽,需要先定義幾個參數:page_size:每頁記錄數的大小,通常為10,20等常數cur_page:當前第幾頁,表明當前請求的是第幾頁數據,默認為1total
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 雙方解除勞動合同7篇
- 2025年家庭財產保險合同書8篇
- 北京政研建企信息咨詢有限公司勞動合同6篇
- 2025年公司級安全培訓考試試題參考
- 2025新入職工入職安全培訓考試試題【真題匯編】
- 2025買賣合同合同法合同法
- 2025四川省鋼材買賣合同范本
- 2025企業如何簽訂合法合規且滿足實際需求的合同
- 與快遞公司簽署合作協議
- 2025家庭裝修半包工合同樣本
- 有色金屬冶金概論總論
- 砂石料單價編制
- 海藻學知到章節答案智慧樹2023年煙臺大學
- 六年級下冊道德與法治期中測試卷含答案【考試直接用】
- EIM Book 1 Unit 11 Promise,promise單元知識要點
- 全陜西師范大學《716文學綜合》考研真題詳解下載全
- 引航梯的位置和標識及保養記錄
- 外科學急性化膿性腹膜炎
- 苯酚的分子組成和結構課件
- 《羅織經》全文及翻譯
- GB∕T 26077-2021 金屬材料 疲勞試驗 軸向應變控制方法
評論
0/150
提交評論