2012-03-07 81 views
-1

我有一個數據庫函數,檢索數據,然後填充jtable。我需要更改此函數,以便在Object[][]內返回數據庫中的數據。如何才能做到這一點? (我不確定如何在每一行迭代中存儲數據 - 下面代碼中的while循環部分)。Java返回字符串對象

public void data() { 
    // clear table then load information 
    DefaultTableModel model=(DefaultTableModel)table.getModel(); 
     model.getDataVector().removeAllElements(); 
    table.repaint(); 
    ResultSet rs=null; 
    Statement st=null; 

    try { 
     Class.forName("java.sql.Driver"); 
     _con = DriverManager.getConnection(_url,_user,_pwd); 
     st = _con.createStatement(); 
     String query = "SELECT * FROM table"; 

     rs = st.executeQuery(query); 

     while (rs.next()) { 
      String d1 = rs.getString("record1"); 
      String d2 = rs.getString("record2"); 
      model.addRow(new Object[]{d1,d2}); 
     }   
    } catch (Exception e) { 
    } finally { 
     try { 
      if (rs != null) { 
       rs.close(); 
      } 
      if (st != null) { 
       st.close(); 
      } 
      if (_con != null) { 
       _con.close(); 
      } 
     } catch (SQLException ex) { 
     } 
    } 
} 
+0

還有'_con','st'和'rs'定義了嗎? – 2012-03-07 12:28:28

+1

成員變量,顯然。這也是一個壞主意。 – duffymo 2012-03-07 12:29:22

回答

3

我不認爲這種方法有以下幾個原因是一個好主意:

  1. 的方法應該做的一兩件事。您已經獲得了UI,連接獲取以及查詢所有這些方法的混合。我會開始把它們分開一點。持久層不應該知道或關心你使用的是Swing。
  2. 關閉finally塊中單個try/catch塊中的資源。如果拋出異常,您仍然希望其他人關閉。
  3. 一個空的catch塊是一個可怕的想法。打印或記錄堆棧跟蹤。
  4. 創建此方法外的Connection,並傳遞它。
  5. ResultSetStatement不應該是類的成員變量。使它們在本地方法。

只是改變方法來返回你想要的而不是void。我不會使用Object [][];我更喜歡地圖列表或封裝一行的某種其他類型。使用列名作爲Map中的鍵。

0

這裏有一些OP已經要求的代碼,是的,OP應該留意duffymo的推薦 - 我完全同意他們。

Object[] result = null; 

    try{ 

    Class.forName("java.sql.Driver"); 
    _con = DriverManager.getConnection(_url,_user,_pwd); 
    st=_con.createStatement(); 

    String query="SELECT COUNT(*) cnt FROM table"; 
    rs=st.executeQuery(query); 
    Integer size = null; 
    if (rs.next()){ 
     size = rs.getInteger("cnt"); 
    } 

    if (size != null){ 
    Object[] result = new Object[size]; 
    query="SELECT * FROM table";  
    rs=st.executeQuery(query); 
    int i = 0; 
    while(rs.next()) 
    { 
     String d1=rs.getString("record1"); 
     String d2=rs.getString("record2"); 
     result[i++] = new Object[]{d1,d2}; 
    }   
    } 
    } 
    catch(Exception e) 
    { 
     //TODO handle exceptions, e.g. rethrow 
     //throw new RuntimeException(e); 
    }