Какой тип структуры данных мне следует использовать для хранения строк таблицы? - PullRequest
9 голосов
/ 18 августа 2010

Я новичок в Java и только начинаю обращаться к базам данных.Пока у меня есть результаты в ResultSetMetaData .Я думаю, что для каждой строки в наборе данных я должен добавить его в какую-либо форму коллекции?Кто-нибудь может сказать мне лучшую практику для этого?

Спасибо,
Джонси

Ответы [ 7 ]

8 голосов
/ 18 августа 2010

Создать объект для хранения данных.Циклически просматривайте набор результатов, создавая для каждого объект, и сохраняйте их в ArrayList или HashMap, в зависимости от того, как вы хотите использовать данные.Это позволяет вам закрыть базу данных и дает хорошие объекты, на которых вы можете создавать методы для манипулирования данными.

Это также позволяет вам писать код, который использует объект, на который не нужно полагатьсябаза данных.Если вы когда-нибудь захотите извлечь базу данных позже и переключиться на текстовые файлы или что-то еще, это легко сделать, и вы все равно можете использовать те же объекты и методы.

7 голосов
/ 18 августа 2010

Обычно у нас есть класс с полями, которые соответствуют таблице. Затем, когда у нас есть (полная) строка в наборе результатов, мы создаем экземпляр этого класса.

Пример:

Рассмотрим таблицу, созданную так:

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);
}
5 голосов
/ 18 августа 2010

A List кажется вполне логичным. Если у вас не будет дубликатов, и вас не волнует порядок результатов, то, возможно, Set.

Соответствующая реализация List:

  • ArrayList: Это поддерживается массивом, поэтому поиск по определенным индексам должен быть быстрым

Соответствующие реализации Set:

  • HashSet: поддерживается HashMap, поэтому O(1) время вставки
  • TreeSet: соблюдает порядок данных (используя метод compareTo), поэтому итерация данных будет в порядке - компромисс составляет O(log n) время вставки
1 голос
/ 18 августа 2010

Обычно я следую той же схеме, что и Andreas_D.

Объект, используемый для хранения каждой строки данных (в данном случае, класса Customer), называется объектом передачи данных (TO).

Код, который получает соединение с базой данных, запрашивает базу данных, заполняет TO и возвращает их (обычно в виде списка), называется объектом доступа к данным (DAO).

Вы можете прочитатьподробнее об этом шаблоне проектирования здесь

1 голос
/ 18 августа 2010

Во-первых, класс ResultSetMetaData содержит «информацию о типах и свойствах столбцов в объекте ResultSet».Таким образом, результаты вашего запроса находятся в ResultSet, а не в объекте ResultSetMetaData.

Вы можете увидеть Извлечение значений из наборов результатов Учебник Java для получения информации о том, как извлечь ваши данные изResultSet.Вы должны иметь возможность просто пройти через ResultSet, как показано, и поместить свои записи в список или карту, в зависимости от того, как вы хотите получить доступ к данным позже.

1 голос
/ 18 августа 2010

Вы можете создать класс, который представляет сущности реального мира. Позже, если вы захотите выбрать технологию / инструмент ORM, например, спящий, вы можете использовать те же классы.

0 голосов
/ 04 марта 2019

Многие из приведенных выше ответов советуют создать класс для хранения столбцов строки и создать список массивов объектов класса. Не следует ли нам также беспокоиться о том, что результирующий набор огромен, хотя обрабатывается только меньше строк, не будет ли он чрезмерно потреблять память, если сборщик мусора не восстановит с той же скоростью, с которой создаются объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...