Java SQL查询问题,ResultSet不包含任何内容

时间:2014-02-26 06:30:04

标签: java mysql sql jdbc

我正在尝试用Java做SQL,这是我的第一次。我试图选择所有表并将其放在ResultSet中,但ResultSet似乎为空。 MySQL客户端上的相同查询确实显示结果,这让我想知道我的代码有什么问题。它可能是查询的完成方式,也可能是我尝试从结果集中获取数据的方式。

命令行MySQL客户端中的查询...

mysql> SELECT * FROM accounts.sites;
+----------+-----------------------+--------------------------+--------------+----------------+
| username | domain                | directory                | fpm-template | nginx-template |
+----------+-----------------------+--------------------------+--------------+----------------+
| cyrus    | cyrustheg.org         | /var/www/sites/cyrustheg | standard     | drupal         |
| cyrus    | tornews.org           | /var/www/sites/tornews   | standard     | standard       |
| cyrus    | oletf.org             | /var/www/sites/oletf     | standard     | standard       |
| taf      | theabsolutefinest.org | /var/www/sites/taf       | standard     | wordpress      |
| taf      | bitsplit.org          | /var/www/sites/bitsplit  | bitsplit     | bitsplit       |
+----------+-----------------------+--------------------------+--------------+----------------+
5 rows in set (0.00 sec)

我正在使用此代码使用该查询构建resultSet ...

private void read() throws Exception {
    try {  
        Class.forName("com.mysql.jdbc.Driver");

        String dburl = "jdbc:mysql://" + dbHost + "/" + dbName +
                        "?user=" + dbUser + "&password=" + dbPass;

        connect = DriverManager.getConnection(dburl);

        resultSet = statement.executeQuery("SELECT * from accounts.sites");
    } catch (Exception e) {
        throw e;
    }
}

此代码遍历resultSet,为每个用户查找每个域。我知道问题出在前一个代码或者这个或前一个代码中,因为我已经在while循环中添加了一个print语句,而且它永远不会被调用。这就是我得出结论,结果是空的。

public HashSet<String> listSites(String user)
        throws Exception, ExcSiteNosites {
    HashSet<String> list = new HashSet<String>();
    boolean exists = false;

    try { 
        read();

        while (resultSet.next()) {
            if (resultSet.getString("username").equals(user)) {
                exists = true;
                list.add(resultSet.getString("domain"));
            }
        }

        if (!exists) {
            throw new ExcSiteNosites(user);
        }
    } catch (Exception e) {
        throw e;
    } finally {
        resultSet.close();
        statement.close();
        connect.close();
    }

    return list;
}

全班:http://pastebin.com/0DSbFey7 该课程的单元测试:http://pastebin.com/9UYLEeMB

我发现了运行该单元测试的bug,它产生了以下输出......

Listing cyrus's sites...
Listing taf's sites...
java.lang.NullPointerException
    at database.Sites.listSites(Sites.java:96)
    at test.dbSites.listall(dbSites.java:28)
    at test.dbSites.main(dbSites.java:51)
java.lang.NullPointerException
    at database.Sites.listSites(Sites.java:96)
    at test.dbSites.listall(dbSites.java:28)
    at test.dbSites.main(dbSites.java:53)

NullPointerException我认为可能是一个无关的问题。我有一段时间没有做过任何Java,而且我也没有这样做过。虽然我想要帮助的问题(除非相关)只是ResultSet似乎是空的。

2 个答案:

答案 0 :(得分:2)

你永远不会在你的代码中初始化statement,它是一个私有变量而且你没有设置它,所以我认为你也没有注入它。

因此,当您致电read()时,您将获得NullPointerException

resultSet = statement.executeQuery("SELECT * from accounts.sites");

这将由您的catch抓取并再次抛出。

所以,在你的listSites()中,你会抓住它并再次抛出它,而在finally中,你将另一个 NullPointerException < / p>

statement.close();

并且它是堆栈跟踪中的那个。

答案 1 :(得分:1)

在将其用于executeQuery()....

之前,您需要从连接创建一个语句
Statement statement = connection.createStatement();