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

时间:2010-08-18 12:20:47

标签: java sql jdbc collections

我是Java新手,只是进入查询数据库。到目前为止,我的结果是 ResultSetMetaData 。我认为对于数据集中的每一行,我应该将它添加到某种形式的集合中?谁能告诉我这方面的最佳做法?

谢谢,
Jonesy

7 个答案:

答案 0 :(得分:8)

创建一个对象来保存数据。遍历结果集,为每个结果集创建一个对象,并将它们存储在ArrayList或HashMap中,具体取决于您希望如何使用数据。这允许您关闭数据库,它为您提供了可以构建操作数据的方法的好对象。

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

答案 1 :(得分:7)

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

示例:

考虑一个像这样创建的表:

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);
  }
}

现在,如果您读取数据并拥有ResultSet,您将创建一个新的客户对象并设置字段:

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);
}

答案 2 :(得分:5)

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

List的相关实施:

  • ArrayList:这是由数组支持的,因此对特定索引的查找应该很快

Set的相关实施:

  • HashSet:以HashMap O(1)插入时间
  • 为后盾
  • TreeSet:尊重数据的排序(使用compareTo方法) - 因此迭代数据将按顺序进行 - 权衡是O(log n)插入时间

答案 3 :(得分:1)

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

答案 4 :(得分:1)

首先,ResultSetMetaData类包含“有关ResultSet对象中列的类型和属性的信息。”因此,查询的结果位于ResultSet中,而不是ResultSetMetaData对象中。

您可以查看Retrieving Values from Result Sets Java教程,了解有关如何从ResultSet中提取数据的信息。您应该能够如图所示循环遍历ResultSet,并将您的记录放在List或Map中,具体取决于您以后如何访问数据。

答案 5 :(得分:1)

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

用于包含每行数据的对象(在本例中为Customer类)称为数据传输对象(TO)。

获取数据库连接,查询数据库,填充TO并返回它们(通常在List中)的代码称为数据访问对象(DAO)。

您可以阅读有关此设计模式的更多信息here

答案 6 :(得分:0)

上面的许多答案建议创建一个类来保存一行的列并创建类对象的数组列表。我们不应该担心结果集是否庞大,尽管只处理了较少的行,除非垃圾收集器以与创建对象相同的速度回收,否则不会过度消耗内存。