zoukankan      html  css  js  c++  java
  • 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  
  • 相关阅读:
    SourceTree 启动不需要账号
    获取httpservletrequest所有参数的键值对--key-value,用getParameterMap
    ajax 参数出现在Request payload导致request.getParameter(name)是获取不到值
    导出
    替换jar包里面的文件。利用jar ucf
    mysql CPU使用率过高的一次处理经历
    实用小知识
    spring-boot 静态资源自定义配置
    java多线程调用静态方法安全吗?
    spring 注解@Bean
  • 原文地址:https://www.cnblogs.com/91loveme/p/4057035.html
Copyright © 2011-2022 走看看