Web程序设计课件:JDBC_第1页
Web程序设计课件:JDBC_第2页
Web程序设计课件:JDBC_第3页
Web程序设计课件:JDBC_第4页
Web程序设计课件:JDBC_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JDBC2025/5/2112025/5/21《Web程序设计》21JDBC介绍2JDBC访问数据库3JDBC案例4相关应用技术本章课程目标知识目标掌握JDBC基本原理、主要函数及使用方法;掌握常用数据库的连接方法及数据读取和存储处理过程。能力要求:能够运用JDBC技术从数据库中读取和向数据写入数据;能够针对应用需要,设计并实现数据访问的方法;能够认识不同JDBC访问方法的局限性,选择恰当的方法用于应用中的数据访问。2025/5/21《Web程序设计》37.1JDBC介绍JavaDataBaseConnectivity(Java数据库连接),是一套Java语言编写的数据库连接标准的JavaAPI,用于Java程序访问数据库数据。从本质上看,JDBC是一种规范,它提供了一套完整的数据库访问接口,这些接口对程序员而言,可以无需了解具体实现细节即可访问业务数据库。2025/5/21《Web程序设计》4JDBC结构JDBCAPI支持两层和三层处理模型进行数据库访问,但一般的JDBC体系结构由两层组成:JDBCAPI:提供了应用程序对JDBC的管理连接。JDBCDriverAPI:支持JDBC管理到驱动器连接。2025/5/21《Web程序设计》5驱动程序管理器(DriverManager)JDBCAPI的使用驱动程序管理器和数据库特定的驱动程序提供透明的连接到异构数据库。JDBC驱动程序管理器可确保正确的驱动程序来访问每个数据源。该驱动程序管理器能够支持连接到多个异构数据库的多个并发的驱动程序。数据库厂商要支持JDBC,必须在JDBC规范下,实现其中规定的接口API,使用自己的方式实现这些数据查询/操作接口,返回数据。这种具体的实现就称为厂商的JDBC驱动程序。2025/5/21《Web程序设计》6JDBCAPI主要组件(1)Driver接口Driver接口由数据库厂家提供,对于Java应用开发人员,只需要使用Driver接口进行驱动的实例化。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。驱动器的主类完整名称是要使用的数据库厂商驱动程序主类名称。2025/5/21《Web程序设计》7class.forName(“驱动器的主类完整名称”);class.forName(“com.mysql.jdbc.Driver”)动态实例化方法无需import该类JDBCAPI主要组件(2)DriverManager接口这个类管理数据库驱动程序的列表。根据所提供的数据库连接协议URL以及初始化参数,建立与数据库的连接,该方法如果操作成功,则返回Connection接口的一个实例,表明成功地建立了与指定数据库的连接。url:与数据库连接的URL,包含访问协议、数据库服务的地址与端口、连接参数等信息;username:用于数据库访问的用户名称;password:用于数据库访问的密码。2025/5/21《Web程序设计》8ConnectionDriverManager.getConnection(Stringurl,Stringusername,Stringpassword);URL协议示例2025/5/21《Web程序设计》92025/5/21《Web程序设计》101JDBC介绍2JDBC访问数据库3JDBC案例4相关应用技术访问过程加载JDBC驱动程序创建数据库的连接创建语句执行对象执行SQL语句访问结果集关闭连接资源2025/5/21《Web程序设计》11(1)加载JDBC驱动程序在连接数据库之前,首先要加载数据库驱动到JVM中,主要通过java.lang.Class类的静态方法forName()实现。2025/5/21《Web程序设计》12try{//加载MySql的驱动类Class.forName("com.mysql.jdbc.Driver");//后续操作

}catch(ClassNotFoundExceptione){System.out.println("找不到驱动程序类,加载驱动失败!");e.printStackTrace();}(2)创建数据库的连接成功加载JDBC驱动程序后,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。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("数据库连接失败!");ex.printStackTrace();}(3)创建语句执行对象数据库连接成功后,需要先创建一个Statement对象或其子类PreparedStatement、CallableStatement,用于执行SQL语句。Statement类的对象是用于执行静态SQL语句,PreparedStatement类的对象用于执行动态SQL语句,CallableStatement类的对象主要用于执行存储过程语句。2025/5/21《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/5/21《Web程序设计》15Connectioncon=DriverManager.getConnection(url,username,password);Statementstmt=conn.createStatement();Stringsql=“select*fromt_orderorderbyiddesc”;ResultSetrs=stmt.executeQuery(sql);(5)访问结果集对于数据查询的结果集,需要通过遍历的方法,访问返回的数据。遍历主要通过rs.next()方法,判断结果集是否有数据并继续向下移动,访问下一行数据。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)关闭连接资源数据查询/更新操作完成以后,要把所有使用的JDBC对象都关闭,以释放JDBC资源。关闭的顺序和创建顺序相反:先关闭ResultSet,再是Statement对象,最后是Connection对象。2025/5/21《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/5/21《Web程序设计》18Statement接口Statement是JDBC用于执行SQL语句并返回它所生成结果的对象。Statement本质上是一个接口,由各个数据库厂商负责具体的实现。考虑到不同的用途,Statement又额外有两个子接口:PreparedStatement和CallableStatement,分别负责执行动态SQL语句和存储过程语句。2025/5/21《Web程序设计》19Statement接口Statement接口专门用于执行静态的SQL语句,即该语句在执行前已确定SQL语句,没有动态参数需要传入。2025/5/21《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/5/21《Web程序设计》21PreparedStatement接口PreparedStatement表示预编译的SQL语句对象,支持动态SQL语句执行,即SQL语句中的某些数据可以在执行时通过参数动态的传入。PreparedStatement接口的实例化是通过connection对象的prepareStatement(sql)方法来实现的,其中sql为要执行的参数化SQL语句,其中的参数可用“?”表示,支持多个参数,通过PreparedStatement对象的setXXX(i,value)方法设置,“XXX”表示该参数的数据类型,这个数据类型必须与该字段数据库的数据类型一致。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());//订单物品数量(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/5/21《Web程序设计》24相比于Statement,PreparedStatement具有以下优势:代码的可读性和可维护性比Statement高。能最大可能提高性能。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。能保证安全性,可以避免使用Statement时存在的sql注入等安全问题。2025/5/21《Web程序设计》25CallableStatement接口CallableStatement接口是专门用于访问数据库中的存储过程而设置的,通过创建该对象,传入存储过程的名称与所需参数,即可调用数据库中预先定义好的存储过程。如果使用结果参数,则必须将其注册为OUT型参数。其他参数可用于输入、输出或同时用于二者。参数是根据编号按顺序引用的,顺序号从1开始。CallableStatement接口继承了PreparedStatement接口中的方法,也包括从Statement接口中继承的方法。2025/5/21《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/5/21《Web程序设计》27示例2025/5/21《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/5/21《Web程序设计》29示例ResultSet的典型遍历代码如下2025/5/21《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/5/21《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/5/21《Web程序设计》32ResultSet

