2012-04-08 155 views
1

我正在尋找一種方法來用Java查詢SQL數據庫並返回一個Object [] []。下面是SQL查詢:如何將Java SQL查詢轉換爲Java對象[] []?

private static Object result[][] = null; 
result = run.query(conn, "select * from TREEDATA", rsh); 

以下是這些數據應該反映是什麼樣:

Object[][] table = { 
     {1, null, "Root"}, //i=0 
     {2, 1, "Node2"}, //i=1 
     {3, 2, "Node3"}, //i=2 
     {4, 3, "Node4"}, //i=3 
     {5, 4, "Node5"}, //i=4 
     {6, 5, "Node6"}, //i=5 
     {7, 6, "Node7"}, //i=6 
     {8, 1, "Node8"}, //i=7 
     {9, 1, "Node9"}, //i=8 
     {10, 9, "Node10"},}; //i=9 

這裏與代碼中的結果集的處理程序,我想不通:

public Object[][] handle(ResultSet rs) throws SQLException { 
     if (!rs.next()) { 
      System.out.println("result set is null"); 
      return null; 
     } 
     ResultSetMetaData meta = rs.getMetaData(); 
     int rows = 0; 
     while (rs.next()) { 
      rows++; 
     } 
     Object[][] result = new Object[rows]; 
     int i = 0; 
     while (rs.next()) { 
//How do I do what I need to do in order to return result[][] 
      result[i][] = rs.getObject(3);   
      System.out.println(result[i][2].toString()); 
     } 
     return result; 
} 

回答

2

下面是實現像你開始吧:

public Object[][] handle(ResultSet rs) throws SQLException { 
     if (!rs.last()) { //If false, the result set is empty. 
      System.out.println("result set is null"); 
      return null; 
     } 
     int rowCount = rs.getRow(); // You are pointing on the last row, so this will get the row number of the last row. 
     rs.beforeFirst(); // Reset your cursor. 
     ResultSetMetaData meta = rs.getMetaData(); 
     int columnCount = meta.getColumnCount(); 
     Object[][] result = new Object[rowCount][columnCount]; 
     int i = 0; 
     while (rs.next()) { 
      for (int j = 0; j < columnCount; j++) { 
       result[i][j] = rs.getObject(j); 
      } 
     } 
     return result; 
} 

但我個人寧願有函數返回ArrayList<Object[]>甚至更​​好List<TreeData>但你需要實現和填充行TreeData對象手動值。這是JPA/Hibernate的用武之地..但這可能會再次殺傷你的應用程序。

1

在您的功能開始使用ArrayList而不是Object[][]。所以你不需要對行進行計數。

那麼對於每一行

while(rs.next()) { 
    Object[] row = new Object[meta.getColumnCount()]; 
    for (int i = 0 ; i < row.length ; ++i) { 
    row[i] = rs.getObject(i+1); // remember thet on ResultSet object first column is 1 
    } 
    rows.add(row); // add row to the ArrayList 
} 

在最後你可以用你的toArray()轉換ArrayList數組。

1

這是你想要的嗎?在循環獲取數據之前,您需要重置結果集。

Object[][] result = new Object[rows]; 
rs.first(); 
int i = 0; 
while (rs.next()) { 
    result[i] = new Object[3]; 
    result[i][0] = rs.getObject(1); 
    result[i][1] = rs.getObject(2); 
    result[i][2] = rs.getObject(3); 
    i++; 
} 
+0

他的查詢使用's​​elect *',所以你不能確定列將始終是3. – dash1e 2012-04-08 09:03:42

+1

同意,for循環是一個更強大的解決方案。 – Richante 2012-04-08 09:05:25