Простая обертка jdbc
Чтобы реализовать код доступа к данным в нашем приложении, нам нужна фреймворк для переноса вокруг jdbc (ORM не является нашим выбором из-за масштабируемости).
Самый классный фреймворк, с которым я работал, - Spring -Jdbc. Однако политика моей компании заключается в том, чтобы избежать внешних зависимостей, особенно spring, J2EE и т.д.
Итак, мы думаем о создании собственной удобной jdbc-фреймворк с функциональностью, аналогичной Spring -jdbc: сопоставление строк, обработка ошибок, поддержка функций java5, но без поддержки транзакций.
Есть ли у кого-нибудь опыт написания такой оболочки оболочки jdbc?
Если у кого-то есть опыт использования других фреймворков оболочки jdbc, поделитесь своим опытом.
Спасибо заранее.
Ответы
Ответ 1
Мы написали нашу собственную обертку. Эта тема заслуживает внимания, но я сомневаюсь, что у меня будет время написать ее, вот некоторые ключевые моменты:
-
мы обняли sql и не пытались скрыть это. единственная настройка заключалась в том, чтобы добавить поддержку названных параметров. параметры важны, потому что мы не рекомендуем использовать "на лету" sql (по соображениям безопасности), и мы всегда используем PreparedStatements.
-
для управления подключением мы использовали Apache DBCP. Это было удобно в то время, но неясно, насколько это необходимо для современных реализаций JDBC (документации по этому материалу не хватает). DBCP также объединяет PreparedStatements.
-
мы не беспокоились о сопоставлении строк. вместо этого (для запросов) мы использовали нечто похожее на Apache dbutil ResultSetHandler, которое позволяет "подавать" результирующий набор в метод, который затем может сбрасывать информацию, где бы вы ни хотели. Это более гибко, и на самом деле было бы непросто реализовать ResultSetHandler для сопоставления строк. для вставок/обновлений мы создали общий класс записи (в основном хэш файл с некоторыми дополнительными колокольчиками и свистами). самая большая проблема с сопоставлением строк (для нас) заключается в том, что вы застреваете, как только вы делаете "интересный" запрос, потому что у вас могут быть поля, которые сопоставляются с разными классами; потому что у вас может быть иерархическая структура классов, но плоский результирующий набор; или потому, что отображение сложное и зависит от данных.
-
мы создали журнал регистрации ошибок. для обработки исключений: по запросу мы ловушки и логарифм, но для обновления мы ловушки, логарифмируем и восстанавливаем непроверенные исключения.
-
мы предоставили поддержку транзакций с использованием метода обертки. вызывающий обеспечивает код, который выполняет транзакцию, и мы следим за тем, чтобы транзакция была должным образом управляемой, без каких-либо шансов забыть закончить транзакцию и встроить откаты и обработку ошибок.
-
мы добавили очень упрощенную схему отношений, которая позволяет использовать одно обновление/вставку для записи и всех ее зависимостей. чтобы все было просто, мы не использовали это в запросах, и мы специально решили не поддерживать это с помощью удаления, потому что более надежно использовать каскадные удаления.
Эта оболочка успешно используется в двух проектах на сегодняшний день. Это, конечно, легкий, но в наши дни все говорят, что их код легкий. Что еще более важно, это увеличивает производительность программиста, уменьшает количество ошибок (и облегчает поиск проблем), и относительно легко отслеживать их, если это необходимо, потому что мы не верим в добавление большого количества слоев, чтобы обеспечить красивую архитектуру.
Ответ 2
Spring -JDBC - это фантастика. Учтите, что для проекта с открытым исходным кодом, такого как Spring, минимизируется нижняя сторона внешней зависимости. Вы можете принять самую стабильную версию Spring, которая удовлетворяет вашим требованиям к абстракции JDBC, и вы знаете, что вы всегда сможете изменить исходный код самостоятельно, если у вас когда-либо возникнут проблемы - без зависимости от внешней стороны. Вы также можете изучить реализацию любых проблем безопасности, которые могут возникнуть у вашей организации с кодом, написанным внешней стороной.
Ответ 3
Тот, который я предпочитаю: Dalesbred. Он лицензирован MIT.
Простой пример получения всех строк для пользовательского класса (Department).
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;
}
}
Отказ от ответственности: это компания, для которой я работаю.
Ответ 4
Попробуйте JdbcSession
из jcabi-jdbc. Это так же просто, как JDBC, например:
String name = new JdbcSession(source)
.sql("SELECT name FROM foo WHERE id = ?")
.set(123)
.select(new SingleOutcome<String>(String.class));
Что это.
Ответ 5
Это звучит как очень недальновидное решение. Рассмотрите затраты на разработку/поддержание такой структуры, особенно, когда вы можете ее получить, и ее исходный код бесплатно. Мало того, что вам не нужно самостоятельно заниматься разработкой, вы можете изменить его по своему усмотрению, если потребуется.
При этом вам нужно дублировать понятие JdbcTemplate и его обратные вызовы (PreparedStatementCreator, PreparedStatementCallback), а также RowMapper/RowCallbackHandler. Не следует слишком сложно писать что-то вроде этого (особенно учитывая, что вам не нужно выполнять управление транзакциями).
Как бы я ни сказал, зачем писать, когда вы можете получить его бесплатно и изменить исходный код по своему усмотрению?