2008-11-18 12 views
13

Чтобы реализовать код доступа к данным в нашем приложении, нам нужна фреймворк для переноса вокруг jdbc (ORM не является нашим выбором из-за масштабируемости).simple jdbc wrapper

Самый классный каркас, с которым я работал, - Spring-Jdbc. Тем не менее, политика моей компании заключается в том, чтобы избежать внешних зависимостей, особенно весны, J2EE и т. Д. Итак, мы думаем о написании собственной удобной jdbc-структуры с функциональными возможностями Spring-jdbc: сопоставление строк, обработка ошибок, поддерживающие функции java5, но без поддержки транзакций.

У кого-нибудь есть опыт написания такой оболочки оболочки jdbc? Если у кого-то есть опыт использования других фреймворков оболочки jdbc, поделитесь своим опытом.

Заранее спасибо.

+10

«Политика моей компании заключается в том, чтобы избежать внешних зависимостей, особенно весны, J2EE и т. Д.» вау это звучит как кошмар. Звучит как бесконечный цикл повторного изобретательства колеса –

+7

J2EE - это «внешняя зависимость» ?? – yegor256

+0

Если вы ищете упрощенное выполнение SQL для сопоставления объектов, mybatis является опцией. Я бы не назвал его ORM в том смысле, что он не делает графы объектов, такие как hibernate. Он просто позволяет вам выполнить sql, вытягивать параметры со своего ввода или сопоставлять столбцы с выводами (объектами). – Matt

ответ

13

Мы написали нашу собственную обертку. Эта тема достойна бумаги, но я сомневаюсь, что я когда-либо время, чтобы написать это, так вот некоторые ключевые моменты:

  • мы обнялись и SQL не сделал никаких попыток скрыть его. единственная настройка заключалась в том, чтобы добавить поддержку названных параметров. параметры важны, потому что мы не рекомендуем использовать «на лету» sql (по соображениям безопасности), и мы всегда используем PreparedStatements.

  • для управления соединением, мы использовали Apache DBCP. Это было удобно в то время, но неясно, насколько это необходимо для современных реализаций JDBC (в документах по этому поводу не хватает). DBCP также объединяет PreparedStatements.

  • Мы не беспокоились о картировании строк. вместо этого (для запросов) мы использовали что-то похожее на ResultSetHandler от Apache dbutil, которое позволяет «подавать» набор результатов в метод, который затем может выгрузить информацию, где бы вы ни хотели. Это более гибко, и на самом деле было бы непросто реализовать ResultSetHandler для сопоставления строк. для вставок/обновлений мы создали общий класс записи (в основном хэш-файл с некоторыми дополнительными колокольчиками и свистами). самая большая проблема с сопоставлением строк (для нас) заключается в том, что вы застреваете, как только вы делаете «интересный» запрос, потому что у вас могут быть поля, которые сопоставляются с разными классами; потому что у вас может быть иерархическая структура классов, но плоский результирующий набор; или потому, что отображение является сложным и зависит от данных.

  • мы встроенный ошибка регистрация. для обработки исключений: по запросу мы ловушка и лог, но для обновления мы задерживаем, регистрируем и восстанавливаем непроверенные исключения.

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

  • В дальнейшем мы добавили очень упрощенную схему отношений, которая позволяет использовать одно обновление/вставку для записи и всех ее зависимостей. чтобы все было просто, мы не использовали это для запросов, и мы специально решили не поддерживать это с помощью удаления, потому что более надежно использовать каскадные удаления.

Этот обертку успешно используется в двух проектах на сегодняшний день. Это, конечно, легкий, но в наши дни все говорят, что их код легкий. Что еще более важно, это увеличивает производительность программиста, уменьшает количество ошибок (и облегчает поиск проблем), и относительно легко проследить, если это необходимо, потому что мы не верим в добавление большого количества слоев, чтобы обеспечить красивую архитектуру.

5

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

1

Пробег: JdbcSession от jcabi-jdbc. Это так же просто, как JDBC, например:

String name = new JdbcSession(source) 
    .sql("SELECT name FROM foo WHERE id = ?") 
    .set(123) 
    .select(new SingleOutcome<String>(String.class)); 

Всё.

1

Это звучит как очень недальновидное решение. Рассмотрите затраты на разработку/поддержание такой структуры, особенно когда вы можете ее получить, и это исходный код бесплатно. Мало того, что вам не нужно самостоятельно заниматься разработкой, вы можете изменить его по своему усмотрению, если потребуется.

Это означает, что вам действительно нужно дублировать понятие JdbcTemplate и его обратные вызовы (PreparedStatementCreator, PreparedStatementCallback), а также RowMapper/RowCallbackHandler. Не следует слишком сложно писать что-то вроде этого (особенно учитывая, что вам не нужно выполнять управление транзакциями).

Как бы я ни сказал, зачем писать, когда вы можете получить его бесплатно и изменить исходный код по своему усмотрению?

2

Тот, который я предпочитаю: Dalesbred. Это лицензия MIT.

Простой пример получения всех строк для пользовательского класса (отдела).

List<Department> departments = db.findAll(Department.class, 
    "select id, name from department"); 

, когда пользовательский класс определяется как:

public final class Department { 
    private final int id; 
    private final String name; 

    public Department(int id, String name) { 
     this.id = id; 
     this.name = name; 
    } 
} 

Отказ от ответственности: это компанией я работаю.