2010-08-18 118 views
9

我是新來的Java和剛進入查詢數據庫。到目前爲止,我的結果是ResultSetMetaData。我認爲對於數據集中的每一行,我都應該將它添加到某種形式的集合中?任何人都可以告訴我最佳做法嗎?我應該使用什麼類型的數據結構來保存錶行?

感謝,
Jonesy

+0

你的結果很可能在ResultSet而不是的ResultSetMetaData。 – 2010-08-18 20:26:31

回答

6

通常我們有一個類對應一個表的類。然後,每當我們在結果集中有一個(完整)行時,我們就創建這個類的一個實例。

例子:

考慮這樣創建一個表:

CREATE TABLE customer (First_Name char(50), Last_Name char(50), 
    Address char(50), City char(50), Country char(25), Birth_Date date); 

模型類會是這樣的:

public class Customer { 
    private String firstName; 
    private String lastName; 
    private String address; 
    private String city; 
    private String country; 
    private Date date; 


    public String getFirstName() { 
    return firstName; 
    } 
    // getters for all fields 

    public void setFirstName(String firstName) { 
    this.firstName = firstName; 
    } 
    // setters for all fields 

    public String toString() { 
    return String.format("[%s, %s, %s, %s, %s, %s]", firstName, 
      lastName, address, city, country, date); 
    } 
} 

現在,如果你讀取數據,並有一個結果,您將創建一個新的客戶對象並設置字段:

List<Customer> customers = new ArrayList<Customer>(); 
ResultSet rs = stmt.executeQuery("SELECT * from CUSTOMER;"); 
while (rs.next()) { 
    Customer customer = new Customer(); 
    customer.setFirstName(rs.get("First_Name")); 
    // ... and so on 

    customers.add(customer); 
} 
+0

在這種情況下,查詢是否必須在與對象創建代碼相同的類中? – iamjonesy 2010-08-18 12:50:18

+0

不,但我會這樣設計它,除非應用程序是分隔查詢和創建模型實例的那麼大。該列表可以在其他地方創建,只需在其中添加即可顯示簡短而完整的摘錄。 – 2010-08-18 15:31:31

+0

好的謝謝,如果你不介意的另一個問題。一旦我創建了每條記錄的對象。我可以用這個對象做些什麼事情?通常這是.. – iamjonesy 2010-08-18 17:38:19

5

一個List似乎很合乎邏輯。如果你不會有重複,並且你不會對結果的順序感到困擾,那麼可能是Set

一個相關的實施List

  • ArrayList:這是一個由數組支持,所以在具體的指標查找要快的Set

相關的實現:

  • HashSet:支持HashMap so O(1)插入時間
  • TreeSet:尊重數據(使用compareTo法)的訂貨 - 所以遍歷數據將在順序 - 的權衡是O(log n)插入時間
1

您可以創建類,它代表真實世界的實體。後來如果你想選擇ORM技術/工具像休眠,你可以使用相同的類。

8

創建一個對象來保存數據。循環遍歷結果集,爲每個結果集創建一個對象,並根據您想要如何使用數據將它們存儲在ArrayList或HashMap中。這使您可以關閉數據庫,併爲您提供良好的對象,您可以在其中構建方法來操作數據。

它還允許您編寫使用不需要依賴數據庫的對象的代碼。如果您以後想要拔出數據庫並切換到文本文件或其他任何內容,則很容易,您仍然可以使用相同的對象和方法。

+0

謝謝埃裏克。我有一張用戶表。我用一個構造函數創建了一個名爲DisplayUsers的類來檢索用戶。對於每個返回的用戶,我應該創建一個類User的新對象,例如? – iamjonesy 2010-08-18 12:41:01

+0

是的,與數據庫表中的字段具有相同屬性的東西很有意義。另外,通常,對象的名稱與數據庫表的名稱非常相似。我使用一個單獨的數據庫類來實現我想要提取的數據類型的源接口。但是,我非常大量地使用數據庫來處理很多不同的模塊,並且我想成爲源代碼不可知論者。 – 2010-08-18 13:49:46

1

首先,ResultSetMetaData類擁有「有關ResultSet對象中列的類型和屬性的信息」。所以查詢的結果在ResultSet中,而不在ResultSetMetaData對象中。

有關如何從ResultSet中提取數據的信息,請參閱Retrieving Values from Result Sets Java教程。您應該能夠像所顯示的那樣循環訪問ResultSet,並將您的記錄放入List或Map中,具體取決於您以後如何訪問數據。

1

我通常遵循Andreas_D描述的相同模式。

用於包含每行數據(在本例中爲Customer類)的對象稱爲數據傳輸對象(TO)。

獲取數據庫連接,查詢db,填充並返回它們(通常在List中)的代碼被稱爲數據訪問對象(DAO)。

你可以閱讀更多關於這種設計模式here

相關問題