回麻雀苑主页 到麻雀苑-搜狐博客
4-6动态网页查询数据库数据
作者:老麻雀
2006-11-5 10:05:05
动态网页查询数据库数据
JSP动态网页连接访问数据库,查询数据的操作使用频率最高,而且查询的方式多种多样。本节主要介绍,查询数据库动态网页代码的基本构成。模糊查询、分类查询等将在第七节进行介绍。
一、范例的演示和代码清单
本节演示数据库数据查询操作的范例,仍然是第四节的动态网页ch4-32.jsp。由于演示前提、演示步骤、代码清单和上第四节完全相同,这里也不再重复叙述。而是直接进行代码分析,本节着重分析网页代码的整体结构,以及查询数据代码的基本构成。
二、动态网页的代码分析
动态网页ch4-32.jsp读取数据库的数据,并将数据送到屏幕上显示,经过了连接数据库、使用“结果集”读取数据、将数据传递给JSP变量、屏幕显示等几个步骤。代码的结构分为如下几个部分:
第一部分: 调用java.sql专用包(第9行)。定义三个字符串变量,用于承载JDBC驱动、连接数据库url参数的内容、要运行的SQL语句内容(第11-13行)。
这一部分等同于上一节的第一部分和第三部分,只是第13行给sql变量赋的值,是SQL查询语句。
13)String sql="select * from st";
其余的代码内容、代码作用都和上一节完全相同,不再重复介绍。
第二部分: 定义若干个JSP字符串变量,用于接收传送数据库数据(第14行)
14) String temp1,temp2,temp3,temp4,temp5,temp6;
第14行,定义了六个字符串变量,变量的数量和数据库表中的字段数量一致。它用于接收“结果集”中每条记录的数据,因此数据记录有多少个字段,就要有多少个变量。以便对应接收、传送数据。
第三部分: 加载JDBC-ODBC桥驱动。连接Access数据库;(第15行-26行)
这一部分等同于上一节的第四部分和第五部分,代码内容、代码作用都和上一节完全相同,不再重复介绍。
第四部分: 定义结果集,读取数据库数据(第27行-29行)
27) ResultSet rs;
28) Statement stmt=conn.createStatement();
29) rs=stmt.executeQuery(sql);
第27行,声明一个结果集rs,rs是结果集的名称,读者可以使用任何字母自由命名。结果集类似于一个数组,从数据库表中读取的数据,都将存放在结果集中。
第28行,为执行SQL语句,准备好一个Statement对象,stmt是对象的名称,对象名读者可以使用任何字母自由命名。这个对象中有对数据库写操作、读操作的方法。
第29行,使用Statement的executeQuery方法,运行SQL查询语句。并将查询结果存放到结果集rs中。语句中()括弧内的sql,是被运行的查询数据的SQL语句。(见第13行代码)
第五部分: 将数据从结果集中读出,并送到屏幕上显示(第31行-41行)
31) out.println("<table border=1><tr align=center><td>班级<td>学号<td>姓名<td>性别<td> 密码<td>E-mail<tr>");
32) while(rs.next())
33) {
34) temp1=rs.getString(1);
35) temp2=rs.getString(2);
36) temp3=rs.getString(3);
37) temp4=rs.getString(4);
38) temp5=rs.getString(5);
39) temp6=rs.getString(6);
40) out.print("<tr><td>" +temp1 +"<td align=center>" +temp2 +"<td align=center>"+temp3 + "<td align=center>" +temp4+"<td align=center>"+temp5 +"<td align=center>" +temp6 +"</a> <tr>");
41) }
这十行代码将结果集中的数据,按照数据记录的顺序,逐条读出,并用表格的形式送到屏幕上显示。
第32行while是循环语句的关键字,第33行与41行的一组{ }大括弧中的32-40行构成循环语句的循环体。循环的条件是rs.next(),next()是结果集的一个方法,它把数据指针移动到下一条记录。while(rs.next())二者结合形成的结果就是,每次循环,指针指向下一条记录,同判断是否移动成功,如果移动成功,将循环体的语句执行一遍;如果移动失败,说明已经没有数据记录了,停止执行循环体的语句。这样循环体中的语句就能将结果集的数据,逐条处理。
第34-39行是读取结果集的数据,并将读取的每一个数据,赋值传送给事先定义好的变量。第34行temp1=rs.getString(1);的含义是,将第一个字段的数据读出来,赋值传送给变量temp1。第35-39行是分别处理结果集中的第二个到第六个字段。
因为这些语句在循环体中,第一遍运行时,读取传送的是第一条记录的数据。第二遍运行时,读取传送的是第二条记录的数据。经过若干次循环,就可以将结果集中的每一条记录,全都处理完成。
第31行和第40行,是将数据送到屏幕上显示的语句。
第31行建立一个表格,并将表格第一行每个单元格的内容,设置输出数据库表中每个字段的名称。因为第31行在循环体之外,它只能显示输出一次,从而形成了表格的(表头)标题行。
第40行创建一个表格行,并将该行每个单元格的内容,设置输出temo1-temp6每个变量的值。因为第40行在循环体之内,每次循环被赋值的内容不同,每次循环temo1-temp6六个变量的值,是该次循环从结果集中读取的每一条记录的数据。这样循环一次创建一个表格行,输出一条记录的数据。就将结果集中的所有数据,逐条按行送到屏幕上显示了。
当然表格的结束标记</tebel>不能缺少,它被放置在了第52行。
补充说明:
第35-39行,读取结果集数据的语句,
可以将temp1=rs.getString(1) 写成temp1=rs.getString(班级);
将temp1=rs.getString(2) 写成temp1=rs.getString(学号);
将temp1=rs.getString(3) 写成temp1=rs.getString(姓名);
……
这是读取结果集数据语句的另一种格式,使用这种格式,能够更清楚的表达代码含义。更重要的是,当需要只读取某一个字段时,编写代码不用查对该字段的排列顺序。
这个范例的代码,读者务必要熟读。下面的范例中要多次使用这个范例,以及这个范例的变形(只增加改动少数的代码行),清楚的理解了重要代码行的含义,对于下面范例的学习,将是事半功倍的效果。
| 我也说两句 |
 游客于2008-10-20 14:56:07写道: rwe |
|
发文时请务必注意: 一、遵守国家相关法律规定,如 《北京地区互联网站电子公告服务倡议书》, 《全国人大常委会关于维护互联网安全的决定》 及中华人民共和国其他各项有关法律法规。一旦违犯法律法规,您将承担一切因您的行为而直接或间接导致的民事或刑事法律责任,本站工作人员有义务配合相关部门,提供必要的技术资料(如IP地址等)。 二、自觉遵守爱国、守法、自律、真实、文明的原则,严禁发表有人身攻击倾向、有造谣生事嫌疑的言论,严禁发表虚假广告、色情、网络传销性质的内容,本站管理人员有权删除违反规定的内容或取消违规网友的发文权限甚至删除其ID。 |