首页 > 代码库 > Result和ResultSet的区别

Result和ResultSet的区别

微软的.NET平台上面的数据访问有一个特点,就是数据查询的结果,可以放在内存中,以XML格式进行描述,不需要一直与数据库保持在线连接,用DataSet + Data Adapter来实现!

我们可以看到,这样会长期占用数据库连接的资源,是一个有点不爽的问题...

其实,在JSTL中提供了另外一种机制,让我们在返回查询结果到表示层的时候,可以做到离线使用!它就是javax.servlet.jsp.jstl.sql.Result类!



java.sql包下 Resultset接口是访问数据库得到的结果集

但该结果集必的使用须在连接对象一直开着的基础上,

为了关闭连接仍然可以使用 所以转换成Result,Result存在内存中就和连接没关系了,那么从Resultset转换成Result就用到ResultSupport类的toResult(ResultSet)方法.

ResultSupport

Result 

存在于javax.jstl包下的 不属于javase,属于javaee



在开发过程中,我们不能返回ResultSet对象,连接一旦断开,在连接上建立的会话和在会话上建立的结果集都会自动关闭.所以我们必须开发类似于返回List的接口.但是针对通用函数,List是无能为力的,我们要返回比List更通用的,jstl中的Result可以完成此任务. 

public Result executeQuery() throws SQLException {
        Result result = null;
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        Statement stmt = null;
        try {
            if (values != null && values.size() > 0) {
                // Use a PreparedStatement and set all values
                pstmt = conn.prepareStatement(sqlValue);   //SQL语句
                setValues(pstmt, values);             //为参数赋值,是一个数组
                rs = pstmt.executeQuery();
            }
            else {
                // Use a regular Statement
                stmt = conn.createStatement();
                rs = stmt.executeQuery(sqlValue);
            }
            result = ResultSupport.toResult(rs);
        }finally {
            if (rs != null) {
                try {rs.close();} catch (SQLException e) {}
            }
            if (stmt != null) {
                try {stmt.close();} catch (SQLException e) {}
            }
            if (pstmt != null) {
                try {pstmt.close();} catch (SQLException e) {}
            }
        }
        return result;
    }

      

下面是遍列Result的代码


      Result result = sqlCommandBean.executeQuery();
  if (result == null || result.getRowCount() == 0) {
   // Book not found
       System.out.println("没有结果!!!");
      } else {
      System.out.println("有" + result.getRowCount() + "条记录!!!");
       for(int i=0;i<result.getRowCount();i++)

      {

             Map map=result.getRows();               //每次循环定位到一条记录

             System.out.println(map.get("字段1")+"     "+map.get("字段2"));

      }
  }

而在JDBC中,我们通常使用javax.sql.ResultSet类来存放放回的数据,它的流程和生命周期如下:

 

使用ResultSet来返回数据库查询结果
Client-->Connection-->Statement-->JDBC Driver--+
 Database
Client<--Parsing<--ResultSet<--JDBC Driver--+
        
 Connection lifecycle
  
  
 
 ResultSet lifecycle 

 

Result和ResultSet的区别