我应该使用什么类型的数据结构来保存表行?

问题描述:

我是新来的Java和刚进入查询数据库。到目前为止,我的结果是ResultSetMetaData。我认为对于数据集中的每一行,我都应该将它添加到某种形式的集合中?任何人都可以告诉我最佳做法吗?我应该使用什么类型的数据结构来保存表行?

感谢,
Jonesy

+0

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

通常我们有一个类对应一个表的类。然后,每当我们在结果集中有一个(完整)行时,我们就创建这个类的一个实例。

例子:

考虑这样创建一个表:

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

一个List似乎很合乎逻辑。如果你不会有重复,并且你不会对结果的顺序感到困扰,那么可能是Set

一个相关的实施List

  • ArrayList:这是一个由数组支持,所以在具体的指标查找要快的Set

相关的实现:

  • HashSet:支持HashMap so O(1)插入时间
  • TreeSet:尊重数据(使用compareTo法)的订货 - 所以遍历数据将在顺序 - 的权衡是O(log n)插入时间

您可以创建类,它代表真实世界的实体。后来如果你想选择ORM技术/工具像休眠,你可以使用相同的类。

创建一个对象来保存数据。循环遍历结果集,为每个结果集创建一个对象,并根据您想要如何使用数据将它们存储在ArrayList或HashMap中。这使您可以关闭数据库,并为您提供良好的对象,您可以在其中构建方法来操作数据。

它还允许您编写使用不需要依赖数据库的对象的代码。如果您以后想要拔出数据库并切换到文本文件或其他任何内容,则很容易,您仍然可以使用相同的对象和方法。

+0

谢谢埃里克。我有一张用户表。我用一个构造函数创建了一个名为DisplayUsers的类来检索用户。对于每个返回的用户,我应该创建一个类User的新对象,例如? – iamjonesy 2010-08-18 12:41:01

+0

是的,与数据库表中的字段具有相同属性的东西很有意义。另外,通常,对象的名称与数据库表的名称非常相似。我使用一个单独的数据库类来实现我想要提取的数据类型的源接口。但是,我非常大量地使用数据库来处理很多不同的模块,并且我想成为源代码不可知论者。 – 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