• 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  
  • 相关阅读:
    【MyBatis】STDOUT_LOGGING和log4j日志
    【MyBatis】resultType与类的字段不同解决办法
    【MyBatis】SqlSession相关的生命周期及作用域
    【MyBatis】XML配置的官网说明
    【Junit】程序员都应会的白盒测试
    【MyBatis】增删改查语句入门
    【MyBatis】我的mybatis第一个程序
    【网络】HTTP知识点(1)
    InitializeComponent报错(提示不存在)
    leetcode 860柠檬水找零问题
  • 原文地址:https://www.cnblogs.com/91loveme/p/4057035.html
Copyright © 2020-2023  润新知