2014-02-26 37 views
1

我想用Java來做SQL,這是我第一次。我試圖選擇一個表並將其放入ResultSet中,但ResultSet似乎是空的。 MySQL客戶端上的相同查詢顯示結果,這讓我不知道我的代碼有什麼問題。它可以是查詢完成的方式,也可以是我試圖從結果集中獲取數據的方式。Java SQL查詢問題,ResultSet不包含任何東西

在命令行的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語句,並且它永遠不會被調用。這就是爲什麼我總結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

我發現運行單元測試,這讓下面的輸出的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

'statement'總是空。參見[例如這個問題(HTTP:// stackoverflow.com/q/4682871/180100)示例代碼 – 2014-02-26 06:35:56

+0

初始化您的**語句** – ItachiUchiha

回答

2

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

所以,當你調用read(),你將有一個NullPointerException

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

這將被獲取,並通過你再次catch拋出。

因此,在你listSites(),你會抓住它,然後再扔掉它,並在finally,你將有另一NullPointerException

statement.close(); 

,它是一個在你的堆棧跟蹤。

+0

謝謝,我得到它的工作。我只是想念「statement = connect.createStatement();」連接後。 :-) – cyrus

1

你需要從連接創建語句之前用它的executeQuery()....

Statement statement = connection.createStatement();