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

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

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

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

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

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

matt b 14.05.2009 21:38

J2EE - это "внешняя зависимость" ??

yegor256 11.11.2011 18:25

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

Matt 17.05.2012 16:11

Если кто-то придет сюда с подобным вопросом: вы можете рассмотреть и эту оболочку: sourceforge.net/p/dyndblayer/wiki/Home (я разработчик).

bjdodo 18.03.2015 14:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
14
4
14 657
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

Ответ принят как подходящий

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

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

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

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

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

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

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

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

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

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

Вот и все.

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

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

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

Тот, который я предпочитаю: 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;
    }
}

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

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

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

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

Вы, наверное, должны упомянуть, что вы автор.

schieferstapel 21.09.2019 14:53

Джеду

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

использование

Чтобы использовать его, вы должны добавить его в свой проект и загрузить его синглтон в классе java:

import static com.pwwiur.util.database.Jedoo.database;

И пользоваться им тоже довольно просто:

if (database.count("users") < 100) {
    long id = database.insert("users", new Object[][]{
        {"name", "Amir"},
        {"username", "amirfo"}
    });
    
    database.setString("users", "name", "Amir Forsati", id);

    try(ResultSetHandler rsh = database.all("users")) {
         while(rsh.next()) {
             System.out.println("User ID:" + rsh.getLong("id"));
             System.out.println("User Name:" + rsh.getString("name"));
         }
    }
}

Есть также несколько полезных функций, которые вы можете найти в документации, указанной выше.

Попробуйте мою библиотеку в качестве альтернативы:

<dependency>
  <groupId>com.github.buckelieg</groupId>
  <artifactId>jdbc-fn</artifactId>
  <version>0.2</version>
</dependency>

Подробнее здесь

Другие вопросы по теме