【问题标题】:Proper way to return a ResultSet返回 ResultSet 的正确方法
【发布时间】:2012-08-07 18:36:58
【问题描述】:

我是 java 新手,但我很快就学会了。我一直遇到的一件事是我最终拥有一个充满查询和一般代码的函数,我想将它分解为单独的函数。以此为例:

public ResultSet getApples (){
    ResultSet rs;
    try{
        PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
        rs = stmt.executeQuery();
    } catch (SQLException e){
        e.printStackTrace();
    }
    return rs;  
}

理想情况下,这就是我想要做的,在一个函数中包含所有的 try 和 catch,但这给了我错误:Local variable may not have been initilized

我确实意识到我可以这样做:


public function start(){
    try{
        ResultSet apples = getApples();
    catch (SQLException e){
        e.printStackTrace();
    }
}

public ResultSet getApples () throws SQLException { 
    PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
    return stmt.executeQuery();
}

但我真的希望在函数内处理异常并返回结果。

编辑 好吧,对所提供的内容进行修改后的答案。我在这个问题上的全部目标是使我的脚本的主要功能尽可能干净。即使是额外的if ( _resultSet != null ) 也是我不太喜欢的东西。话虽如此,我对这个结果很满意:

public ResultSet getApples (){
    try{
        PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
        return stmt.executeQuery();
    } catch (SQLException e){
        System.out.println("************************");
        System.out.println("Class.getApples null");
        System.out.println(e.getMessage());
        return null;
    }   
}

一切都在 getApples 函数中处理,当调用 _resultSet.next() 时,我得到一个 NullPointerException 和 getApples 异常中的打印,因此我能够找到错误并快速调试。

【问题讨论】:

  • 第一个问题是(正如编译器所说)变量 rs 可能没有被初始化(如果抛出异常就会发生这种情况)。声明时将其设置为 null 即可。
  • 如果出现 SQLException,getApples() 应该返回什么?
  • 您应该在同一方法中打开和关闭一个 ResultSet。返回 List 而不是 ResultSet。
  • 记得在 finally 块或更好的 Java SE 7 try-with-resource 中关闭您的资源(不太可能被错误地使用)。我建议使用 Execute Around 成语。 stackoverflow.com/questions/341971/…
  • @GriffeyDog 那不会产生额外的循环。一个创建List,然后在我想读取所有返回的值时再次遍历它?

标签: java mysql


【解决方案1】:

先将rs初始化为null。

public ResultSet getApples (){
    ResultSet rs = null;
    try{
        PreparedStatement stmt = con.prepareStatement("SELECT * FROM fruit WHERE type='apples'");
        rs = stmt.executeQuery();
    } catch (SQLException e){
        e.printStackTrace();
    }
    return rs;  
}

【讨论】:

  • 如果出现错误,您真的要返回 null 并打印到 System.out 吗?它不是很模块化。
  • 这是一个关于处理异常的问题。我没有关于他的项目和这种方法的使用的足够信息。作者原来的问题是编译器错误,怎么处理异常是他的选择。
  • 你是对的。我删除了我的答案,因为我建议做他已经告诉我们他不想做的事情。
  • 我也忘了放这个选项,我只是不知道这是否是“正确”的做事方式。现在有没有办法不返回 null 一个可能是空的 ResultSet?
【解决方案2】:

你可以这样声明你的 RS

ResultSet rs = null;

但是你在哪里调用你的函数:

ResultSet apples = getApples ()

你必须检查:

if(apples == null)
{
    //do something, because your query did not work.
}

【讨论】:

    【解决方案3】:

    因为您没有将 ResultSet rs 设置为任何初始值。最后你要归还它。 如果发生任何异常并且 rs 值中没有设置值怎么办。为了解决您需要在声明时为 rs 分配空值。

    【讨论】:

      【解决方案4】:

      我在您的第一个示例中看到的最大问题(除了没有初始化rs)是您没有正确处理清理。您应该有一个关闭 stmtfinally 块。

      确保所有这些都发生的一个非常好的方法是使用 Spring 的JDBCTemplate(更多文档here)。这将为您处理所有连接管理细节;您只需编写 SQL 和代码来处理ResultSet。更好的是,它允许您使用 Spring 的声明式事务管理。

      【讨论】:

        【解决方案5】:

        您可以使用CachedRowSet。详细答案可以看我的answer here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-03
          • 2013-04-12
          • 1970-01-01
          • 2017-08-27
          • 2013-11-23
          • 2018-10-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多