我是新來的Java和剛進入查詢數據庫。到目前爲止,我的結果是ResultSetMetaData。我認爲對於數據集中的每一行,我都應該將它添加到某種形式的集合中?任何人都可以告訴我最佳做法嗎?我應該使用什麼類型的數據結構來保存錶行?
感謝,
Jonesy
我是新來的Java和剛進入查詢數據庫。到目前爲止,我的結果是ResultSetMetaData。我認爲對於數據集中的每一行,我都應該將它添加到某種形式的集合中?任何人都可以告訴我最佳做法嗎?我應該使用什麼類型的數據結構來保存錶行?
感謝,
Jonesy
通常我們有一個類對應一個表的類。然後,每當我們在結果集中有一個(完整)行時,我們就創建這個類的一個實例。
例子:
考慮這樣創建一個表:
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);
}
一個List
似乎很合乎邏輯。如果你不會有重複,並且你不會對結果的順序感到困擾,那麼可能是Set
。
一個相關的實施List
:
ArrayList
:這是一個由數組支持,所以在具體的指標查找要快的Set
相關的實現:
HashSet
:支持HashMap
so O(1)
插入時間TreeSet
:尊重數據(使用compareTo
法)的訂貨 - 所以遍歷數據將在順序 - 的權衡是O(log n)
插入時間您可以創建類,它代表真實世界的實體。後來如果你想選擇ORM技術/工具像休眠,你可以使用相同的類。
創建一個對象來保存數據。循環遍歷結果集,爲每個結果集創建一個對象,並根據您想要如何使用數據將它們存儲在ArrayList或HashMap中。這使您可以關閉數據庫,併爲您提供良好的對象,您可以在其中構建方法來操作數據。
它還允許您編寫使用不需要依賴數據庫的對象的代碼。如果您以後想要拔出數據庫並切換到文本文件或其他任何內容,則很容易,您仍然可以使用相同的對象和方法。
謝謝埃裏克。我有一張用戶表。我用一個構造函數創建了一個名爲DisplayUsers的類來檢索用戶。對於每個返回的用戶,我應該創建一個類User的新對象,例如? – iamjonesy 2010-08-18 12:41:01
是的,與數據庫表中的字段具有相同屬性的東西很有意義。另外,通常,對象的名稱與數據庫表的名稱非常相似。我使用一個單獨的數據庫類來實現我想要提取的數據類型的源接口。但是,我非常大量地使用數據庫來處理很多不同的模塊,並且我想成爲源代碼不可知論者。 – 2010-08-18 13:49:46
首先,ResultSetMetaData類擁有「有關ResultSet對象中列的類型和屬性的信息」。所以查詢的結果在ResultSet中,而不在ResultSetMetaData對象中。
有關如何從ResultSet中提取數據的信息,請參閱Retrieving Values from Result Sets Java教程。您應該能夠像所顯示的那樣循環訪問ResultSet,並將您的記錄放入List或Map中,具體取決於您以後如何訪問數據。
我通常遵循Andreas_D描述的相同模式。
用於包含每行數據(在本例中爲Customer類)的對象稱爲數據傳輸對象(TO)。
獲取數據庫連接,查詢db,填充並返回它們(通常在List中)的代碼被稱爲數據訪問對象(DAO)。
你可以閱讀更多關於這種設計模式here
你的結果很可能在ResultSet而不是的ResultSetMetaData。 – 2010-08-18 20:26:31