




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《JSP笔记》之五第五章JSP与数据库应用本章中,我们使用SQLServer2023数据库管理系统。特别约定,建立新的数据库名为:student,在其下创建表:表1:student;表2:login。数据源名:jspdb§5.1访问SQLServer数据库和案例11§5.1.1Web数据库程序设计基础下面给出一个存取Web数据库的JSP数据库网络架构图。图中,服务器端由Web应用程序服务器和数据库服务器组成,前者负责执行JSP程序。JSP程序通过JDBC(JavaDataBaseConnectivity)接口和数据库服务器相连,并取得数据库中的数据。JSP程序也通过JDBC向数据库发送SQL命令,对数据库进行新增、删除和修改记录等操作,这一切都需要依靠JDBC提供的类与方法来完毕。§5.1.2数据库的基本概念§5.1.3在SQLServer2023中创建数据库打开SQLServer2023的“公司管理器”,在其中创建数据库jspdb。§5.1.4JDBC简介JDBC是Java数据库连接API,它由一些Java类和接口组成。在JSP中可以使用JDBC实现对数据库中表记录的查询、修改、插入和删除等操作。JDBC技术在JSP开发中占有很重要的地位。经常使用JDBC进行如下操作:(1)与一个数据库建立连接(2)向已连接的数据库发送SQL语句(3)解决SQL语句返回的结果1.JSP与数据库连接的常用方式 应用程序必须一方面与数据库建立连接。通常有四种连接方式,见书第176至177页。一般常用两种连接方式:JDBC-ODBC桥接器和纯Java数据库驱动程序。不同的连接方式相应着网页中不同的代码段。2.JDBC中常用的类和接口(1)DriverManager类:驱动管理类DriverManager类对象负责管理JDBC驱动程序,使用DriverManager的方法getConnection(
)可以生成Connection对象。(2)Connection类:连接类Connection类对象实现与数据源的连接,通过Connection类的createStatement(
)方法可以生成Statement对象。(3)Statement接口:语句接口用于发送简朴的SQL语句,实现SQL语句的执行。(4)ResultSet接口:结果集接口实现对数据的解决,维护记录指针,记录指针所指记录为当前记录。ResultSet对象用于包含符合SQL语句中条件的所有记录,并且通过一套get方法提供了对这些记录中数据的访问。(5)PreparedStatement接口:预解决语句接口用于发送带有一个或多个输入参数(IN参数)的SQL语句,PreparedStatement对象代表一个预编译的SQL语句。执行速度较快,需要执行多次的语句应当创建为PreparedStatement对象。PreparedStatement对象中的SQL语句可具有若干个参数,执行语句前用setXXX方法来提供。§5.1.5DriverManager类DriverManager类负责管理JDBC驱动程序,是JDBC的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立连接。与DriverManager类相关的方法重要有Class.forName(Stringdriver)和StaticConnectiongetConnection(Stringurl,Stringuser,Stringpassword)。前者用于加载注册驱动程序,后者用于取得对数据库的连接。关于它们的用法,在下一节中立即介绍。§5.1.6使用JDBC-ODBC桥接器方式连接数据库ﻩ使用JDBC-ODBC桥接器方式与数据库建立连接,要通过:创建ODBC数据源――>建立JDBC-ODBC桥接器――>和ODBC数据源指定的数据库建立连接共3个环节。1.创建ODBC数据源:环节见教材。操作入口:控制面板管理工具数据源(ODBC)打开“ODBC数据源管理器”窗口,选择“系统DSN”选项卡“添加”按钮设立驱动程序:SQLServer数据源名:jspdb,服务器:(local)登录方式:选择默认设立:如下图,选择“使用网络登录ID的WindowsNT验证(W)。”勾上“更改默认的数据库为(D):”中,输入数据库:jspdb。其它采用默认设立,不需要修改。创建后,测试一下数据源。2.建立JDBC-ODBC桥接器ﻩ为了连接jspdb数据源的jspdb数据库,一方面要建立一个JDBC-ODBC桥接器.这个建立过程是通过下面这句代码实现的: ﻩClass.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);//或Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”).newInstance();ﻩ建立桥接器时也许发生异常,因此捕获这个异常。所以建立桥接器的标准语句是: try{ Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);//或Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”).newInstance(); } Catch(ClassNotFoundExceptione){out.println(e)}3.与ODBC数据源指定的数据库建立连接 编写连接数据库的Java代码不会出现数据库的名称,只能出现数据源的名字。先使用java.sql包中的Connection类声明一个连接对象,然后再使用类DriverManager调用它的静态方法getConnection创建这个对象: Connectioncon=DriverMagager.getConnection(“jdbc:odbc:数据源名字”,”loginname”,”password”); 其中logi和password是建立数据源时所使用的用户名和密码。 建立连接时应捕获SQLException异常:ﻩtry{ﻩﻩConnectioncon=DriverManager.getConnection(“jdbc:odbc:student”,”sa”,”sa”); } catch(SQLExceptione){ﻩ out.println(e); }ﻩ这样就与数据源student建立了连接。应用程序一旦与某个数据源建立连接,就可以通过SQL语句与该数据源所指定的数据库中的表交互信息,如查询、修改、更新表中的记录。 下例中是一个简朴的JSP页面,该页面中的Java程序片代码负责连接到数据源jspdb,查询该数据源中的数据库jspdb中的表trade的所有记录。表trade的字段设计和所有记录见书175页176页。用JDBC-ODBC桥接器方式连接数据库,并显示表trade中的所有记录。网页文献名example1.jsp<%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%><HTML><BODY><%Connectioncon;Statementsql;ResultSetrs;ﻩtry{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){ﻩﻩout.println(e);}try{con=DriverManager.getConnection("jdbc:odbc:jspdb","","");sql=con.createStatement();rs=sql.executeQuery("SELECT*FROMtrade");%><TableBorderbgcolor="#CCFFFF"><TR><THwidth=100><fontface="宋体">序列号</font><THwidth=100><fontface="宋体">商品名称</font><THwidth=50><fontface="宋体">类型</font></TR> <THwidth=100><fontface="宋体">供应商</font></TR> <THwidth=50><fontface="宋体">价格</font></TR> <THwidth=50><fontface="宋体">数量</font></TR><%while(rs.next()){%><TR><TD><divalign="center"><%=rs.getObject("id")%></div></TD><TD><divalign="center"><%=rs.getObject("tradename")%></div></TD><TD><divalign="center"><%=rs.getObject("class")%></div></TD> <TD><divalign="center"><%=rs.getObject("provider")%></div></TD>ﻩ<TD><divalign="center"><%=rs.getObject("price")%></div></TD>ﻩ<TD><divalign="center"><%=rs.getObject("num")%></div></TD></TR><%}%></Table><%con.close();}catch(SQLExceptione1){}%></BODY></HTML>执行后,效果如下图:[案例11]访问SQLServer数据库采用JDBC-ODBC桥接器方式连接数据库中的表trade。请同学们学习连接代码中参数的设立。网页文献名jspodbc.jsp<!--jspodbc.jsp--><%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%><html><head><title>访问SQLServer数据库</title></head><body><h2align="center">访问SQLServer数据库</h2><hr><%//下面程序段用于连接到数据库 //加载类sun.jdbc.odbc.JdbcOdbcDriver,并通过newInstance()方法实例化ﻩClass.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();ﻩout.println("数据库驱动注册成功!<br>");ﻩ//设立url为ODBC中的jspdbﻩStringurl="jdbc:odbc:jspdb"; ﻩ ﻩStringuser="sa";ﻩStringpassword=""; //建立与数据库的连接,将连接赋给connﻩConnectionconn=DriverManager.getConnection(url,user,password); out.println("数据库连接成功!<br><hr>");ﻩ//通过Connection类的createStatement()方法创建Statement实例, //并赋给stmt,以方便操作数据库ﻩStatementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ﻩﻩﻩ ﻩ ﻩResultSet.CONCUR_UPDATABLE); //创建SQL查询字符串,以选择数据表trade中的记录ﻩStringsql="select*fromtrade";ﻩ//通过Statement类的executeQuery()方法创建ResultSet对象rs,以方便对数据表的操作ﻩResultSetrs=stmt.executeQuery(sql); //移动到数据表的第一条记录 rs.first();ﻩ//下面的语句将显示记录中各字段的内容%>ﻩid:<%=rs.getObject("id")%><br>ﻩ商品名称:<%=rs.getObject("tradename")%><br>ﻩ供应商:<%=rs.getObject("provider")%><br>ﻩ类别:<%=rs.getObject("class")%><br> 单价:<%=rs.getObject("price")%><br> 数量:<%=rs.getObject("num")%><br> <hr> 数据库访问成功!ﻩ<br><%rs.close();ﻩﻩ//关闭rsstmt.close();ﻩ//关闭stmtconn.close(); //关闭conn%>ﻩ数据库已关闭!</body></html>运营后效果如下图:§5.1.7通过本地协议纯Java驱动程序访问SQLServer2023数据库用Java语言编写的驱动程序称为纯Java驱动程序。简朴地说,JDBC可以调用本地协议纯Java驱动程序和相应的数据库建立连接。这种连接数据库方式要通过2个环节:加载纯Java驱动程序->与指定的数据库连接。1.加载纯Java驱动程序:这种方式下不需要设立数据源,由于不依赖于ODBC,使得应用程序具有很好的移植性。目前,许多数据库厂商都提供了自己的相应的纯Java驱动程序。当使用纯Java驱动程序访问数据库时,必须保证:在连接数据库的JSP网页程序所驻留的计算机上安装相应DBMS提供的纯Java驱动程序。比如,Tomcat服务器上的某个Web应用程序,想访问SQLServer2023数据库管理系统所管理的数据库,则Tomcat服务器所驻留的计算机上必须要安装SQLServer2023提供的纯Java驱动程序。我们这里,使用的是MSSQLServer2023数据库管理系统。所以需要把该厂商提供的jar包:mssqlserver.jar、msutil.jar、msbase.jar挎贝到Java的jre\lib\ext中,或复制到Tomcat服务器安装目录的文献夹的common\lib中。并且修改classpath环境变量:在classpath的当前值中,再添加3个jar包,即修改完classpath后,其值为:classpath=.;%Java_home%\lib\dt.jar;%Java_home%\lib\tools.jar;%tomcat_home%\common\lib\msbase.jar;%tomcat_home%\common\lib\msutil.jar;%tomcat_home%\common\lib\mssqlserver.jar;%tomcat_home%\common\lib\servlet.jar;//红色部分就是新添加的部分。除此之外,尚有一件很重要的事,就是安装SQLServer2023SP3补丁。SQLServer2023SP3补丁可以直接在网上下载,其文献名为chs_sql2ksp3.exe。下载完后,双击该文献安装SQLServer2023SP3补丁。准备好了后,加载纯Java驱动程序://注意,这里的参数和ODBC桥接器方式不同样。try{ﻩClass.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).newInstance();}catch(Exceptione){ﻩout.println(e);}2.和指定的数据库建立连接假设网页程序要与SQLServer数据库服务器管理的数据库jspdb建立连接,而有权访问数据库jspdb的用户的id和密码分别是sa、空,那么建立连接的代码如下:ﻩtry{ ﻩStringurl=”jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jspdb”; Stringuser=”sa”; Stringpassword=””; con=DriverManager.getConnection(url,user,password);ﻩ}ﻩcatch(SQLExceptione){ﻩ out.println(e);ﻩ}ﻩ下面的例子是采用纯Java数据库驱动程序方式来实现上一个例题的例子。例2使用纯Java数据库驱动方式显示表中的所有记录网页文献名example2.jsp<%@pagecontentType="text/html;charset=GB2312"%><%@pageimport="java.sql.*"%><%@pageimport="java.util.*"%><HTML><BODY><%ﻩConnectioncon;ﻩStatementsql; ResultSetrs; try{ﻩ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance(); } catch(Exceptione){ﻩ out.print(e); out.print("***************");out.print("<br>");ﻩ}ﻩtry{ Stringurl; ﻩurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jspdb"; ﻩStringuser="sa"; ﻩStringpassword=""; ﻩcon=DriverManager.getConnection(url,user,password);ﻩ sql=con.createStatement();ﻩrs=sql.executeQuery("SELECT*FROMtrade");%><CENTER><TableBorderbgcolor="#CCFFFF"><TR><THwidth=100><fontface="宋体">序列号</font><THwidth=100><fontface="宋体">商品名称</font><THwidth=50><fontface="宋体">类型</font></TR>ﻩ<THwidth=100><fontface="宋体">供应商</font></TR>ﻩ<THwidth=50><fontface="宋体">价格</font></TR>ﻩ<THwidth=50><fontface="宋体">数量</font></TR><%while(rs.next()){%><TR><TD><divalign="center"><%=rs.getObject("id")%></div></TD><TD><divalign="center"><%=rs.getObject("tradename")%></div></TD><TD><divalign="center"><%=rs.getObject("class")%></div></TD>ﻩ<TD><divalign="center"><%=rs.getObject("provider")%></div></TD> <TD><divalign="center"><%=rs.getObject("price")%></div></TD>ﻩ<TD><divalign="center"><%=rs.getObject("num")%></div></TD></TR><%}%></Table><%con.close();}ﻩcatch(SQLExceptione1){ ﻩout.println(e1);ﻩ}%></BODY></HTML>运营后,效果同例1完全同样。[拓展案例18]通过本地协议纯Java驱动程序访问SQLServer2023数据库网页文献名jspSQLServer.jsp<!--jspSQLServer.jsp--><%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%><html><head><title>通过本地协议纯Java驱动程序访问SQLServer2023数据库</title></head><body><h2align="center">通过本地协议纯Java驱动程序访问SQLServer2023数据库</h2><hr><%//下面程序段用于连接到数据库ﻩ//加载类com.microsoft.jdbc.sqlserver.SQLServerDriver,并通过newInstance()方法实例化 Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();ﻩ//设立url在本地主机1433端口上访问sqlserver数据库,数据库名为jspdbﻩStringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jspdb";//设立用户名和密码ﻩStringuser="admin";ﻩStringpassword=""; //建立与数据库的连接,将连接赋给conn Connectionconn=DriverManager.getConnection(url,user,password);ﻩ//通过Connection类的createStatement()方法创建Statement实例, //并赋给stmt,以方便操作数据库ﻩStatementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ﻩ ﻩﻩ ﻩ ﻩﻩResultSet.CONCUR_UPDATABLE);ﻩ//创建SQL查询字符串,以选择数据表trade中的记录ﻩStringsql="select*fromtrade"; //通过Statement类的executeQuery()方法创建ResultSet对象rs,以方便对数据表的操作 ResultSetrs=stmt.executeQuery(sql); //移动到数据表的第一条记录 rs.first();ﻩ//下面的语句将显示记录中各字段的内容%> id:<%=rs.getObject("id")%><br>ﻩ商品名称:<%=rs.getObject("tradename")%><br>ﻩ供应商:<%=rs.getObject("provider")%><br> 类别:<%=rs.getObject("class")%><br> 单价:<%=rs.getObject("price")%><br> 数量:<%=rs.getObject("num")%><br><%rs.close();ﻩ //关闭rsstmt.close(); //关闭stmtconn.close();ﻩ//关闭conn%></body></html>运营后,效果同案例11。上述网页在运营中,假如出现关于用户admin的错误提醒。则说明用户admin还没有添加到SQLServer2023的登录角色中。下面就添加用户并设立其使用jspdb数据库的权限。3.添加数据库用户admin添加用户在SQLServer2023的“公司管理器”中进行,具体见书第187至188页。§5.1.8访问MicrosoftAccess数据库本小节是用MircrosoftAccess数据库代替SQLServer2023数据库实现数据的管理。相应地在JSP网页中应当有哪些改动呢?前面我们知道,可以采用2种方式实现JSP网页同SQLServer2023数据库的连接:桥接器方式和纯Java驱动程序方式。这里,和Access相连,我们就只采用桥接器数据源的方式,另一种方式需要相应数据库Access的JDBC驱动的类包,就不涉及了。请同学们参看相应书籍。一方面,在当前目录c:\Tomcat5.5\webapps\ROOT\jsptech\chapter5下再创建一个目录jspaccess,然后将网页和Access数据库都存放在这个目录下。环节如下1.使用MicrosoftAccess程序创建一个数据库jspdb,并在这个jspdb数据库内创建一个表trade,内容同上几小节。2.创建数据源jspaccess:控制面板管理工具数据源(ODBC)系统DSN“添加”按钮在“选择您想为其安装数据源的驱动程序(S)”中,即可以选“DriverdoMicrosoftAccess(*.mdb),也可以选”MicrosoftAccessDriver(*.mdb)”“完毕”按钮设立数据源名:jspaccess点“选择”按钮,选择相连接的数据库c:\Tomcat5.5\webapps\ROOT\jsptech\chapter5\jspaccess\jspdb.mdb点“拟定”。3.修改JSP程序:当数据库改为Access后,只需要在网页中修改连接数据库的这句代码ﻩDriverManager.getConnection(url,user,password)中的参数,将url从 Stringurl="jdbc:odbc:jspdb"改为:ﻩStringurl="jdbc:odbc:jspaccess"也即修改数据源的名字就可以了。其它不需要做任何修改。采用桥接器方式和SQLServer2023相连接的案例11,改为采用桥接器方式和Access相连接的拓展案例19。如下所示:[拓展案例19]网页文献名jspaccess.jsp<!--jspaccess.jsp--><%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%><html><head><title>访问Access数据库</title></head><body><h2align="center">访问Access数据库</h2><hr><%try{ //启动异常解决 //加载类sun.jdbc.odbc.JdbcOdbcDriver,并通过newInstance()方法实例化 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance(); out.println("数据库驱动注册成功!<br>"); //设立url为ODBC中的jspdbﻩStringurl="jdbc:odbc:jspaccess";ﻩﻩ ﻩStringuser="";ﻩStringpassword=""; //建立与数据库的连接,将连接赋给connﻩConnectionconn=DriverManager.getConnection(url,user,password); out.println("数据库连接成功!<br><hr>");ﻩﻩ//通过Connection类的createStatement()方法创建Statement实例, //并赋给stmt,以方便操作数据库ﻩStatementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ﻩﻩ ﻩﻩ ﻩ ResultSet.CONCUR_UPDATABLE);ﻩ//创建SQL查询字符串,以选择数据表trade中的记录ﻩStringsql="select*fromtrade";ﻩ//通过Statement类的executeQuery()方法创建ResultSet对象rs,以方便对数据表的操作 ResultSetrs=stmt.executeQuery(sql); //移动到数据表的第一条记录 rs.first(); //下面的语句将显示记录中各字段的内容%> id:<%=rs.getObject("id")%><br> 商品名称:<%=rs.getObject("tradename")%><br>ﻩ供应商:<%=rs.getObject("provider")%><br> 类别:<%=rs.getObject("class")%><br>ﻩ单价:<%=rs.getObject("price")%><br> 数量:<%=rs.getObject("num")%><br>ﻩ<hr>ﻩ数据库访问成功!ﻩ<br><%rs.close();ﻩ //关闭rsstmt.close(); //关闭stmtconn.close();ﻩ//关闭conn } catch(ClassNotFoundExceptione){ﻩ out.println("驱动程序类异常!<br>"); ﻩout.println(e.getMessage()); } catch(SQLExceptione){ ﻩout.println("数据库连接或SQL查询异常!<br>");ﻩﻩout.println(e.getMessage()); ﻩ } catch(Exceptione){ ﻩout.println("其他异常!<br>"); ﻩout.println(e.getMessage()); }%> </body></html>运营后效果如书195页图5-29。§5.1.9关闭与数据库的连接当程序不再使用与数据库的连接时,应使用Connection对象的close方法关闭与数据库的连接。即如下语句:ﻩ conn.close();ﻩﻩ //这里conn是连接对象(Connection对象)名并且也关闭其他对象,即:rs.close();ﻩ //关闭rs stmt.close(); ﻩ//关闭stmt当然,不关闭这些对象,程序运营也没有问题。就像try…..catch…..语句同样,这么做是为了避免麻烦,增强程序的健壮性。§5.2访问数据库连接到数据库后,就可以对数据库进行各种操作。可以运营SQL语句来查询数据库表或者添加、修改其内容,或者新建、删除一个表。java.sql包中与数据库操作有关的类和接口重要有以下几个:(1)Connection:连接类(2)Statement:语句对象。由Connection类的createStatement()方法创建。(3)PreparedStatement:预解决语句对象。由Connection类的prepareStatement()方法创建。用来发送带参数的SQL语句或基本SQL语句的语句对象(4)CallableStatement:由Connection类的prepareCall()方法创建。用来调用数据库中的存储过程。(5)ResultSet:结果集对象。用于获取和更新查询的结果。分为两类。一类是不带参数的结果集。一类是带有参数的结果集,参数的选取和含义如书201页表5-7表5-8所示。§5.2.1SQL简介:书196页至200页简朴介绍了操作数据库表的语句。重要有:(1)查询记录select:select字段名1,字段名2,……from表名where条件(2)插入一条记录insert:insertinto表名value(值1,值2,….)(3)删除若干条记录delete:deleterfrom表名where条件(4)更新update的语句:update表名set字段名1=值1,字段名2=值2,……(5)创建一个新表(6)修改表的结构等§5.2.2Connection类:见书§5.2.3Statement类:见书§5.2.4ﻩSQL提供了SELECT、INSERT、DELETE和UPDATE四条语句分别对表进行查询、插入、删除和更新操作。1.查询操作 对表的查询操作,是使用语句对象Statement对象(一般都是名为sql或stmt)的executeQuery(Stringselect查询语句)方法完毕。该方法发送Select语句到数据库,并将执行结果以ResultSet对象形式返回到程序中。 查询操作的过程如下面的代码段所示:Connectioncon;ﻩﻩ//声明连接对象Statementsql;ﻩ //声明语句对象ResultSetrs;ﻩ ﻩ//声明结果集对象 try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //建立JDBC-ODBC桥接器}catch(ClassNotFoundExceptione){ }try{con=DriverManager.getConnection("jdbc:odbc:student","zhouping","");//连接数据源sql=con.createStatement(); ﻩ//创建语句对象ﻩ rs=sql.executeQuery("SELECT*FROMstudents"); ﻩﻩ//执行查询语句,并将查询结果保存在结果集rs中 …………这里,将查询所得的结果通过对结果集rs的操作,显示出来…………con.close();ﻩ} catch(SQLExceptione1){ ﻩout.println(e1); }完整的网页代码见例1。2.获取结果集的所有字段的值ResultSet接口提供了一组get方法用于获取当前记录的字段的值。使用get方法可以按照字段名称或字段排列顺序号来获取字段的值。但表中的字段为不同类型时,要使用不同的get方法来取出值。比较常用的有:字段为字符型:ﻩgetString(int),getString(String)字段为整数型:ﻩgetInt(int),getInt(String)字段为Double型:getDouble(int),getDouble(String)将指定字段的值以Object类型返回:getObject(int),getObject(String)等。 注:1.无论字段是何种属性,总可以使用getString()方法返回字段值的串表达;ﻩﻩ2.当使用getXxx方法查看一行记录时,不可以颠倒字段的顺序,例如: ﻩﻩrs.getFloat(5); ﻩ//错误 ﻩﻩrs.getFloat(4); ﻩ//错误 下面的代码段输出结果集rs中各条记录的内容。其中的next()方法是得到下一条记录,且假如不是结果集的结束位置时,返回true。ﻩwhile(rs.next()){ //将记录指针移到下一条记录并判断是否结束ﻩﻩout.print(rs.getString(1)+”,”);ﻩ //输出第一个字段的值ﻩ out.print(rs.getString(2)+”,”);ﻩ //输出第二个字段的值 }例3数据库基本查询ﻩ该网页进行数据库连接操作后,发送特殊的select查询语句:rs=sql.executeQuery("SELECT*FROMtradewhereprice>=10");即查询单价price在10元及以上的商品的信息。如下例所示,可以看出,该网页和example1.jsp的唯一区别就是上面这一句select。网页文献名example3.jsp(只输出单价在10元以上的商品的记录(price>=10))<%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%><HTML><BODY><%Connectioncon;Statementsql;ResultSetrs; try{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundExceptione){ﻩ out.println(e);}try{con=DriverManager.getConnection("jdbc:odbc:jspdb","","");sql=con.createStatement();rs=sql.executeQuery("SELECT*FROMtradewhereprice>=10");%><TableBorderbgcolor="#CCFFFF"><TR><THwidth=100><fontface="宋体">序列号</font><THwidth=100><fontface="宋体">商品名称</font><THwidth=50><fontface="宋体">类型</font></TR>ﻩ<THwidth=100><fontface="宋体">供应商</font></TR>ﻩ<THwidth=50><fontface="宋体">价格</font></TR> <THwidth=50><fontface="宋体">数量</font></TR><%while(rs.next()){%><TR><TD><divalign="center"><%=rs.getObject("id")%></div></TD><TD><divalign="center"><%=rs.getObject("tradename")%></div></TD><TD><divalign="center"><%=rs.getObject("class")%></div></TD>ﻩ<TD><divalign="center"><%=rs.getObject("provider")%></div></TD> <TD><divalign="center"><%=rs.getObject("price")%></div></TD>ﻩ<TD><divalign="center"><%=rs.getObject("num")%></div></TD></TR><%}%></Table><%con.close();}catch(SQLExceptione1){}%></BODY></HTML>3.记录的插入、删除和更新操作这3种操作需要由Statement对象使用executeUpdate(stringsql)方法来实现。该方法的返回值是int型,表达SQL语句影响的记录条数。插入操作:(这里st是语句对象,前已定义)Stringsqlstr=”insertinto表名values(字段值1,字段值2,……);st.executeUpdate(sqlstr);注意:这里插入一条记录是通过values(所有字段的值的排列,以逗号隔开)来实现的,则这些字段的值必须是一条记录的所有字段的值。比如trade表有6个字段,分别是id,tradename,class,provider,price,nam,则插入的也必须是6个值(少一个都不行),且分别的值须和6个字段的类型相相应。例如,下面的例子中有语句:Stringstr1="INSERTINTOtradeVALUES('"+xuehao+"','"+name+"',"+xuefen+")";sql.executeUpdate(str1);//执行添加操作。更新操作: Stringsqlstr=”update表名set被修改字段名=新字段值where条件”; st.executeUpdate(sqlstr);删除操作:ﻩStringsqlstr=”deletefrom表名where条件”; st.executeUpdate(sqlstr);向表trade里添加一条新的记录前台网页文献input4.jsp:建立表单form,添加6个文本框和一个按钮,文本框输入要添加的商品信息,按钮触发表单解决程序example4.jsp后台网页文献insert.jsp,先显示表trade插入新记录之前的所有记录,然后取得表单传递的商品信息,进行解决后,插入到表trade中。前台网页文献名input4.jsp<%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%><HTML><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/><BODYbgcolor="#72bc95"> <P>数据库更新前记录:<%!publicStringgetStr(Stringstr){ try {ﻩﻩStringtemp_p=str; ﻩbyte[]temp_t=temp_p.getBytes("ISO8859-1"); Stringtemp=newString(temp_t); ﻩreturntemp;ﻩ} catch(Exceptione)ﻩ{ﻩ }ﻩreturn"";}%><%ﻩConnectioncon;Statementsql;ResultSetrs;ﻩtry{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");} catch(ClassNotFoundExceptione){ﻩ out.println(e);ﻩ} try{ con=DriverManager.getConnection("jdbc:odbc:jspdb","",""); sql=con.createStatement();ﻩrs=sql.executeQuery("select*fromtrade");%> <TABLEborder=""bgcolor="#74bbc0"> ﻩ<TR> ﻩ<THwidth=100><fontface="宋体">序列号</font> ﻩ<THwidth=100><fontface="宋体">商品名称</font> <THwidth=50><fontface="宋体">类型</font></TR> <THwidth=100><fontface="宋体">供应商</font></TR>ﻩ ﻩ<THwidth=50><fontface="宋体">价格</font></TR>ﻩﻩ <THwidth=50><fontface="宋体">数量</font></TR>ﻩ </TR><%ﻩwhile(rs.next()){%>ﻩﻩ<TRalign="center">ﻩﻩﻩ<TD><%=rs.getInt(1)%></TD>ﻩ <TD><%=rs.getString(2)%></TD> ﻩ <TD><%=rs.getString(3)%></TD>ﻩ <TD><%=rs.getString(4)%></TD> ﻩ<TD><%=rs.getObject(5)%></TD> <TD><%=rs.getInt(6)%></TD>ﻩﻩ</TR><% }%>ﻩ</TABLE> <%ﻩcon.close();}ﻩcatch(SQLExceptione1){ ﻩ}ﻩ%> <P>添加新记录到数据库:ﻩ <FORMaction="insert.jsp"method=post> 序列号:<Inputtype="text"name="id"><BR>ﻩﻩ 商品名称:<Inputtype="text"name="name"><BR> ﻩ 类型:<Inputtype="text"name="category"><br> 供应商:<Inputtype="text"name="productor"><br> ﻩﻩ价格:<Inputtype="text"name="price"><br> ﻩ数量:<Inputtype="text"name="number"><br>ﻩﻩﻩ<Inputtype="submit"value="提交"></BODY></HTML>后台网页文献名insert.jsp<%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%><HTML><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/><BODYbgcolor="#72bc95"><%!publicStringgetStr(Stringstr){ﻩtry { Stringtemp_p=str;ﻩﻩbyte[]temp_t=temp_p.getBytes("ISO8859-1");ﻩﻩStringtemp=newString(temp_t);ﻩﻩreturntemp; } catch(Exceptione) {ﻩ }ﻩreturn"";}%><%ﻩConnectioncon;Statementsql;ResultSetrs;ﻩtry{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");} catch(ClassNotFoundExceptione){ﻩ out.println(e); }ﻩcon=DriverManager.getConnection("jdbc:odbc:jspdb","",""); sql=con.createStatement();Stringid=request.getParameter("id");//获取提交的序列号if(id==null){ﻩid="0";}Str_s=request.getParameter("name");//获取提交的商品名称 Stringname=getStr(name_s);Stringcategory_s=request.getParameter("category");//获取提交的分类:ﻩStringcategory=getStr(category_s);ﻩStringproductor_s=request.getParameter("productor");//获取提交的供应商:ﻩStringproductor=getStr(productor_s);ﻩﻩStringprice=request.getParameter("price");//获取提交的单价: if(price==null){price="0";} ﻩStringnumber=request.getParameter("number");//获取提交的数量:if(number==null){number="0";}ﻩStringstr1="INSERTINTOtradeVALUES("+id+",'"+name+"','"+category+"','"+productor+"',"+price+","+number+")";sql.executeUpdate(str1);//执行添加操作。%> <CENTER><P>添加新记录后数据库:<%rs=sql.executeQuery("SELECT*FROMtradeORDERBYid");%> </P> <TABLEborder=""bgcolor="#74bbc0">ﻩﻩ<TR> ﻩ<THwidth=100><fontface="宋体">序列号</font> ﻩﻩ<THwidth=100><fontface="宋体">商品名称</font> <THwidth=50><fontface="宋体">类型</font></TR>ﻩ <THwidth=100><fontface="宋体">供应商</font></TR> <THwidth=50><fontface="宋体">价格</font></TR>ﻩﻩ <THwidth=50><fontface="宋体">数量</font></TR>ﻩﻩ</TR><%ﻩwhile(rs.next()){%>ﻩ <TRalign="center"> ﻩ <TD><%=rs.getInt(1)%></TD>ﻩﻩﻩ<TD><%=rs.getString(2)%></TD>ﻩ ﻩ<TD><%=rs.getString(3)%></TD> ﻩ<TD><%=rs.getString(4)%></TD>ﻩ ﻩ<TD><%=rs.getObject(5)%></TD>ﻩﻩﻩ<TD><%=rs.getInt(6)%></TD>ﻩ </TR><%ﻩﻩ}%> </TABLE>ﻩ</CENTER><%con.close();%></BODY></HTML>运营后,效果如左图。点击“提交”后,效果如右图:本例中,有一个用于解决汉化问题的方法:publicStringgetStr(Stringstr)。假如从前台网页接受到的字符是汉字,就会出现汉化解决问题。这此,必须进行相应的解决,才干被数据库表接受,否则会出现汇编错误。当然这个方法,也可以写在一个jsp文献中,然后在需要它的网页用include指令引起来。例5删除记录程序的编写类似于例5,只是select语句按相应的规定进行改动。如改为:ﻩStringstr1=”deletefromstudentwherenumber=100";ﻩsql.execute(str1);§5.2.5[案例12]一个完整的数据库表的操作:本例完毕操作:新建表users(namechar(12),pwdchar(8))、插入一条记录(“admin”,”pass”)到表中、查询表的第一条记录。请同学们找出这3个操作所相应的语句。网页文献名createtable.jsp<!--createtable.jsp--><%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%><html><head><title>通过JSP创建用户信息表</title></head><body><h2align="center">通过JSP创建用户信息表</h2><hr><%try{ﻩ//启动异常解决ﻩ//加载类com.microsoft.jdbc.sqlserver.SQLServerDriver,并通过newInstance()方法实例化ﻩClass.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();ﻩ//设立url在本地主机1433端口上访问sqlserver数据库,数据库名为jspdb Stringurl="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jspdb";//设立用户名和密码 Stringuser="admin";ﻩStringpassword="";ﻩ//建立与数据库的连接,将连接赋给connﻩConnectionconn=DriverManager.getConnection(url,user,password);ﻩ//通过Connection类的createStatement()方法创建Statement实例,ﻩ//并赋给stmt,以方便操作数据库 Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ﻩ ﻩﻩ ﻩResultSet.CONCUR_UPDATABLE);ﻩ//创建SQL字符串,用于在创建数据表ﻩStringsql="CREATETABLEusers(namechar(12),pwdchar(8))"; //执行SQL命令 stmt.executeUpdate(sql); out.println("数据表users创建完毕!<br>"); //创建SQL字符串,用于在数据表中插入新记录 ﻩ sql="INSERTINTOusers(name,pwd)values('admin','pass')";ﻩ//执行SQL命令 stmt.executeUpdate(sql);ﻩout.println("向数据表users中插入新记录完毕!<br>");ﻩ //通过Statement类的executeQuery()方法创建ResultSet对象rs,以方便对数据表的操作ﻩ sql="SELECT*FROMusers";ﻩ ResultSetrs=stmt.executeQuery(sql);ﻩout.println("查询数据表记录完毕,查询结果存储在rs中。<br>"); ﻩ//移动到数据表的第一条记录ﻩrs.first(); //下面的语句将显示记录中各字段的内容%> 用户名:<%=rs.getObject("name")%><br> 密码:<%=rs.getObject("pwd")%><br><%rs.close();ﻩ //关闭rsstmt.close();ﻩ//关闭stmtconn.close(); //关闭conn} catch(ClassNotFoundExceptione){ﻩﻩout.println("驱动程序类异常!<br>"); out.println(e.getMessage());ﻩﻩ} catch(SQLExceptione){ﻩﻩout.println("数据库连接或SQL查询异常!<br>"); out.println(e.getMessage());ﻩﻩ } catch(Exceptione){ out.println("其他异常!<br>");ﻩﻩ out.println(e.getMessage()); }%> </body></html>运营后,效果如下:注意,这个程序只在第一次运营时是对的的,当再次运营点“刷新”时,就会出现“]数据库中已存在名为'users’的对象”的错误提醒。§5.2.6使用预解决语句对象PreparedStatement和[拓展案例20]使用带参数的SQL语句可以更加灵活和方便地对表进行各种操作,并且增长了程序的安全性。发送带参数的SQL语句由PreparedStatement对象完毕,可以多次执行同一条SQL语句。它也可以用来发送不带参数的SQL语句。ﻩ简朴地说,Statement和PreparedStatement的区别是: Statement语句对象: ﻩStatementsql; ﻩsql=conn.createStatement();rs=sql.executeQuery("SELECT*FROMstudentORDERBY学号");或 Statementstmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ﻩﻩﻩ ﻩ ﻩﻩResultSet.CONCUR_UPDATABLE);rs=stmt.executeQuery("SELECT*FROMstudentORDERBY学号"); PreparedStatement预解决语句对象:PreparedStatementpst;pst=con.prepareStatement(“updatestudentset库存=库存+?where编号=?”);ﻩﻩﻩ //创建的语句对象带有参数,即?问号pst.setInt(1,1000); //设立第一个参数(即第一个问号)=1000pst.setInt(2,i); ﻩ //设立第二个参数(第二个问号)=ipst.executeUpdate(); PreparedStatement类是Statement类的子类,由Connection对象的prepareStatement(Stringsql)方法创建,在创建时就已经把语句写好了,在执行时只需为参数赋值。而Statement类的方法execute()、executeQuery()和executeUpdate()已被更改,不再需要参数。预解决语句PreparedStatement对象的常用方法有:(1)set方法组:这是一组用于设立SQL语句中参数值的方法,如:setInt,setDate等。它们都有两个参数,第一个参数是int类型,表达参数的序号,第二个参数表达要设立的参数的值。(2)clearParameters()方法:清除SQL语句当前参数的值。(3)executeQuery()方法:发送select语句(4)executeUpdate()方法:发送insert、update、delete语句例:下面程序段采用逐条记录更新的方法将表student的10条记录(产品编号从1至10)的库存数量在原基础上增长1000。(updatestudentset库存=库存+1000where编号=1至10)ﻩﻩPreparedStatementpst; ﻩpst=conn.prepareStatement(“updatestudentset库存=库存+?where编号=?”);ﻩﻩfor(inti=1;i<=10;i++){ﻩ pst.setInt(1,1000);ﻩﻩ//设立第一个参数(即第一个问号)=1000 ﻩﻩpst.setInt(2,i); ﻩﻩ//设立第二个参数(第二个问号)=iﻩﻩﻩpst.executeUpdate(); //发送SQL语句ﻩ }[例4_2]修改例4上述的例4:向表trade里添加一条新的记录的网页,其后台网页insert.jsp,也可以用PreparedStatement预解决语句对象,来完毕向表里插入一条记录的工作。 如下所示:网页文献名insert1.jsp(其中关键语句用粗体字标明)<%@pagecontentType="text/html;charset=gb2312"import="java.sql.*"%><HTML><metahttp-equiv="Content-Type"content="text/html;charset=gb2312"/><BODYbgcolor="#72bc95"><%ﻩrequest.setCharacterEncoding("gb2312");ﻩConnectioncon;PreparedStatementpstmt; Statementstmt;ResultSetrs;ﻩtry{Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}ﻩcatch(ClassNotFoundExceptione){ ﻩout.println(e);ﻩ} con=DriverManager.getConnection("jdbc:odbc:jspdb","","");ﻩStringins="insertintotradevalues(?,?,?,?,?,?)";ﻩpstmt=con.prepareStatement(ins);ﻩstmt=con.createStatement();Stringid=request.getParameter("id");//获取提交的序列号if(id==null){ id="0";} ﻩStringname=request.getParameter("name");//获取提交的商品名称Stringcategory=request.getParameter("category");//获取提交的分类: Stringproductor=request.getParameter("productor");//获取提交的供应商: Stringprice=request.getParameter("price");//获取提交的单价: if(price==null){price="0";} ﻩStringnumber=request.getParameter("number");//获取提交的数量:if(number==null){number="0";} intid_i=Integer.parseInt(id);ﻩfloatprice_d=Float.parseFloat(price);ﻩintnumber_d=Integer.parseInt(number);ﻩpstmt.clearParameters();ﻩpstmt.setInt(1,id_i); pstmt.setString(2,name);ﻩpstmt.setString(3,category);ﻩpstmt.setString(4,productor);ﻩpstmt.setFloat(5,price_d);ﻩpstmt.setInt(6,number_d); pstmt.executeUpdate();%> <CENTER><P>添加新记录后数据库:<%rs=stmt.executeQuery("SELECT*FROMtradeORDERBYid");%>ﻩ</P> <TABLEborder=""bgcolor="#74bbc0"> ﻩ<TR>ﻩ ﻩ<THwidth=100><fontface="宋体">序列号</font> ﻩ <THwidth=100><fontface="宋体">商品名称</font> <THwidth=50><fontface="宋体">类型</font></TR>ﻩﻩ <THwidth=100><fontface="宋体">供应商</font></TR>ﻩﻩ <THwidth=50><fontface="宋体">价格</font></TR>ﻩﻩ <THwidth=50><fontface="宋体">数量</font></TR> </TR><% while(rs.next()){%> <TRalign="center">ﻩﻩ <TD><%=rs.getInt(1)%></TD>ﻩ ﻩ<TD><%=rs.getString(2)%></TD>ﻩﻩ <TD><%=rs.g
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2.3 化学反应的方向2025学年高二化学同步教学课件+习题(人教版2019选择性必修1)
- 2025至2030中国建筑设计行业市场深度调研及战略决策及有效策略与实施路径评估报告
- 2025至2030中国宠物家具行业产业运行态势及投资规划深度研究报告
- BIM技术在土木工程教育中的应用探索
- 如何建立有效的房地产项目监控体系
- 德克士的企业社会责任实践
- 几千几百数加减整百数能力监控习题大全附答案
- 几千几百数加减整百数水平考核练习题带答案
- 网络技术服务数据丢失恢复合同
- 农业产业链资源整合与供应合同书
- 风生水起博主的投资周记
- 心脏骤停课件
- 送鲍浩然之浙东(课堂PPT)
- 血栓性浅静脉炎
- 弃渣场施工及方案
- SolidWorks入门教程(很全面)PPT课件
- (管桩)单桩竖向承载力特征值计算表
- 工作联系函-087,088关于铝合金窗门安装滞后影响工期等相关事宜
- 投资公司股权投资管理制度
- 意大利西姆公司双D石灰窑简介
- 小学落实“双减”背景下的作业设计PPT课件
评论
0/150
提交评论