Вернуть с БД SQL данные и поместить в collection List
Пытаюсь вернуть с БД данные и создать на основе их коллекцию с обьектами 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();
}