版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 JSP数据库应用开发 本章介绍页面与数据库之间的通讯根据需要,将页面数据保存到数据库中,或者将数据库中的数据展现在页面上,或者执行数据事务处理:数据查询和数据更新。学习目标理解数据源熟悉创建数据源的步骤理解JDBC的连接方式熟悉数据查询技术熟悉数据更新技术主要内容1.WEB数据库程序设计基础 2.JDBC简介 3.JDBC编程基础4 数据查询5.数据更新6.1 Web数据库程序设计基础下面给出一个存取Web数据库的JSP数据库网络架构图,如图所示。 基本上,这是一个B/S存取架构。服务器端由Web服务器和数据库服务器组成,浏览器端只需要一个支持Java的浏览器即可,基本上不需要进行配置
2、。服务器端的Web服务器负责执行JSP程序,JSP程序通过JDBC(Java DataBase Connectivity)接口和数据库服务器相连,并取得数据库中的数据。 也可以通过JDBC向数据库发送SQL命令,对数据库进行新增、删除和修改记录等操作,这一切都需要依靠JDBC提供的类与方法来完成。Web服务器还有一项工作,就是将用户操作数据库的结果,以HTML的形式通过HTTP,回传给前端的浏览器。JDBC简介 JDBC(Java DataBase Connectivity,Java数据库连接),是Sun公司制定的Java连接数据库技术的简称。它是Java环境中访问SQL数据库的一组API(A
3、pplication Programming Interface,应用程序接口) 。包括一些用JAVA语言编写的类和接口,能方便的向任何关系型数据库发送SQL命令。为Java开发者使用数据库提供了统一的API。 6.2 JDBC简介JDBC设计的目的:它是一种规范,设计出它的最主要的目的是让各个数据库开发商为Java程序员提供标准的数据库访问类和接口,使得独立于DBMS的Java应用程序的开发成为可能(数据库改变,驱动程序跟着改变,但应用程序不变)。JDBC的主要功能: 1)创建与数据库的连接; 2)发送SQL语句到任何关系型数据库中; 3)处理数据并查询结果。JDBC提供了四种连接数据库的驱
4、动程序方法。JDBC-ODBC桥(JDBC-ODBC Bridge)驱动程序。本机代码和Java驱动程序。纯Java驱动程序。本机协议Java驱动程序。6.2.1 JDBC-ODBC桥 这是Sun公司最早实现的JDBC 驱动程序,当时主要目的在于快速推广JDBC,以便业界接纳这个标准。实际上这种驱动程序就是把JDBC API映射到ODBC API上。JDBC-ODBC 桥接方式利用微软的开放数据库互连接口(ODBC API)同数据库服务器通讯,客户端计算机首先应该安装并配置ODBC driver 和JDBC-ODBC bridge两种驱动程序。 利用JDBC-ODBC桥将JDBC数据转换成OD
5、BC数据源,然后再利用ODBC与数据库连接。用JDBC-ODBC方式连接数据库这种连接方式分三个步骤:首先,创建一个数据源;其次,加载JDBC-ODBC驱动程序;第三步,建立一个到数据库的连接。 数据源是对数据库的一种映射。我们可以把数据源理解为数据库本身,一个数据源对应一个数据库。6.2.2本机代码和Java驱动程序这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。这种驱动方式将数据库厂商的特殊协议转换成Java代码及二进制类码,使Java 数据库客户方与数据库服务器方通信。例如:Oracle用SQLNet协议,D
6、B2用IBM 的数据库协议。数据库厂商的特殊协议也应该被安装在客户机上。6.2.3纯Java驱动程序这种方式是纯Java driver。数据库客户以标准网络协议(如HTTP、SHTTP)同数据库访问服务器通信,数据库访问服务器然后翻译标准网络协议成为数据库厂商的专有特殊数据库访问协议(也可能用到ODBC driver)与数据库通信。 6.2.4 本机协议Java驱动程序采用本机协议Java驱动程序方式连接数据库直接将JDBC请求转换为指定数据库协议可接受的请求,并进行调用。这种连接方式分三个步骤:首先,创建一个数据源;其次,加载mssqlserver驱动程序;第三步,建立一个到数据库的连接。6
7、.2.5 连接数据库例1:jdbc-odbc的连接方式 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver); con=DriverManager.getConnection(jdbc:odbc:grade, , );或 Class.forName(sun.jdbc.odbc.JdbcOdbcDriver) con=DriverManager.getConnection(“jdbc:odbc:university?user=“sa”&password=“sa” );例2:本机协议Java驱动程序 Class.forName(com.microsoft.jdbc
8、.sqlserver.SQLServerDriver); url=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=university2; con=DriverManager.getConnection(url,sa,sa);以SQL server 为例( SQL server 2005安装)启动SQL Server Management新建数据库university数据表的建立与管理-建立student和students表并插入数据studentstudents下载jar包。加载mssqlserver驱动程序Class.forNam
9、e(“com.microsoft.jdbc.sqlserver.SQLServerDriver“)创建一个连接对象。下面是创建连接对象的静态方法: public static Connection getConnection(String url,String user, String password) throws SQLException 假设数据源名是 “university2”,用户登录系统的帐号是sa/sa。下面是获得连接对象的方法: url=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=university2; con
10、=DriverManager.getConnection(url,sa,sa);/建立与数据库的连接以Microsoft Access数据库为例。假设已创建了数据库db.mdb(保存在E:db.mdb目录下)。为该数据库创建数据源的步骤如下:1在管理工具中选择ODBC数据源 ,如图6-1所示。2双击ODBC数据源图标,出现如图6-2所示界面。该图显示了User DSN选项卡中的已有数据源的名称。图6-2 显示已有user数据源3单击Add按钮,增加新的数据源,如图6-3所示。此对话框,为新增加的数据源选择驱动程序。图6-3 选择驱动程序4因为要访问 Microsoft Access数据库,选择
11、Micosoft Access Driver(*.mdb) 选项,单击完成按钮(为数据源选择了驱动程序),出现了设置数据源具体项目的对话框,如图6-4所示。图6-4 配置数据源5在数据源名(N) 后的文本框中为数据源起一个名字,这里起的名字是grade(可以起别的名字),点击 选择(S)按钮,为数据源grade选择数据库,这里选择的数据库是E:db.mdb。配置情况如图6-5所示。图6-5 配置情况6最后点击 确定 按钮,完成了数据源的配置,出现对话框如图6-6所示。在该对话框中,点击确定 按钮,完成数据源grade的配置。图6-6 配置完成JDBC-ODBC桥接器就是把应用程序与数据源连接起
12、来的驱动程序。因此,创建了数据源以后,还要加载JDBC-ODBC桥接器,即加载驱动程序。下面是加载驱动程序的方式: Class.forName(sun .jdbc.odbc.JdbcOdbcDriver); 通过Class类的静态方法forName(String driver) 加载JDBC-ODBC桥接器。创建了数据源,加载了驱动程序,应用程序还是不能连接到数据库。应用程序要访问数据库,还必须创建一个到数据库的连接。即创建一个连接对象。下面是创建连接对象的静态方法:public static Connection getConnection(String url,String user, S
13、tring password) throws SQLException 例如:con=DriverManager.getConnection(“jdbc:odbc:grade”,”,” );6.3JDBC编程6.3.1JDBC中常用的类和接口DriverManager类 DriverManager类对象负责管理注册到DriverManager 中的JDBC驱动程序,使用DriverManager的方法getConnection()可以生成Connection对象。Connection类 Connection类对象实现与数据源的连接,通过Connection类的createStatement()
14、方法可以生成Statement对象。Statement接口 用于发送简单的SQL语句,实现SQL语句的执行,用于执行静态 SQL 语句并返回它所生成结果的对象。 。ResultSet接口 实现对数据的处理,维护记录指针,记录指针所指记录为当前记录。ResultSet对象用于包含符合SQL语句中条件的所有记录,并且通过一套get方法提供了对这些记录中数据的访问。PreparedStatement接口 用于发送带有一个或多个输入参数(IN参数)的SQL语句,PreparedStatement对象代表一个预编译的SQL语句。执行速度较快,需要执行多次的语句应该创建为PreparedStatement
15、对象。 PreparedStatement对象中的SQL语句可具有若干个参数,执行语句前用setXXX方法来提供。ResultSetMetaData类 ResultSetMetaData类对象保存所有ResultSet对象中关于字段的信息,并提供许多方法来取得这些信息。DatabaseMetaData类 DatabaseMetaData类保存了数据库的所有特征信息,并且提供许多方法来取得这些信息。SQLException类 当访问或查询数据库时抛出的异常。6.3.2 JDBC访问数据库的主要步骤JDBC对数据库的操作通过多个JDBC的类/接口来实现,主要包括:DriverManager类、Co
16、nnection接口、Statement接口和ResultSet接口。 通过这些类和接口,可以按如下步骤和数据库建立起连接,并操作数据库。加载JDBC驱动程序。获取连接接口。创建Statement对象。执行Statement对象。查看返回的结果集。关闭结果集对象。关闭Statement对象。关闭连接接口。(1)JSP代码通过带参数调用Class.forName()方法,将DriverManager类实例化、加载驱动程序。(2)在JSP中调用 DriverManager.getConnection()方法取得 一个Connection对象,以此连接到数据库。(3)通过Connection.cre
17、ateStatement()方法创建一个Statement对象,以此来访问数据库表中的记录。(4)在JSP代码中通过Statement.executeQuery()方法或Statement.executeUpdate()方法来查询或更新数据库记录。(5)如果执行了一个查询,可以通过JSP代码来处理Statement.executeQuery()方法所返回的ResultSet对象,通过该对象可以进行数据库记录的浏览、新增、删除和修改。(6)完成数据库操作后,依次调用各个对象的Close()方法,关闭数据库连接,释放JDBC资源。 Connection con; Statement sql; Re
18、sultSet rs; String url; try Class.forName(com.microsoft.jdbc.sqlserver.SQLServerDriver); url=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=university2; con=DriverManager.getConnection(url,sa,sa); sql=con.createStatement(); rs=sql.executeQuery(SELECT * FROM students); 6.3.3常用类及方法的介绍DriverMana
19、ger类 DriverManager类负责管理JDBC驱动程序,是JDBC的管理层,作用于用户和驱动程序之间。在数据库和相应驱动程序之间建立连接,以便将Java应用程序能够使用正确的JDBC驱动程序。DriverManager类中包含一系列Driver类,他们通过调用DriverManager.registerDriver进行注册。所有的Driver类都必须包含一个静态方法,利用这个静态方法可以创建该类的实例,然后在加载该类实例时向DriverManager类进行注册。DriverManager类常用方法如下: Class.forName(String driver):forName()方法用
20、于加载注册驱动程序。各类数据库JDBC驱动程序名及连接字符串汇总 Static Connection getConnection (String url,String user,String password) throws SQLException:getConnection()方法用于取得对数据库的连接。 JDBC中URL的标准语法是: jdbc::,其中subprotocol说明了使用哪种JDBC驱动程序,比如若使用的是JDBC-ODBC Bridge,就写为“odbc” Subname则为驱动程序提供了连接数据库所需要的一切信息:比如:jdbc:microsoft:sqlserver:
21、/localhost:1433;DatabaseName=university2,表示使用微软的sqlserver JDBC驱动程序,且连接安装在名为localhost的服务器的1433端口的university2数据库。 Static Driver getDriver(String url) throws SQLExcetion:getDriver()方法用于在已经向DriverManager注册的驱动程序中寻找一个能够打开url所指定的数据库的驱动程序。举例 SqlserverClass.forName(com.microsoft.jdbc.sqlserver.SQLServerDrive
22、r)url=jdbc:microsoft:sqlserver:/localhost:1433;DatabaseName=university2;con=DriverManager.getConnection(url,sa,sa);MysqlClass.forName(org.gjt.mm.mysql.Driver);con=DriverManager.getConnection(jdbc:mysql:/localhost:3306/student, root, root );Connection类 Connection类负责维护JSP数据库程序和数据库之间的连接,Connection对象代表与
23、数据库的连接,连接过程包括所执行的SQL语句和在该连接上所返回的结果。一个应用程序可与单个数据库建立一个或多个连接,或者可与多个数据库建立连接。Connection类的常用方法如下。 Statement createStatement () throws SQLException; Statement createStatement (int resultSetType,int resultSetConcurrency) throws SQLException createStatement()方法用于建立Statement类对象。% String url,sql; Connection co
24、n; ResultSet rs; Statement stmt; try Class.forName(com.mysql.jdbc.Driver); url=jdbc:mysql:/localhost:3306/lj; con=DriverManager.getConnection(url,“root”,“lijing);stmt=con.createStatement(); sql=SELECT * FROM students ; rs=stmt.executeQuery(sql); 第一个形参指明结果集游标的类型,通过游标来读取结果集中的记录。游标类型的取值用符号常量表示主要有三个:参 数
25、 值说 明TYPE_FORWARD_ONLY结果集不可滚动TYPE_SCROLL_INSENSITIVE结果集可滚动,不反映数据库的变化TYPE_SCROLL_SENSITIVE结果集可滚动,反映数据库的变化第二个形参指明结果集的并发性,并发控制是指多名用户同时更新行时,用于保护数据库完整性的技术。不正确的并发可能导致脏读、幻读和不可重复读等问题。ResultSet中并发控制常用的取值主要有两个:ResultSet.CONCUR_READ_ONLY,它是只读的,不允许通过游标进行更新ResultSet.CONCUR_UPDATABLE,它是乐观读写,不锁定行。参数resultSetType的取
26、值参 数 值说 明TYPE_FORWARD_ONLY结果集不可滚动TYPE_SCROLL_INSENSITIVE结果集可滚动,不反映数据库的变化TYPE_SCROLL_SENSITIVE结果集可滚动,反映数据库的变化参数resultSetConcurrency的取值参 数 值说 明CONCUR_READ_ONLY不能用结果集更新数据CONCUR_UPDATABLE能用结果集更新数据try Class.forName(com.mysql.jdbc.Driver); url=jdbc:mysql:/localhost:3306/lj; con=DriverManager.getConnection
27、(url,root,lijing); stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); sql=SELECT * FROM students ; rs=stmt.executeQuery(sql); rs.absolute(1); rs.updateString(2, AINH); rs.updateInt(3,100);rs.updateInt(4,100); rs.updateInt(5,100); PreparedStatement prepareStatemen
28、t (String sql) throws SQLException prepareStatement()方法用于通过参数中的SQL语句建立PreparedStatement类对象。 void close() throws SQLException 关闭连接。boolean isClosed() throws SQLException 查询Connection是否被关闭。boolean getAutoCommit() throws SQLException 返回Connection类对象的自动提交方式(AutoCommit)。void setAutoCommit (boolean enable
29、 AutoCommit) throws SQLException 设置Connection类对象的自动提交方式。形参取值为true,表示连接处于自动事务提交模式,则连接将接收到的一条SQL语句当作一个独立的事务提交。形参取值为false,则表示连接处于JDBC手动事务提交模式,通过调用commit()手动提交事务。public synchrioned void commit()throws SQLException 提交上次永久提交或回滚事务后所发生的变化并释放该Connection所锁定的数据库。 void rollback() throws SQLException 回滚事务。Statem
30、ent类 通过Statement类所提供的方法,可以利用标准的SQL命令,对数据库直接进行新增、删除或修改记录(Record)的操作。其常用方法如下ResultSet executeQuery (String sql) throws SQLException 支持使用SELECT语句对数据库进行查询。int executeUpdate (String sql) throws SQLException 支持使用INSERT、DELETE、UPDATE等语句对数据库进行新增、删除和修改操作。void close() throws SQLException 关闭Statement类对象。创建Stat
31、ement对象 Statement stmt=con.createStatement();Statement执行sql语句的方法ResultSet executeQuery (String sql) throws SQLException以SQL语句为参数,执行SQL查询语句,并返回单个ResultSet对象例如:Statement stmt=con.createStatement();String sql = “select * from student”;ResultSet rs = stmt. executeQuery(sql);public int executeUpdate(Stri
32、ng sql) throws SQLException以SQL语句为参数,执行SQL更新语句及DDL语句,如insert、delete、update、create、drop等,返回值为受影响的行数。例如 Statement stmt=con.createStatement();String sql = “delete from student where Sno=“+” 2005001 ”;int i = stmt. executeUpdate(sql);public boolean execute () throws Exception用于执行事先不知道类型的SQL语句,既可以执行查询语句也
33、可以执行更新语句。返回:如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false 。然后,使用方法 getResultSet() 或 getUpdateCount() 来检索结果 。ResultSet类 Statement实例执行一个SQL语句之后会得到一个ResultSet对象,称为结果集,是符合条件的所有行的集合。 ResultSet类提供一系列的方法来实现SQL命令。此外,ResultSet类对象还负责维护记录指针(Cursor,也称游标),记录指针总是指向数据表中的某个记录。ResultSet类常用方法有很多,下面将按其作用分
34、类进行介绍。维护记录指针boolean absolute (int row) throws SQLException 移动记录指针到指定的记录,row指定了目标行的绝对行号,绝对行号由记录集的第一行开始计算(注意,不是相对行号)。boolean relative (int rows) throws SQLException 将游标移动相对行数,rows为正数或负数,表示目标行相对于当前行的移动行数。例如,当前行是第3行,现在需要移动到第5行,可以使用absolute()方法,语句如下:rs.absolute(5);也可以使用relative()方法,语句如下:rs.relative(2);vo
35、id beforeFirst () throws SQLException 移动记录指针到第一条记录之前,即位于记录集第一行的前面。如果记录集不包含任何的行时,该方法不产生作用。void afterLast () throws SQLException 移动记录指针到最后一条记录之后,即位于记录集最后一行的后面。如果记录集不包含任何行时,该方法不产生作用。boolean first() throws SQLException 移动记录指针到第一条记录。boolean last() throws SQLException 移动记录指针到最后一条记录。boolean next() throws S
36、QLException 移动记录指针到下一条记录。将ResultSet对象中的记录指针移到下一条记录处,如果成功移动返回true,移动失败返回false。一般利用此方法来构造一个遍历结果集的循环 boolean previous() throws SQLException 移动记录指针到上一条记录boolean isLast()throws SQLException 检查当前行是否是记录集的最后一行,如果是则返回true,否则返回falseboolean isAfterLast()throws SQLException 检查数据库指针是否处于记录集的最后面,如果是则返回true,否则返回fal
37、se。boolean isBeforeFirst()throws SQLException 检查数据库指针是否处于记录集的最前面,如果是则返回true,否则返回false。boolean isFirst() throws SQLException 检查当前行是否是记录集的第一行,如果是则返回true,否则返回false。维护记录void insertRow() throws SQLException 新增一条记录到数据库中。void updateRow() throws SQLException 更新数据库中被修改的行。void updateXXX(int columnIndex,XXX x)
38、 throws SQLException void updateXXX(String columnName , XXX x) throws SQLException 用某类型的数据x去修改指定字段的值,这里的XXX是类型名。例 rs.updateString(1,abc); rs.updateString(name,abc);XXX getXXX(int columnIndex) throws SQLException XXX getXXX(tring columnName) throws SQLException 取得指定字段的值,这里的XXX是类型名。例:String s=rs.getSt
39、ring(name); int s=rs.getInt(1);void deleteRow(int Index) throws SQLException 删除记录指针指向的记录。6.4 数据查询按照查询的方式不同,将查询分为顺序查询、游动查询、随机查询、参数查询、排序查询、使用通配符查询。这种查询中,获得的结果集(ResultSet对象)中的游标只能一行行地向下移动。既不能向上移动游标,也不能跳行移动游标。 ResultSet对象由若干行组成。ResultSet对象一次只能看到一个数据行,使用next()方法,使游标移到下一行记录。ResultSet对象可以用字段索引(第一列是1,第二列是2等
40、等)为参数,获得对应的字段值(记录中的数据项),如方法getXxx(int columnIndex);也可以用字段名为参数,获得对应的字段值(记录中的数据项),如方法getXxx(String columnName)。ResultSet对象的常用方法如表6-1所示。6.4.1 顺序查询ResultSet类的常用方法返回类型方法名称booleannext()bytegetByte(int columnIndex)DategetDate(int columnIndex)DoublegetDouble(int columnIndex)FloatgetFloat(int columnIndex)int
41、getInt(int columnIndex)LonggetLong(int columnIndex)StringgetString(int columnIndex)bytegetByte(String columnName)DategetDate(String columnName)DoublegetDouble(String columnName)FloatgetFloat(String columnName)intgetInt(String columnName)LonggetLong(String columnName)StringgetString(String columnName
42、)例6.1 查询英语成绩及格的学生。学生成绩保存在表(students)中,表结构为sudents(number,name,math,english,phics)。在lj库中创建表students。程序结构:程序名:sequence.jsp程序算法: 1.分别声明连接类型,语句类型,结果集类型的变量:con sql rs stmt 。 2.加载驱动程序。 3.获取连接对象:con 4.获取语句对象:sql 5.获取结果集对象:rs 6.输出表头 7.输出结果集(rs)中的所有记录 有时,我们需要在结果集中前后移动游标,以便获取某条记录。这时,我们必须返回一个可滚动的结果集。为了获取可滚动的结果
43、集,我们必须使用下述方法先获得一个Statement对象: Statement stmt= conncreateStatement(int type,int concurrency ) ; 通过上述Statement对象获得的结果集是可滚动结果集。可滚动结果集(ResultSet)还可用到的方法如下: 6.4.2 游动查询public boolean previous() 将游标向上移动,该方法返回boolean型数据,当移动结果集第一行之前时返回false。public void beforeFirst() 将游标移到结果集的初始位置,即在第一行之前。public void afterLas
44、t() 将游标移到结果集最后一行之后public void first() 将游标移到结果集的第一行。public void last() 将游标移到结果集的最后一行。public boolean isAfterLast() 判断游标是否在最后一行之后。public boolean isBeforeFirst() 判断游标是否在第一行之前。public boolean isFirst() 判断游标是否指向结果集的第一行。public boolean isLast() 判断游标是否指向结果集的最后一行。public int getRow() 得到当前游标所指向的行号。行号从1开始,如果结果集没有
45、行,返回0。public boolean absolute(int row) 将游标移到参数row指定的行号。 说明:如果row取负值,就是倒数的行数。asolute(-1)表示移到最后一行,asolute(-2)表示移到倒数第二行。当移到第一行前面或最后一行的后面时,该方法返回false。例6.2 从表(students)的最后一行开始,以逆序方式输出记录。然后单独输出物理表中的第5条记录。问题分析: 从题目要求可知,结果集中的游标必须能上下游动,因此,必须用带参数的createStatement(int type,int concurrency )方法创建Statement类型的对象。程序
46、结构: 程序名:move.jsp1. 分别声明连接类型,语句类型,结果集类型的变量: con/sql/rs 。2. 加载驱动程序。3. 获取连接对象:con4. 获取语句对象:sql5. 获取结果集对象:rs6. 游标移到最后一行7. 获取最后一行的行号8. 输出记录数9. 输出表头10.将游标移动到最后一行之后11.逆序输出输出结果集(rs)中的所有记录(从表的最后一行开始输出记录)12.将游标移到第5条记录13.输出第5条记录。程序算法 例 6.4 对学生表(students)分别按姓名查询。问题分析:由两个页面完成此功能。一个页面提供查询输入界面;一个页面按姓名查询数据。程序结构:nam
47、e.jsp页面提供查询条件输入窗口,按姓名查询时,其姓名参数被提交给byname.jsp页面。byname.jsp页面查询出指定姓名的学生;两个页面的交互关系如图所示。6.4.3 参数查询name.jsp页面byname.jsp页面按姓名查询程序算法name.jsp:.创建一个表单,该表单包含一个文本框,文本框用于录入姓名。byname.jsp:1获取表单中的姓名参数:name2分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs 。3加载驱动程序。4获取连接对象:con5获取语句对象:sql6构造SQL语句字符串:condition7获取结果集对象:rs8输出表头9输出结果集(
48、rs)中的所有记录name.jspbyname.jsp结果显示例6.4从学生表(students)中随机抽取n条记录,并计算n条记录的数学成绩的平均值。问题分析: 产生1到n之间的随机数计算公式如下:int i=(int)(Math.random()*n+1);i的值是1到n之间的随机数。在程序中,根据该随机数,把游标移到相应的行,并输出该行。程序结构: 程序名:random.jsp6.4.4 随机查询1分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs 。加载驱动程序。获取连接对象:con获取语句对象:sql获取结果集对象:rs产生随机数,以每个数字对象为行号,输出该行号对应
49、的记录。 7 . 求出记录数学成绩的平均值,并输出平均值。程序算法random.jsp问题:输入数据过大?注意1.获取表中记录总数:number2.向vector中添加number个Integer型对象(该对象保存了表的行号)。3.生成范围为vector.size()大小的随机数i,使用elementAt(i)取出该处的值。10. 以该值为行号,输出该行号对应的记录。11.求出记录数学成绩的平均值,并输出平均值。问题:重复取值?注意:向vector中添加n个Integer型对象注意:以随机数为下标,取出该处整数值 可以在SQL语句中使用order by子句对查询记录进行排序。例6.5 对学生表
50、(students)选择排序方式(按姓名、英语成绩、总成绩)进行排序,输出成绩。程序结构: order.jsp页面将排序方式提交给byorder.jsp页面;byorder.jsp页面根据排序方式,查询数据并输出。程序算法: order.jsp 创建一个表单,包含三个单选按钮,每个单选按钮代表一种排序方式。 6.4.5排序查询byorder.jsp:1从表单中获取排序方式,保存到变量name中。2. 分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs 。3加载驱动程序。4获取连接对象:con5获取语句对象:sql6构造SQL语句字符串(condition),该串指定了记录的排序
51、方式。7获取结果集对象:rs8输出表头9输出结果集(rs)中的所有记录 order.jspbyorder.jsp结果显示6.5 数据更新数据更新操作包括添加数据、修改数据、删除数据。6.5.1 插入数据6.5.2 数据修改6.5.3 数据删除插入数据是把新的记录插入到一个存在的表中【命令】 INSERT INTO (,) VALUES(,) 【功能】 将新记录插入到指定的表中,分别用表达式1、表达式2等为字段名1、字段名2等赋值。3. 【说明】 是指要插入新记录的表;是可选项,指定待添加数据的列;VALUES子句指定待添加数据的具体值。 列名的排列顺序不一定要和表定义时的顺序一致。但当指定字段
52、名时,VALUES子句表达式的排列顺序必须和字段名的排列顺序一致,个数相等,数据类型一一对应。INTO语句中没有出现的列名,新记录在这些列上将取空值6.5.1插入数据 通过JSP向数据库中添加记录的基本方法是:提供一个表单页供用户输入记录数据,提交表单后,后台JSP程序从表单中读取数据,构造SQL语句,将数据添加到数据库中。例6.6 向表(students)中添加记录。程序结构: insert.jsp页面将录入的数据提交给onInsert.jsp页面;onInsert.jsp页将数据添加到表(students)中,并显示添加数据后表中的记录。两个页面的交互关系如图所示。insert.jsp页面
53、onInsert.jsp页面添加记录程序算法:insert.jsp: 1. 创建一个表单,包含5个文本框,分别用于录入学号(number),姓名(name),数学(math),英语(english),物理(physics)成绩。 2输出添加记录前表(students)中的记录。2012ch06wholeinsertinsert.jsponInsert.jsp:1从表单中获取录入的数据分别保存到以下变量中:number/name/m/e/p。 2分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs 。3加载驱动程序。4获取连接对象:con5获取语句对象:sql6构造SQL插入语句字
54、符串:condition。7执行添加操作8输出添加记录后的表中全部数据。insert.jsponInsert.jsp注意:SQL语句中变量的处理问题:姓名字段为空?wholeinsertinsertSucc.jsp 修改数据记录可以使用UPDATE语句对表中的一行或多行记录的某些列值进行修改。 UPDATE语句 6.5.2 修改数据 UPDATE table_name SET column_name=expression WHERE search_conditionsUPDATE table_name SET column_name=expression WHERE search_condit
55、ions将要被更新的表的表名。UPDATE table_name SET column_name=expression WHERE search_conditions指定要修改数据的字段名。UPDATE table_name SET column_name=expression WHERE search_conditions指定字段的新值,可以是一个常数、表达式或变量。UPDATE table_name SET column_name=expression WHERE search_conditions例如,如下语句将表students中所有数学成绩都降20%:UPDATE students
56、SET math=math*0.8UPDATE table_name SET column_name=expression WHERE search_conditions指定搜索条件。只有满足条件的记录才会被修改。UPDATE table_name SET column_name=expression WHERE search_conditions例如,将表students中学号为0001学生的成绩置零:UPDATE students SET math=0,english=0,physics=0 WHERE number=0001UPDATE table_name SET column_nam
57、e=expression WHERE search_conditions如果省略WHERE选项,则将修改数据表中的所有记录。 Statement对象的调用方法: int executeUpdate (String sql) throws SQLException 使用参数sql指定的方式对数据库表中记录的字段值进行修改。 例:将studnets表中学号为0010学生的姓名修改为王明 i=stmt.executeUpdate(“update students set name=王明 where number=0010”); 例6.7 将students表中的所有同学的成绩置零。算法:1、分别声明
58、连接类型,语句类型,结果集类型的变量:2加载驱动程序。3获取连接对象:con4获取语句对象:stmt5构造SQL插入语句字符串:condition。6执行修改操作通过JSP修改记录值的基本思路第一种:用户输入修改信息并提交,表单提交后程序从表单中读出数据构建SQL语句,将新的记录值更新至数据库中。 例6.8 根据用户的输入,修改表(students)中的某些数据。 程序结构: update.jsp页面将要修改的数据提交给onUpdate.jsp页面;onUpdate.jsp页面执行数据修改,并将修改后的表数据显示出来。两页面的交互关系如图所示。update.jsp页面onUpdate.jsp页
59、面执行修改程序算法:update.jsp1. 创建表单,该表单包含5个文本框,分别用于录入学号(number),姓名(name),数学成绩(math),英语成绩(english),物理成绩(physics)。1从表单中获取关键字学号:newNumber2. 从表单中获取修改后的数据(newName/newMath/newEnglish/newPhysics)3分别声明连接类型,语句类型,结果集类型的变量:con/sql/rs 。4加载驱动程序。5获取连接对象:con。6获取语句对象:stmt。7. 构造SQL语句字符串:condition1。8执行修改操作。9显示修改后的表的记录。 onUpd
60、ate.jspupdate.jsp onUpdate.jsp注意:编码转换注意:SQL语句中变量的处理http:/:8080/whole/update/temp/update.jsp问题1: 非正常输入,学号为空?思路:在update.jsp页面添加表单验证,数据不为空时才允许提交到onUpdate.jsp页面。Update.jsp页面的修改:问题2: 非正常输入,成绩为空?思路:在onUpdate.jsp页面添加判断,如果成绩文本框输入为空,则成绩置零。问题3: 非正常输入,学号不存在?思路:先根据用户输入的学号查找,如果找到该学号信息再修改,否则不修改。onUpdate.jsp页面的修改问
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026 学龄前自闭症家校启蒙课件
- 年会领导讲话稿
- 工会读书活动总结
- 体育场馆工程技术标准
- 2026年塑料粉尘防爆方案及处理注意事项
- 岗位责任制及考核标准
- 输尿管结石取出术前护理常规
- 2026年养老机构环境卫生管理规范
- 事故报告记录
- 【完整版】基坑周边道路沉降控制方案
- 2026年广东省中考语文二模试卷(含详细答案解析)
- 贵州国企招聘2025贵州贵水投资发展有限公司贵阳分公司招聘20人笔试历年备考题库附带答案详解
- 煤矿竣工验收报告
- 2026年保山市昌宁县人民医院编制外合同制专业技术人员招聘(22人)考试备考题库及答案解析
- 耳鼻喉科电子喉镜检查操作规范
- 露天矿山综合信息管理与监控系统技术方案
- 武威市2026事业单位联考-综合应用能力A类综合管理模拟卷(含答案)
- 2026重庆市纪委监委驻重庆银行纪检监察组遴选3人备考题库【巩固】附答案详解
- 钢筋混凝土管管道吊装方案
- 旅馆业管理人员责任制度
- 2025年历年辽水集团笔试真题及答案
评论
0/150
提交评论