簡體   English   中英

Java SQL查詢問題,ResultSet不包含任何內容

[英]Java SQL query problems, ResultSet doesn't contain anything

我正在嘗試用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語句,而且從不調用它。 這就是為什么我斷定resultSet為空。

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

我發現錯誤運行單元測試,這使得以下輸出...

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似乎是空的。

你永遠不會在你的代碼中初始化statement ,它是一個私有變量而你沒有setter,所以我認為你也沒有注入它。

因此,當您調用read() ,您將遇到NullPointerException

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

這將被你的catch並再次拋出。

所以,在你的listSites() ,你將捕獲它,並再次拋出它,在finally ,你將有另一個 NullPointerException

statement.close();

它是堆棧跟蹤中的一個。

在使用它來執行Query()之前,您需要從連接創建一個語句....

Statement statement = connection.createStatement();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM