2009-10-27 55 views
1

是否有直接的方法從ResultSet中獲取行中的所有元素作爲字符串? JDBC作爲字符串從數據庫中的行(JDBC)

+0

你怎麼會想表示的數據? – skaffman 2009-10-27 22:20:23

+0

String data =「value1,value2,value3」但不使用getString(「」)或類似的方法並連接它們! – Vishal 2009-10-27 22:21:53

+2

爲什麼不想連接或使用StringBuffer來創建自己的String? – 2009-10-27 22:27:01

回答

3

我必須問 - 爲什麼你需要類似的東西?

不,這是不可能的 - 無論如何,您至少需要撥打getString()一次。你可以做的最好的事情是在SQL中連接你的字段,例如

SELECT col1 || ', ' || col2 || ', ' || col3 ... FROM my_table 

and call resultSet.next().getString(1) to get that。

更新(基於評論) 我不認爲(這取決於你的JDBC驅動程序和數據庫,真的 - 你必須衡量找出)有介於兩者之間的數據量很大的不同通過列與一個連接字符串發送數據(從數據庫到您的應用程序)。事實上,後者可能甚至會更昂貴,如果你有數字/日期,因爲他們可能會佔用更多字節格式爲文本。

+0

有時候需求很難相信!但它們仍然存在:) 我需要使用tcp/ip套接字逐行輸出數據,並且正在尋找最有效的解決方案。 這會更有效,然後在Java端使用StringBuffer進行連接? – Vishal 2009-10-27 22:38:03

+0

如果你想讓它們真正具有高性能,我會建議使用存儲過程,並將整個事件作爲clob/blob或任何適用的東西返回。 – OscarRyz 2009-10-27 22:43:45

+1

但是你正在從你的**應用程序**流數據,對嗎?從ResultSet中逐字段讀取它並將其格式化爲Java中的字符串。它可能會或可能不會比在數據庫端進行連接更快(只有分析會告訴),但它肯定會更乾淨。例如,諸如數字/日期格式之類的問題可以想到。 – ChssPly76 2009-10-27 22:48:40

3

有沒有一個方法調用做到這一點,但你可以使用像這樣建立一個字符串:

StringBuilder sb = new StringBuilder(); 
ResultSetMetaData rsmd = rs.getMetaData(); 
int numberOfColumns = rsmd.getColumnCount(); 
for (int i = 1; i <= numberOfColumns; i++) { 
    sb.append(rs.getString(i)); 
    if (i < numberOfColumns) { 
     sb.append(", "); 
    } 
} 
String data = sb.toString(); 
+0

這是非常接近的,但是需要一點點調整。它應該包裹在while(rs.next()) – anon58192932 2012-09-13 01:45:48

5

您可以使用BasicRowProcessorApache commons, Dbutils

ResultSet rs = .... 
RowProcessor rp = new BasicRowProcessor(); 
Map m = rp.toMap(rs); 

String s = m.toString(); 

,你會然後爲:

{ id = 1, name = Oscar, lastName = Reyes } 

如果你想擺脫columNames的:

String s = m.values().toString(); 
+1

雖然我當然同意你的評論重新:數據吞吐量vs處理時間我不得不說我發現'BasicRowProcessor.toMap()'(和後續的代碼來訪問地圖)在大型數據集上的絕對性能殺手。 'toArray()'更好,原始的ResultSet訪問更好。 – ChssPly76 2009-10-27 23:00:31

+0

這也是正確的! – Vishal 2009-10-27 23:04:12

相關問題