@Stancialeta

Как встать на правильное получение данных с БД?

Для получения информации из БД в 90% случаев используется вот такая схема метода:
public static String getAnything() throws SQLException, FrameworkException {

        OraclePreparedStatement preparedStatement = null;
        OracleConnection connection = (OracleConnection) TransactionScope.getConnection();
        ResultSet resultSet = null;

        try {
            String sql = ""; // SQL запрос

            preparedStatement = (OraclePreparedStatement)connection.prepareStatement(sql);

            resultSet = preparedStatement.executeQuery();

            String anything = "";

            while (resultSet.next()){ 
                anything = resultSet.getString(1); // Получаем нужные данные
            }

            return anything;

        } catch (Exception e) {
            e.printStackTrace();
            return "";
        } finally {
            if (resultSet != null)
                resultSet.close();
            if (preparedStatement != null)
                preparedStatement.close();
            if (connection != null)
                TransactionScope.releaseConnection(connection);
        }
    }

Очень беспокоит, что Java классы компании практически полностью состоят из множества методов, каркас которого приведен выше. Т.е copy-paste кода выше, с изменением SQL текста запроса и имя метода, и иногда типа возвращаемых данных.
Но это не все! Огромный текст SQL запроса вставлен прямо в тело метода, в который биндится переменные. Читать и поддерживать такой код не удобно.

Как выйти из такой ситуации (убрать дублирование методов, спрятать SQL тексты из Java кода)?

Я пока вижу два выхода:

1. Написания нескольких методов (под разный тип возвращаемых данных) вида:
getString(String sql, String...binds) {  // binds - переменные, которые подставятся в SQL запрос
}

getArray(String sql, String...binds) {
}

2. Активное изучение Hibernate, и его продвижение.

В компании пока 1 Java разработчик - я (позиция Junior), опыта очень мало. Кода очень много.

Спасибо!
  • Вопрос задан
  • 602 просмотра
Решения вопроса 2
@poiuy7
Можно переписать на Spring JdbcTemplate
достаточно удобная вещь (и вам на неё будет просто перейти)
(в последней версии можно делать именновонные параметры, вместо "?", что удобно)

SQL можно вынести в файл, но часто удобнее когда они в коде. Смотрите по ситуации.

С точке зрения дальнейшего частого рефакторинга базы, лучше использовать JPA (аля Hibernate),
но там не всегда просто написать нужный запрос.
Ответ написан
zolt85
@zolt85
Программист
Pattern называется "Шаблон". Идея в том, чтобы вынести общий код в один класс, тем самым избавив остальных от написания портянок по созданию коннекта к БД и его закрытию. Для универсальности можно определить интерфейс для обработки ResultSet. Тогда все запросы можно будет свести к обращению к классу шаблона с передачей ему тела запроса и обработчика ResultSet.

Примерно может выглядеть так:
public class SqlTemplate<T> {

    private String query;
    private Object[] queryParams;

    public SqlTemplate(String query, Object ... queryParams){
          this.query = query;
          this.queryParams = queryParams == null?new Object[0]:queryParams;
    }

   public T select(RsetHandler<T> handler) {
      //тут весь код по созданию коннекта
     ResultSet rs = connect.query(query, queryParams);
     return handler.handle(rs);
     //тут код по обработке ошибок и закрытию коннекта
   }
}


это если нет возможности или желания прикручивать к проекту ORM, а-ля Hibernate
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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