我应该使用什么类型的数据结构来保存表行?
我是新来的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
soO(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