простая оболочка jdbc - PullRequest
       51

простая оболочка jdbc

14 голосов
/ 18 ноября 2008

Чтобы реализовать код доступа к данным в нашем приложении, нам нужна некоторая структура, охватывающая jdbc (ORM - не наш выбор из-за масштабируемости).

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

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

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

Ответы [ 6 ]

14 голосов
/ 18 ноября 2008

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

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

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

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

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

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

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

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

5 голосов
/ 18 ноября 2008

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

3 голосов
/ 11 октября 2012

Тот, который я предпочитаю: Дейлсбред . Это лицензия 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;
    }
}

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

1 голос
/ 17 мая 2012

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

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

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

1 голос
/ 17 мая 2012

Попробуйте JdbcSession из jcabi-jdbc . Это так просто, как должно быть в JDBC, например:

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

Вот и все.

0 голосов
/ 13 сентября 2018

mJDBC: https://mjdbc.github.io/

Я использую его годами и считаю его очень полезным.

Она основана на библиотеке JDBI, но не имеет зависимостей, добавляет поддержку транзакций, предоставляет счетчики производительности и позволяет легко переключаться на самый низкий возможный уровень SQL в Java (старый простой JDBC API) в случае, если вам это действительно нужно.

...