eugene_leshchinskiy
@eugene_leshchinskiy

Должен ли слой DAO проверять возможные ошибки?

Привет. У меня есть слой DAO, где идет работа с базой данных. Там есть методы что-то вроде createUser(). Вгляните:
public boolean createUser(User user) throws DAOException {

        ConnectionPool connectionPool = ConnectionPoolImpl.getInstance();

        try (Connection connection = connectionPool.getConnection()) {
            final String CREATE_USER_SQL = "INSERT INTO hostel.user" +
                    "(`login`," +
                    "`password`," +
                    "`first_name`," +
                    "`last_name`," +
                    "`sex`," +
                    "`country`," +
                    "`city`," +
                    "`registration_date`," +
                    "`date_of_birth`," +
                    "`phone_number`," +
                    "`discount_id`," +
                    "`account_status_id`)" +
                    "VALUES (?, (SELECT SHA2(?, 256)), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";


            try (PreparedStatement preparedStatement =
                         connection.prepareStatement(CREATE_USER_SQL)) {

                preparedStatement.setString(1, user.getLogin());
                preparedStatement.setString(2, user.getPassword());
                preparedStatement.setString(3, user.getFirstName());
                preparedStatement.setString(4, user.getLastName());
                preparedStatement.setBoolean(5, user.isSex());
                preparedStatement.setString(6, user.getCountry());
                preparedStatement.setString(7, user.getCity());
                preparedStatement.setDate(8, new Date(user.getRegistrationDate().getTime()));
                preparedStatement.setDate(9, new Date(user.getDateOfBirth().getTime()));
                preparedStatement.setInt(10, user.getPhoneNumber());
                preparedStatement.setInt(11, user.getDiscountId());
                preparedStatement.setInt(12, user.getAccountStatusId());

                return preparedStatement.executeUpdate() > 0;
            }
        } catch (SQLException e) {
            logger.log(Level.ERROR, e);
            throw new DAOException("Error while executing the query.");
        } catch (ConnectionPoolException e) {
            logger.log(Level.ERROR, e);
            throw new DAOException("Error trying to work with the connection pool.", e);
        }

    }

Вопрос такой. Приходит user = null - будет экспешен, приходит user в null-полями - будет эксепшен, приходит user с неверными данными (например несуществующим discount_id - это внешний ключ) - экспешен. Я то могу и собираюсь все это проверить и исключить в слое сервиса, но будет ли это правильно? Или все-таки еще раз проверять это все на DAO? Тогда получается слишком много логики в нем
  • Вопрос задан
  • 170 просмотров
Пригласить эксперта
Ответы на вопрос 1
1. Входные параметры проверять не возбраняется и к бизнес-логике это не относится. Т.е. проверки не помешают.
2. Несмотря на проверки п.1, входные параметры должны быть корректны и не вызывать ошибок, т.е. в вызывающих методах сервисного слоя, должны корректно формироваться объекты User в любом случае.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы