Передача ResultSet в List(Map)

349
20 ноября 2021, 13:00

Пишу свой домашний проект паралельно обучению. Использую JDBC для работы с MySQL. Надо вытаскивать много данных с разными условиями. Вот сваял зачем то надстройку(обертку) для доступа из других объектов, что бы инкапсулировать работу JDBC.

 public ArrayList<HashMap<String,String>> select(String query){
    Connection conn=SqlConnector.getConnection().connection;
    ArrayList <HashMap<String,String>> arr=new ArrayList<>();
    Statement stmt=null;
    ResultSet rs=null;
    try {
        stmt=conn.createStatement();
        rs=stmt.executeQuery(query);
        ResultSetMetaData rsmd=rs.getMetaData();
        while (rs.next()){
               HashMap<String,String> map=new HashMap<>();
               for (int i = 1; i<rsmd.getColumnCount();i++){
               map.put(rsmd.getColumnName(i),rs.getString(i));
           }
           arr.add(map);
        }
    } catch (SQLException e) {
        log.fatal("Эксепшен запроса",e);
    }
    finally {
        try {
            rs.close();
            stmt.close();
            conn.close();
        } catch (SQLException e) {
            log.fatal("Эксепшен закрытия",e);
        }
    }
    return arr;
}

и вариант использования этого метода:

  Query qm=new Query();
  ArrayList<HashMap<String,String>> arr=qm.select("SELECT * FROM users");
  ArrayList<User> users=new ArrayList<>();
  for (HashMap<String,String> map: arr) {
      User tUser = new User(map.get("name"), Integer.parseInt(map.get("id")), Status.parseStatus(map.get("status")), null);
      System.out.println(tUser);
      users.add(tUser);
  }
  return users;

Плохо так делать? В базе только String и int, ну и Date.

Это мой первый проект и со всем сталкиваюсь впервые. Прошу тапочками не бить))

Answer 1

ResultSet фактически является отражением т.н. курсора - Cursor, по сути он очень экономно расходует ресурсы, обычно он реализуется так, что хранит в памяти только несколько записей, все остальные данные хранятся в БД, откуда по мере необходимости он подкачивает данные. Если записей много - допустим 100 миллионов, то никакой памяти не хватит.

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

Answer 2
  1. один метод перегруженный логикой, один метод должен решать одну задачу.
  2. ручная реализация работы с бд давно уже изжила себя
  3. почему бы не использовать Spring JPA тот же самый для работы с бд, и код будет минимальным, к примеру вот Spring JPA
  4. и ответ на сам вопрос - нет, так не плохо делать, просто есть куча фреймворков, которые позволяют не писать велосипед каждый раз
READ ALSO
maven ошибка при генерации архитипа

maven ошибка при генерации архитипа

Не могу сгенирировать арихтип Ввожу команду

211
Сборка проекта Intellij Idea с базой данных

Сборка проекта Intellij Idea с базой данных

Имеется проект hibernate + javafxПодскажите пожалуйста, как добавить базу данных(sqlite) в jar файл или, если я хочу отдельным файлом, то где прописать...

98
Java. Выбор поля объекта по строке

Java. Выбор поля объекта по строке

Есть запрос с параметромФормат запроса:

110
Запрос MYSQL где два поля одновременно должны быть равны числу

Запрос MYSQL где два поля одновременно должны быть равны числу

Имеется база с полями id, sdel, podtv Нужно вывести поля где и sdel!=1 и podtv!=1Если я пишу запрос через AND

77