getXXX()示例2025/5/21《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/5/21《Web程序设计》341JDBC介绍2JDBC访问数据库3JDBC案例4相关应用技术假设MySql数据库book_db中有一个图书表(t_book),主要存储网上商城中的图书基本信息2025/5/21《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/5/21《Web程序设计》36(1)查询展示图书该模块的主要功能为根据输入的字段查询图书资料信息,将结果以表格的形式展现在页面上。查询展示数据的操作流程如下:点击“图书查询”页面,进入到该页面,显示所有图书列表信息;输入某个查询字符,如出版社、ISBN,点击查询;从数据表中查询与该查询字段匹配的图书记录,显示在页面上的表格中;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>//建立数据库连接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/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="最多两位

小数"></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//获取表单提交的数据项,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/5/21《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/5/21《Web程序设计》43book_edit.jsp2025/5/21《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/5/21《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/5/21《Web程序设计》46book_delete.jsp2025/5/21《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/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++;//重复执行两遍,因为是从两个字段中查找pstmt.setString(paramIndex,pKeyword);}if(pCode!=null&&!"".equals(pCode)){paramIndex++;pstmt.setString(paramIndex,pCode);}2025/5/21《Web程序设计》501JDBC介绍2JDBC访问数据库3JDBC案例4相关应用技术数据分页浏览数据分页浏览,是一种将所有业务数据分成多页、每页固定大小的方式展示给用户。用户在选择查浏览的数据后,根据设置的页大小以及当前的页数,浏览该页的数据。用户每次看到的不是全部数据,而是其中的一部分,如果该页中没有找到想要的内容,可以通过前后翻页或是指定页码的方式切换到不同的页面,浏览该页的数据。2025/5/21《Web程序设计》512025/5/21《Web程序设计》52分页原理在JSP中实现查询数据的分页浏览,需要先定义几个参数:page_size:每页记录数的大小,通常为10,20等常数cur_page:当前第几页,表明当前请求的是第几页数据,默认为1total_co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论