正确的方法返回ResultSet

时间:2012-08-10 12:48:47

标签: java mysql

我是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;  
}

理想情况下,这就是我想做的事情,在一个函数中完成所有尝试和捕获,但这给了我错误: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异常中打印,所以我能够快速找到错误并进行调试。

5 个答案:

答案 0 :(得分:3)

首先将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;  
}

答案 1 :(得分:3)

您可以像这样声明您的RS

ResultSet rs = null;

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

ResultSet apples = getApples ()

你必须检查:

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

答案 2 :(得分:2)

因为您没有将ResultSet rs设置为任何初始值。最后你要归还它。 如果发生任何异常并且rs值没有设置值,该怎么办?为了解决这个问题,你需要在声明时为rs赋值。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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