Есть ли другой способ обработки исключений вместо «исключительной обработки»? - PullRequest
0 голосов
/ 21 января 2019
import java.sql.SQLException;

public class JDBC {

    public void create(User user) throws SQLException {

        try (
            Connection connection = dataSource.getConnection();
            PreparedStatement statement = connection.prepareStatement(SQL_INSERT,Statement.RETURN_GENERATED_KEYS);
        ) {
            statement.setString(1, user.getName());
            statement.setString(2, user.getPassword());
            statement.setString(3, user.getEmail());
            // ...

            int affectedRows = statement.executeUpdate();

            if (affectedRows == 0) {
                throw new SQLException("Creating user failed, no rows affected.");
            }

            try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
                if (generatedKeys.next()) {
                    user.setId(generatedKeys.getLong(1));
                }
                else {
                    throw new SQLException("Creating user failed, no ID obtained.");
                }
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Код попытки с ресурсами в порядке, хотя синтаксически он действительно немного неровный.

Вы можете просто обернуть код для повторного использования:

public <DTO> void create(DTO dto, DataSource dataSource, String insertSQL,
        BiConsumer<PreparedStatement, DTO> paramSetter,
        BiConsumer<DTO, Long> primaryKeySetter) throws SQLException {
    try (
        Connection connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(insertSQL,
                                      Statement.RETURN_GENERATED_KEYS);
    ) {
        parameterSetter.apply(statement, dto);
        int affectedRows = statement.executeUpdate();

        if (affectedRows == 0) {
            throw new SQLException("Creating failed, no rows affected.");
        }

        try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
            if (generatedKeys.next()) {
                primaryKeySetter.apply(dto, generatedKeys.getLong(1));
            }
            else {
                throw new SQLException("Creating user failed, no ID obtained.");
            }
        }
    }
}


create(user, dataSource, SQL_INSERT,
    statement -> {
        statement.setString(1, user.getName());
        statement.setString(2, user.getPassword());
        statement.setString(3, user.getEmail());
    },
    (dto, id) -> dto.setId(id));
0 голосов
/ 21 января 2019

Обработка исключений - единственный способ обработки ошибок. В зависимости от типа приложения, которое вы пишете, вы можете, например, использовать AOP Spring. Это потребует дополнительных усилий для понимания аспектно-ориентированного программирования.

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

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