2009-07-19 1 views
5

Я слишком много методов, которые неоднократно делают что-то вродеОчистка повторяющихся установки и очистки кода Java (JDBC)

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) {} 
} 

Эта установка/демонтаж/очистка заявлений и ResultSets является repetive и скрывает интересные куски код.

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

+1

Одна из настоящих ценностей абстрагирования такого рода мусора из вашего кода заключается в том, что вы убедитесь, что ваш оператор close не имеет NPE (надеюсь, используя 'приобретать, try {use;} finally {release;}' idiom –

+0

Duplicate: http://stackoverflow.com/questions/1072925/remove-boilerplate-from-db-code/1072949#1072949 –

ответ

4

вы можете создать метод, который получает запрос 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; 
} 

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

+1

Наверное, хотите, чтобы этот метод интерфейса выдавал как минимум SQLException. –

+0

хорошая идея, Том. – cd1

10

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

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

+0

+1 от меня. Это именно то, что нужно сделать. Либо использовать Spring как вдохновение, либо включение его в ваш проект будет полезным. – duffymo

+0

В дополнение к сокрытию этого беспорядочного кода установки \ teardown Spring улучшит обработку исключений двумя способами: 1) он будет обрабатывать SQLException и «срывать» его как нечто более значимое 2) исключение, которое является «опрокинутым», будет быть непроверенным, поэтому вам не нужно ловить или бросать что-либо. – javamonkey79

+0

+1. ЛЮБИТЕ, как работает jdbc с пружиной. –

1

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

0

Хотя это не исключает установку и разрывать вниз логик, я часто предпочитаю этот стиль для создания 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(...) return null - В этом случае у вас больше проблем).

+1

Разве этот код не поражает вас, ну ..., уродливый? –

+0

Я полагаю, красота в глазах смотрящего. Я лично считаю эту форму более «привлекательной», чем форма, представленная в вопросе. –

Смежные вопросы