Вернуть с БД SQL данные и поместить в collection List

Рейтинг: 0Ответов: 1Опубликовано: 30.01.2023

Пытаюсь вернуть с БД данные и создать на основе их коллекцию с обьектами User, заполняя поля полученной информацией из БД. Вот мой код:

public List<User> getAllUsers() {
        List<User> users = new ArrayList<>();
        try (Statement statement = Util.getConnection().createStatement()) {
            ResultSet resultSet = statement.executeQuery("SELECT * FROM users");

            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getLong(1));
                user.setName(resultSet.getString(2));
                user.setLastName(resultSet.getString(3));
                user.setAge(resultSet.getByte(4));

                users.add(user);

                System.out.println(user);
            }
        } catch (SQLException e) {
        }
        return users;
    }

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

Ответы

▲ 1

C PreparedStatement код изменится незначительно, но его рекомендуют использовать, так как PreparedStatement (а также CallableStatement) кэшируются драйвером и последующие вызовы таких запросов могут выполняться быстрее.

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

public List<User> getAllUsers() {
    List<User> users = new ArrayList<>();
    String sql = "SELECT * FROM users";
    try (PreparedStatement ps = Util.getConnection().prepareStatement(sql);
        ResultSet rs = ps.executeQuery()
    ) {
        while (rs.next()) {
            User user = new User(rs.getLong(1), rs.getString(2), rs.getString(3), rs.getByte(4));

            users.add(user);

            System.out.println(user);
        }
    } catch (SQLException e) {
    }
    return users;
}

Для полной "минимизации" кода следует использовать Spring Data, а именно интерфейс JPA репозиториев, тогда потребности в коде с лишними SQL запросами не будет, так как даже "пустой" репозиторий предоставляет возможность прочитать все сущности из базы данных при помощи метода CrudRepository::findAll

public interface UserRepository extends CrudRepository<User, Long> {
    // метод доступен "автоматически"
    // List<User> findAll();
}