JDBC, оптимизация кода

243
04 марта 2017, 02:45

Есть три метода, которые отличаются буквально в пару строчек. Можно как-то избежать дублирования кода?

@Override
public List<Employee> findAll()  {
    List<Employee> list = new ArrayList<>();
    Connection connection = null;
    try {
        connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_FIND_ALL);
        ResultSet rs = statement.executeQuery();
        while (rs.next()) {
            Employee tempEmployee = convertRowToEmployee(rs);
            list.add(tempEmployee);
        }
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
    finally {
        dataSource.closeConnection(connection);
    }
    return list;
}
@Override
public List<Employee>  findByName(String name) {
    List<Employee> list = new ArrayList<>();
    Connection connection = null;
    try {
        connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_FIND_BY_NAME);
        statement.setString(1, name);
        ResultSet rs = statement.executeQuery();
        while (rs.next()) {
            Employee tempEmployee = convertRowToEmployee(rs);
            list.add(tempEmployee);
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        dataSource.closeConnection(connection);
    }
    return list;
}

@Override
public List<Employee> findAllAbsenceEmployeeByDate(Date startDate, Date endDate) {
    List<Employee> list = new ArrayList<>();
    Connection connection = null;
    try {
        connection = dataSource.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_FIND_ALL_ABSENCE_BY_DATE);
        statement.setDate(1, startDate);
        statement.setDate(2, endDate);
        ResultSet rs = statement.executeQuery();
        while (rs.next()) {
            Employee tempEmployee = convertRowToEmployee(rs);
            list.add(tempEmployee);
        }
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
    finally {
        dataSource.closeConnection(connection);
    }
    return list;
}

Преобразование строк в объект вынес в отдельный метод convertRowToEmployee(rs), соединение и закрытие вынес в отдельный класс DataSource

Answer 1

Оптимизировать лучше не надо, так как потом в случае расширения (добавления новых фич) Вам придется заново все по полной программе тестировать плюс потеряете в читабельности кода. Также у Вас в коде присутствует ошибка. Необходимо закрывать PreparedStatement и ResultSet. Рекомендую метод закрытия этих объектов также реализовать в DataSource как то так:

public void close(){
    if (conn != null){
        try {
            conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
    public void close(PreparedStatement ps){
    if (ps != null){
        try {
            ps.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
public void close(CallableStatement cs){
    if (cs != null){
        try {
            cs.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
public void close(PreparedStatement ps, ResultSet rs){
    close(ps);
    if (rs != null){
        try {
            rs.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
public void close(CallableStatement cs, ResultSet rs){
    close(cs);
    if (rs != null){
        try {
            rs.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
READ ALSO
Выдает ошибку NullPointerException

Выдает ошибку NullPointerException

На строчке message = textMessagegetText() выдает java

306
перетаскивание ячеек html jquery

перетаскивание ячеек html jquery

Есть ли в природе готовый плагин jquery для перетаскивания ячеек html ? чтоб в дальнейшем их можно было сохранить в базу новые значения позиций

351
Проверка адаптивности сайта на Safari

Проверка адаптивности сайта на Safari

Всем приветЕсть сайт, адаптировал с помощью bootstrap

337
Задать картинку при вставке ссылки на сайт

Задать картинку при вставке ссылки на сайт

Вот так это реализовано в learnjavascript

220