Проектирование универсального класса утилит БД - PullRequest
2 голосов
/ 11 октября 2010

Снова и снова я создаю служебный класс базы данных, который имеет несколько функций, которые выполняют почти одно и то же, но обрабатывают набор результатов немного по-другому.

Например, рассмотрим класс Java, который имеет много функций, которые выглядят так:

public void doSomeDatabaseOperation() {
    Connection con = DriverManager.getConnection("jdbc:mydriver", "user", "pass");
    try {
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT whatever FROM table"); // query will be different each time
        while (rs.next()) {
            // handle result set - differently each time
        }
    } catch (Exception e) {
        // handle
    } finally {
        con.close();
    }
}

Теперь представьте класс с 20 из этих функций.

Как видите, множество шаблонов (открытие соединения, блок try-finally) и единственное, что изменится, - это запрос и способ обработки набора результатов. Этот тип кода встречается во многих языках (учитывая, что вы не используете ORM).

Как вы управляете своими служебными классами БД, чтобы уменьшить дублирование кода? Как выглядит типичный служебный класс БД в вашем языке / фреймворке?

Ответы [ 3 ]

1 голос
/ 12 октября 2010

Похоже, вы могли бы использовать шаблонный шаблон здесь.Это позволит вам определить общие шаги (и их реализации по умолчанию, где это применимо), которые все подклассы предпримут для выполнения действия.Тогда подклассам нужно только переопределить этапы, которые отличаются: запрос SQL, отображение поля DB в поле объекта и т. Д.

1 голос
/ 12 октября 2010

Способ, который я сделал в одном из моих проектов, заключается в том, что я следовал тому, что Spring делает с шаблоном JDBC, и придумал каркас Query.По сути, создайте общий класс, который может принимать операторы select или pl / sql и связывать параметры.Если запрос возвращает набор результатов, также передайте Rowmapper.Этот объект rowmapper будет вызываться платформой для преобразования каждой строки в объект любого типа.

Пример -

Query execute = new Query("{any select or pl/sql}",
                          // Inputs and Outputs are for bind variables.
                          new SQL.Inputs(Integer.class, ...),
                          // Outputs is only meaningful for PL/SQL since the
                          // ResultSetMetaData should be used to obtain queried columns.
                          new SQL.Outputs(String.class));

Если вы хотите rowmapper -

Query execute = new Query("{any select or pl/sql}",
                          // Inputs and Outputs are for bind variables.
                          new SQL.Inputs(Integer.class, ...),
                          // Outputs is only meaningful for PL/SQL since the
                          // ResultSetMetaData should be used to obtain queried columns.
                          new SQL.Outputs(String.class), new RowMapper() {

        public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
            Actor actor = new Actor();
            actor.setFirstName(rs.getString("first_name"));
            actor.setSurname(rs.getString("surname"));
            return actor;
        });

Наконец, класс Row - это вывод, который будет иметь список объектов, если вы передали RowMapper -

for (Row r : execute.query(conn, id)) {
  // Handle the rows
}

Вы можете заняться фантазией и использовать шаблоны, чтобы гарантировать безопасность типов.

0 голосов
/ 11 октября 2010

При использовании .net блок приложения для доступа к данным широко используется для обеспечения поддержки следующего:

Блок приложения [доступ к данным] был разработан для достижения следующего Цели:

Инкапсулировать логику, используемую для выполнения Наиболее распространенные задачи доступа к данным.

Устранить распространенные ошибки кодирования, такие как как не удается закрыть соединения.

Избавьте разработчиков от необходимости написать дублированный код для общих данных Доступ к задачам.

уменьшить потребность в пользовательский код.

Включить лучшее практики для доступа к данным, а описано в .NET Data Access Руководство по архитектуре.

Убедитесь, что, как насколько это возможно, блок приложения функции работают с разными типами базы данных.

Убедитесь, что приложения написано для одного типа базы данных, с точки зрения доступа к данным, так же, как приложения, написанные для другого типа базы данных.

Существует также множество примеров и руководств по использованию: поиск в Google найдет msdn.microsoft, 4guysfromrolla.com, codersource.com и другие.

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