先看看这个例子吧:
Statement stmt = conn.createStatement();
ResultSet res = stmt.executeQuery(sql);
如果要是在使用res之前关掉stmt,这时候res肯定没有内容。我的疑问就是既然已经从数据库中
拿到了查询结果,而且是存放在内存中,那为什么还要仍旧将res和stmt关联在一块,不觉得这是
设计的问题吗。还有我自己时间比较紧张,我向从源码角度得到答案,那就是为什么如果stmt关闭
以后res当中就没有内容。欢迎各位来探讨。呵呵

解决方案 »

  1.   

    Statement
    语句对象,用于执行SQL语句,并将数据检索到结果集(ResultSet)对象中
    ResultSet
    结果集对象,包含执行SQL语句后返回的数据的集合
      

  2.   

    一旦成功连接到数据库,获得Connection对象后,必须通过Connection对象的createStatement方法来创建语句对象,才可以执行SQL语句;
    使用语句对象来执行SQL语句,有两种情况:
    一种是执行SELECT、DELETE、UPDATE和INSERT之类的数据库操作语句(DML),使用Statement对象的executeQuery和executeUpdate方法执行;
    如:
    sta.executeUpdate("INSERT INTO Friends VALUES('田七', '重庆',  456712, '2003-2-25', 7500)");
    另一种是DDL 命令包括create、alter 和 drop,用于创建、删除、修改数据库对象
    如:
    sta.execute("create table Customer (CustIdnumber(3),CustNamevarchar2(15),Address varchar2(30))"); 
      

  3.   

    1楼的同志,先谢谢你的回答。呵呵。
    不过你说的那些我都知道,我的问题是,在我执行查询取得resultset以后,为什么它的结果还要和statement联系在一块,如果我要是把statement关闭的话,这样我再去用resultset取得里面的记录,这时,它里面就一定没有一条记录,但实际上如果我要不是不关闭statement的话,它里面会有查询到的结果。
    我有两个疑惑:第一,我认为设计上不好,既然已经拿到了查询结果到内存中,那干嘛还要和statment关联在一块了;第二个问题是,我想从源码角度找到原因。呵呵,不过我还是要谢谢你的回答。
      

  4.   

    你要得到查询结果,而ResultSet是用来帮助处理这些结果的
     如果你不关注结果,如,只进行数据插入,当然可以不要ResultSet
     stmt.executeUpdate(sql);  此句单独成行,不必传给rs
      

  5.   

    答:我想你的问题是不需要从源码上去找原因的。源码只是协议的一种实现而已。在JDK的接口规范:java.sql Statement接口中,对close()的含义规定得很清楚:Statement 对象在进行垃圾回收时被自动关闭。关闭tatement 对象时,还将同时关闭其当前的 ResultSet 对象(如果有)。因此:严格来说:“如果我要是把statement关闭的话,这样我再去用resultset取得里面的记录,这时,它里面就一定没有一条记录,但实际上如果我要不是不关闭statement的话,它里面会有查询到的结果。 ” 表明,你的JDBC DRIVER源码实现有些问题!反而是不正确的。正确的是:resultset不是一定取不到记录,而是应该报出异常:resultset已经关闭!不能再取其中内容了。关于为何:JDK中对statement接口的close()的语义如此定义,就不是很了解了。但肯定与源代码无关。
     
      

  6.   

    呵呵,楼上说的挺对的,我为什么会提出从源码角度找是因为,我以前认为这种机制不好,因为既然resultset已经取到了,拿到内存中了,那为什么还要和statement关联在一块,这是我的疑问所在,我感觉这个设计不是很好,不过我现在明白,你不能在jdk source中找到具体实现,具体实现在jdbc中做的,那么这个疑问也就无从解决了。呵呵,还有其实为什么关联在一块jdk doc中已经说的很明确了,协议都这么定了,那当然就只能那么办了,呵呵
      

  7.   

    通过statement得到结果集,但resultset里面装的是数据库里查询出所有满足条件的记录的游标,也就是指针,真正是数据还在数据库里,只是得到每条记录地址了,这时还需要通过rs.next()方法逐条取出真正是数据内容,取时需要statement来操作,所以不能关闭。