Чтобы реализовать код доступа к данным в нашем приложении, нам нужна некоторая структура для обертывания jdbc (ORM - не наш выбор из-за масштабируемости).
Самый крутой фреймворк, с которым я работал, - Spring-JDBC. Однако политика моей компании - избегать внешних зависимостей, особенно Spring, J2EE и т. д. Итак, мы думаем о написании собственной удобной структуры jdbc с функциональностью, аналогичной Spring-jdbc: отображение строк, обработка ошибок, поддерживающие функции java5, но без поддержки транзакций.
Есть ли у кого-нибудь опыт написания такого фреймворка jdbc wrapper? Если у кого-то есть опыт использования других фреймворков-оболочек jdbc, поделитесь, пожалуйста, своим опытом.
Заранее спасибо.
J2EE - это "внешняя зависимость" ??
Если вы ищете упрощенное выполнение SQL для сопоставления объектов, mybatis - вариант. Я бы не назвал это ORM в том смысле, что он не создает графы объектов, как спящий режим. Он просто позволяет вам выполнить sql и получить параметры из вашего ввода или сопоставить столбцы с объектами вывода.
Если кто-то придет сюда с подобным вопросом: вы можете рассмотреть и эту оболочку: sourceforge.net/p/dyndblayer/wiki/Home (я разработчик).




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), если он вам действительно нужен.
Вы, наверное, должны упомянуть, что вы автор.
Существует класс-оболочка Джеду, который использует пул соединений с базой данных и одноэлементный шаблон для доступа к нему как к общей переменной. Он имеет множество функций для быстрого выполнения запросов.
Чтобы использовать его, вы должны добавить его в свой проект и загрузить его синглтон в классе 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>
Подробнее здесь
«политика моей компании - избегать внешних зависимостей, особенно Spring, J2EE и т. д.» вау, это похоже на кошмар. Похоже на бесконечный цикл изобретения колеса