背景:
1.需要将数据库查询结果在JSP中以列表方式显示
2.在一个良好的J2EE模式中数据库查询一般用DAO实现(DataAccessObject),JSP仅用于显示数据
问题:
通过JDBCResultSet可获取查询结果(存在于数据库缓冲区内),但在Statement、Connection关闭后ResultSet即不可用。因此需要一种方式取出所有查询结果并传递至JSP页面。
解决方法一:
使用ValueObject。将每条记录均封装成JavaBean对象,把这些对象装入Collection传送给JSP显示。这种方法的缺点是每一种查询都需要定义一个javaclass,并且将记录数据封装成java对象时也需要很多额外的代码。
示例代码:
解决方法二:
遍历ResultSet取出所有数据封装进Collection。
具体做法:
1.生成一个List对象(Listlist=newArrayList())。
2.生成一个Map对象(Mapmap=newHashMap())。使用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(ResultSetrs)方法中实现了上述过程(所有列名均使用大写),可参考使用。
示例代码:
解决方法三:
使用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
示例代码:
适用场合:
方法一使用于定制的查询操作
方法二适用于多条查询语句或需要对查询结果进行处理的情况。
方法三适合于单条查询语句,适用于快速开发。
1.需要将数据库查询结果在JSP中以列表方式显示
2.在一个良好的J2EE模式中数据库查询一般用DAO实现(DataAccessObject),JSP仅用于显示数据
问题:
通过JDBCResultSet可获取查询结果(存在于数据库缓冲区内),但在Statement、Connection关闭后ResultSet即不可用。因此需要一种方式取出所有查询结果并传递至JSP页面。
解决方法一:
使用ValueObject。将每条记录均封装成JavaBean对象,把这些对象装入Collection传送给JSP显示。这种方法的缺点是每一种查询都需要定义一个javaclass,并且将记录数据封装成java对象时也需要很多额外的代码。
示例代码:
- //查询数据代码
- Connectionconn=DBUtil.getConnection();
- PreparedStatementpst=null;
- ResultSetrs=null;
- try{
- Stringsql=“selectemp_code,real_namefromt_employeewhereorgan_id=?”;
- pst=conn.preparedStatement(sql);
- pst.setString(1,“101”);
- ResultSetrs=pst.executeQuery();
- Listlist=newArrayList();
- Employeeemp;
- while(rs.next()){
- emp=newEmployee();
- emp.setReakName(rs.getString(“real_name”));
- emp.setEmpCode(rs.getString(“emp_code”));
- …
- list.add(emp);
- }
- returnlist;
- }finally{
- DBUtil.close(rs,pst,conn);
- }
- //jsp显示部分代码
- <%
- ListempList=(List)request.getAttribute(“empList”);
- if(empList==null)empList=Collections.EMPTY_LIST;
- %>
- …
- <tablecellspacing="0"width=”90%”>
- <tr><td>代码</td><td>姓名</td></tr>
- <%
- Employeeemp;
- for(inti=0;i<empList.size();i++){
- emp=(Employee)empList.get(i);
- %>
- <tr>
- <td><%=emp.getEmpCode()%></td>
- <td><%=emp.getRealName()%></td>
- </tr>
- <%
- }//endfor
- %>
- </table>
解决方法二:
遍历ResultSet取出所有数据封装进Collection。
具体做法:
1.生成一个List对象(Listlist=newArrayList())。
2.生成一个Map对象(Mapmap=newHashMap())。使用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(ResultSetrs)方法中实现了上述过程(所有列名均使用大写),可参考使用。
示例代码:
- //查询数据部分代码:
- …
- Connectionconn=DBUtil.getConnection();
- PreparedStatementpst=null;
- ResultSetrs=null;
- try{
- Stringsql=“selectemp_code,real_namefromt_employeewhereorgan_id=?”;
- pst=conn.preparedStatement(sql);
- pst.setString(1,“101”);
- rs=pst.executeQuery();
- Listlist=DBUtil.resultSetToList(ResultSetrs);
- returnlist;
- }finally{
- DBUtil.close(rs,pst,conn);
- }
- //JSP显示部分代码
- <%
- ListempList=(List)request.getAttribute(“empList”);
- if(empList==null)empList=Collections.EMPTY_LIST;
- %>
- …
- <tablecellspacing="0"width=”90%”>
- <tr><td>代码</td><td>姓名</td></tr>
- <%
- MapcolMap;
- for(inti=0;i<empList.size();i++){
- colMap=(Map)empList.get(i);
- %>
- <tr>
- <td><%=colMap.get(“EMP_CODE”)%></td>
- <td><%=colMap.get(“REAL_NAME”)%></td>
- </tr>
- <%
- }//endfor
- %>
- </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
示例代码:
- //查询数据部分代码:
- importjavax.sql.RowSet;
- importoracle.jdbc.rowset.OracleCachedRowSet;
- …
- Connectionconn=DBUtil.getConnection();
- PreparedStatementpst=null;
- ResultSetrs=null;
- try{……
- Stringsql=“selectemp_code,real_namefromt_employeewhereorgan_id=?”;
- pst=conn.preparedStatement(sql);
- pst.setString(1,“101”);
- rs=pst.executeQuery();
- OracleCachedRowSetors=newOracleCachedRowSet();
- //将ResultSet中的数据封装到RowSet中
- ors.populate(rs);
- returnors;
- }finally{
- DBUtil.close(rs,pst,conn);
- }
- //JSP显示部分代码
- <%
- javax.sql.RowSetempRS=(javax.sql.RowSet)request.getAttribute(“empRS”);
- %>
- …
- <tablecellspacing="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>
- <%
- }//endwhile
- %>
- </table>
适用场合:
方法一使用于定制的查询操作
方法二适用于多条查询语句或需要对查询结果进行处理的情况。
方法三适合于单条查询语句,适用于快速开发。