有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

mysql Java SQL查询问题,结果集不包含任何内容

我正在尝试用Java做SQL,这是我第一次。我试图选择一个表的所有部分并将其放入一个结果集,但结果集似乎是空的。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)

我正在使用这段代码构建一个带有该查询的结果集

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了,我也没有解决这个问题。尽管我需要帮助的问题(除非相关)只是结果集似乎是空的


共 (2) 个答案

  1. # 1 楼答案

    您从未在代码中初始化statement,它是一个私有变量,并且没有setter,因此我认为您也没有注入它

    所以,当你调用read()时,你将有一个NullPointerException打开

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

    这将被你的^{再次捕捉并抛出

    所以,在你的listSites()中,你会抓住它,然后再把它扔出去,在finally中,你会有另一个{}

    statement.close();
    

    这是你的堆栈跟踪中的一个

  2. # 2 楼答案

    在将连接用于executeQuery()之前,需要从该连接创建一条语句

    Statement statement = connection.createStatement();