Java Resultset中的Resultset

Java Resultset中的Resultset,java,jdbc,Java,Jdbc,我面临一个小问题。我从表中获取数据,然后 我循环结果集。在每个循环中,我使用返回的行数据 按resultset对另一个表执行另一个查询。我正在发帖 下面是代码 问题是,我感觉到代码中存在一些问题,但无法解决 识别它。代码运行良好,没有任何错误或错误 例外情况。帮我找到问题所在。也给我解释一下 我知道第一个结果集可以使用Dao。但不是吗 创建太多的对象 public ResultSet search_NatSupport() throws ClassNotFoundException,

我面临一个小问题。我从表中获取数据,然后 我循环结果集。在每个循环中,我使用返回的行数据 按resultset对另一个表执行另一个查询。我正在发帖 下面是代码

问题是,我感觉到代码中存在一些问题,但无法解决 识别它。代码运行良好,没有任何错误或错误 例外情况。帮我找到问题所在。也给我解释一下

我知道第一个结果集可以使用Dao。但不是吗 创建太多的对象

  public ResultSet search_NatSupport() throws ClassNotFoundException,     SQLException  {

 String query = "SELECT SYMBOL, Date, sup, res FROM Nat_Support WHERE SYMBOL IS NOT ?;";

        PreparedStatement stmt  =  null;
        ResultSet rs            =  null;
        DBHelper helper         =  DBHelper.getInstance();

        stmt = helper.getConn().prepareStatement(query);
        stmt.setString(1, null);
        rs   = stmt.executeQuery();

         return rs;
    }

   public void searchAgain(ResultSet rs) {

    String query = "select * from bhav_NSE where symbol = ?";

    PreparedStatement stmt = null;

    try {

        while (rs.next()) {

            stmt    = DBHelper.getInstance().getConn().prepareStatement(query);
            stmt.setString(1, rs.getString(1));
            ResultSet res = stmt.executeQuery();

            while(res.next()){
                System.out.println(res.getString(1));
            }
            res.close();
        }
        rs.close();
    } catch (SQLException | ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}



    public static void main(String[] args)   { 

    BhavMaster_NSE finals = new BhavMaster_NSE();

    try {

        finals.searchAgain(finals.search_NatSupport());

    } catch (ClassNotFoundException | SQLException e) {

        // TODO Auto-generated catch block

        e.printStackTrace();

    }

}

有一次我需要使用一个结果集的返回结果作为另一个结果集的输入,我遇到了这个问题,但是我发现我不能这样做,调试后我发现当你在一个结果集中编写一个结果集时,第一个结果集变为等于Null

所以这里有一个技巧:

public void searchAgain(ResultSet rs) {
    try {
        while (rs.next()) {
           bhavNse(rs.getString(1));
        }
        rs.close();
    } catch (SQLException | ClassNotFoundException e) {
        e.printStackTrace();
    }
}
public void bhavNse(String var) {
   try {
      String query = "select * from bhav_NSE where symbol = ?";
      PreparedStatement stmt = null;
      stmt    = DBHelper.getInstance().getConn().prepareStatement(query);
      stmt.setString(1, var);
      ResultSet res = stmt.executeQuery();
      while(res.next()){
          System.out.println(res.getString(1));
      }
      res.close();
      } 
      catch (SQLException | ClassNotFoundException e) {
         e.printStackTrace();
      }
}
你不需要把它放进去;在查询的末尾。 使用任何可关闭的资源时,请使用try with resource 即使您想向被调用方抛出异常,也可以使用throw关键字

try with resource将负责关闭所有资源,即使出现任何故障


或者旧的方法是在失败和成功时关闭资源。

在同一个查询中,连接键上的表,这里是Symbol并组合NOTNULL,而不是两个结果集

 public void search()
        { 
            PreparedStatement stmt = null;
            String query = "select bnse.* from bhav_NSE bnse,Nat_Support nsup where bnse.symbol=nsup.symbol and nsup.symbol is not null";
            stmt   = DBHelper.getInstance().getConn().prepareStatement(query);
             ResultSet res = stmt.executeQuery();

                while(res.next()){
                    // Get data res.getString(..);
                }
                res.close();
            }
            rs.close();

        }

那么这里到底出了什么问题呢?没什么问题,但我怀疑我使用结果集的方法。在另一个循环结果集中使用一个结果集可以吗?不可以,您可能只能使用一个请求,例如从bhav_NSE中选择*,其中从Nat_支持中选择不同的符号。顺便说一句,您正在泄漏资源。您是否指向未关闭的语句和连接。代码是紧密耦合的。您可能可以在通用方法中去掉查询部分,使用参数查询字符串和参数列表,使用资源是一个不错的选择,但我们使用的是Jdk 1.6,因此我们必须走很长的路。为了兼容性,我必须在以后更改代码,因为我在这里使用multi-catch。这将在Java6中产生错误。
 public void search()
        { 
            PreparedStatement stmt = null;
            String query = "select bnse.* from bhav_NSE bnse,Nat_Support nsup where bnse.symbol=nsup.symbol and nsup.symbol is not null";
            stmt   = DBHelper.getInstance().getConn().prepareStatement(query);
             ResultSet res = stmt.executeQuery();

                while(res.next()){
                    // Get data res.getString(..);
                }
                res.close();
            }
            rs.close();

        }