江苏520
江苏520
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2009年5月
>
日
一
二
三
四
五
六
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
留言簿
(5)
给我留言
查看公开留言
查看私人留言
随笔档案
2009年6月 (2)
2009年5月 (12)
阅读排行榜
1. 集成struts2 spring hibernate的实例(4075)
2. JAVA生成高品质缩略图的代码与下载(2408)
3. java字符集笔记(2300)
4. 用Tomcat 的SSO实现(2212)
5. Fire Workflow 介绍 (2079)
评论排行榜
1. 字符,字节和编码三者的关系(0)
2. java异常处理笔记(0)
3. java多线程问题及处理(笔记)(0)
4. 从JAR与zip档案文件中提取Java 资源(0)
5. JSP页面查询显示常用模式(0)
常用链接
我的随笔
我的评论
我的参与
统计
随笔 - 14
文章 - 0
评论 - 0
引用 - 0
最新评论
JSP页面查询显示常用模式
背景
:
1. 需要将数据库查询结果在JSP中以列表方式显示
2. 在一个良好的J2EE模式中数据库查询一般用DAO实现(Data Access Object), JSP仅用于显示数据
问题
:
通过JDBC ResultSet可获取查询结果(存在于数据库缓冲区内),但在Statement、Connection关闭后ResultSet即不可用。因此需要一种方式取出所有查询结果并传递至JSP页面。
解决方法一
:
使用Value Object。将每条记录均封装成JavaBean对象,如:
http://www.bt285.cn
把这些对象装入Collection传送给JSP显示。这种方法的缺点是每一种查询都需要定义一个java class,并且将记录数据封装成java对象时也需要很多额外的代码。
示例代码:
//查询数据代码
Connection conn = DBUtil.getConnection();
PreparedStatement pst =
null
;
ResultSet rs =
null
;
try
{
String
sql=“select emp_code, real_name from t_employee where organ_id=?”;
pst = conn.preparedStatement(sql);
pst.setString(1, “101”);
ResultSet rs = pst.executeQuery();
List list =
new
ArrayList();
Employee emp;
while
(rs.next()){
emp =
new
Employee();
emp.setReakName(rs.getString(“real_name”));
emp.setEmpCode(rs.getString(“emp_code”));
…
list.add(emp);
}
return
list;
}
finally
{
DBUtil.close(rs, pst ,conn);
}
//jsp显示部分代码
<%
List empList = (List)request.getAttribute(“empList”);
if
(empList ==
null
) empList = Collections.EMPTY_LIST;
%>
…
<table cellspacing="0" width=”90%”>
<tr> <td>
http://www.5a520.cn
小说520网 代码</td> <td>姓名</td> </tr>
<%
Employee emp;
for
(
int
i=0; i< empList.size(); i++){
emp = (Employee) empList.get(i);
%>
<tr>
<td><%= emp.getEmpCode()%></td>
<td><%= emp.getRealName()%></td>
</tr>
<%
}
// end for
%>
</table>
解决方法二
:
遍历ResultSet取出所有数据封装进Collection。
具体做法:
1. 生成一个List对象(List list = new ArrayList() )。
2. 生成一个Map对象(Map map = new HashMap() )。使用Map封装一行数据,key为各字段名,value为对应的值。(map.put(“USER_NAME”), rs.getString(“USER_NAME”))
3. 将第2 步生成的Map对象装入第1步的list对象中(list.add(map) )。
4. 重复2、3步直到ResultSet遍历完毕
在DBUtil. resultSetToList(ResultSet rs)方法中实现了上述过程(所有列名均使用大写),可参考使用。
示例代码
:
//查询数据部分代码:
…
Connection conn = DBUtil.getConnection();
PreparedStatement pst =
null
;
ResultSet rs =
null
;
try
{
String
sql=“select emp_code, real_name from t_employee where organ_id=?”;
pst = conn.preparedStatement(sql);
pst.setString(1, “101”);
rs = pst.executeQuery();
List list = DBUtil. resultSetToList(ResultSet rs);
return
list;
}
finally
{
DBUtil.close(rs, pst ,conn);
}
//JSP显示部分代码
<%
List empList = (List)request.getAttribute(“empList”);
if
(empList ==
null
) empList = Collections.EMPTY_LIST;
%>
…
<table cellspacing="0" width=”90%”>
<tr> <td>
http://www.feng123.com
蜂蜜 代码</td> <td>姓名</td> </tr>
<%
Map colMap;
for
(
int
i=0; i< empList.size(); i++){
colMap = (Map) empList.get(i);
%>
<tr>
<td><%=colMap.get(“EMP_CODE”)%></td>
<td><%=colMap.get(“REAL_NAME”)%></td>
</tr>
<%
}
// end for
%>
</table>
解决方法三
:
使用RowSet。
RowSet是JDBC2.0中提供的接口,Oracle对该接口有相应实现,其中很有用的是oracle.jdbc.rowset.OracleCachedRowSet。 OracleCachedRowSet实现了ResultSet中的所有方法,但与ResultSet不同的是,OracleCachedRowSet中的数据在Connection关闭后仍然有效。
oracle的rowset实现在
http://otn.oracle.com/software/content.html
的jdbc下载里有,名称是ocrs12.zip
示例代码
:
//查询数据部分代码:
import
javax.sql.
RowSet
;
import
oracle.jdbc.rowset.OracleCachedRowSet;
…
Connection conn = DBUtil.getConnection();
PreparedStatement pst =
null
;
ResultSet rs =
null
;
try
{……
String
sql=“select emp_code, real_name from t_employee where organ_id=?”;
pst = conn.preparedStatement(sql);
pst.setString(1, “101”);
rs = pst.executeQuery();
OracleCachedRowSet ors = newOracleCachedRowSet();
//将ResultSet中的数据封装到RowSet中
ors.populate(rs);
return
ors;
}
finally
{
DBUtil.close(rs, pst, conn);
}
//JSP显示部分代码
<%
javax.sql.
RowSet
empRS = (javax.sql.
RowSet
) request.getAttribute(“empRS”);
%>
…
<table cellspacing="0" width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr>
<%
if
(empRS !=
null
)
while
(empRS.next() ) {
%>
<tr>
<td><%= empRS.get(“EMP_CODE”)%></td>
<td><%= empRS.get(“REAL_NAME”)%></td>
</tr>
<%
}
// end while
%>
</table>
适用场合
:
方法一使用于定制的查询操作
方法二适用于多条查询语句或需要对查询结果进行处理的情况。
方法三适合于单条查询语句,适用于快速开发。
posted on 2009-05-27 21:36
江苏520
阅读(1616)
评论(0)
编辑
收藏
Powered by:
BlogJava
Copyright © 江苏520