Очистить повторяющийся код установки и очистки Java (JDBC) - PullRequest
5 голосов
/ 20 июля 2009

У меня слишком много методов, которые постоянно делают что-то вроде

Statement stmt = null;
ResultSet rstmt = null;
try {
    stmt = conn.createStatement();
    rstmt = stmt.executeQuery(...);
    while (rstmt.next()) {
        //handle rows
    }


} catch (SQLException e) {
    //handle errors

} finally {
    try {rstmt.close();} catch (SQLException ex) {}
    try {stmt.close();} catch (SQLException ex) {}
}

Эта настройка / удаление / очистка операторов и наборов результатов является повторяющей и скрывает интересные фрагменты кода.

Есть ли какой-либо шаблон или идиома для обработки этого (без введения какой-либо внешней структуры)?

Ответы [ 5 ]

10 голосов
/ 20 июля 2009

Взгляните на SimpleJDBCTemplate в Spring Framework. Это именно то, что вы хотите.

Если вы не хотите вводить внешнюю среду, просто используйте ее для вдохновения, чтобы реализовать свою собственную.

4 голосов
/ 20 июля 2009

вы можете создать метод, который получает запрос SQL и объект для обработки ResultSet. например:

private void executeSql(String sql, ResultSetHandler handler) {
  Statement stmt = null;
  ResultSet rstmt = null;
  try {
    stmt = conn.createStatement();
    rstmt = stmt.executeQuery(sql);
    while (rstmt.next()) {
      handler.handle(rstmt);
    }
  }
  catch (SQLException e) {
    //handle errors
  }
  finally {
    try {rstmt.close();} catch (SQLException ex) {}
    try {stmt.close();} catch (SQLException ex) {}
  }
}

с ResultSetHandler интерфейсом:

public interface ResultSetHandler {
  void handle(ResultSet rs) throws SQLException;
}

и вы можете создать объект анонимного класса, реализующего этот интерфейс, чтобы он не слишком загромождал.

4 голосов
/ 20 июля 2009

Вы хотите, чтобы идиома Казни вокруг.

Вы можете спросить 'Что такое идиома "Выполнить вокруг"? ".

(А если вам нравятся ASCII-диаграммы: мой блог на тему "Факторинг обработки исключений" )

1 голос
/ 20 июля 2009

Вам следует пересмотреть вопрос об использовании менеджеров персистентности Java, таких как iBatis и Hibernate. Они автоматизируют многие шаблоны. Я использовал iBatis, где все операторы SQL аккуратно упакованы и названы в файлах XML, а объем кода должен составлять около 25% от необработанного подхода JDBC. Вы можете постепенно реорганизовать свою систему для использования iBatis.

0 голосов
/ 20 июля 2009

Хотя это не устраняет логику настройки и разрыва, я часто предпочитаю этот стиль, чтобы сделать взаимодействие JDBC более приятным:

Statement statement = connection.createStatement();
try {
    ResultSet results = statement.executeQuery(...);
    try {
        while (results.next()) {
            //handle rows
        }
    } finally {
        results.close();
    }
} finally {
    statement.close();
}

Вложив блоки try, вы автоматически гарантируете, что и для results, и для statement будут вызываться методы close() без обращения к операторам try / catch в вашем блоке finally. Кроме того, запуская блоки try сразу после получения ваших объектов, вам не нужно беспокоиться о проверке значений null (если, конечно, connection.createStatement() или statement.executeQuery(...) не возвращает null - В в этом случае у вас есть большие проблемы).

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