Вы можете использовать это руководство, чтобы понять, что такое jOOQ, как быстро начать работу с ним и как jOOQ интегрируется с такими библиотеками, как Spring и Hibernate, или сравнивается с ними.
Что такое jOOQ?
jOOQ – это популярная библиотека баз данных Java, которая позволяет писать типобезопасные SQL-запросы на Java. Как это работает?
Вы используете генератор кода jOOQ для подключения к вашей базе данных и создания классов Java, которые моделируют таблицы и столбцы вашей базы данных.
Вместо того, чтобы писать строковые операторы SQL с помощью простого JDBC , вы будете использовать эти сгенерированные классы Java для написания ваших SQL-запросов.
jOOQ удобно преобразует эти классы Java и запросы в реальный SQL, выполняет их в базе данных и сопоставляет результаты обратно с кодом Java.
Это, конечно, всего лишь обзор очень высокого уровня. Если вы хотите узнать более подробно, как работает jOOQ: Читайте дальше.
jOOQ: Ускоренный курс
Сначала: Ваша База Данных, Затем: Ваши классы Java
По сравнению с другими популярными библиотеками, такими как Hibernate , jOOQ использует подход, ориентированный на базу данных или SQL-ориентированный подход.
С помощью Hibernate вы обычно сначала начинаете писать свои классы Java, а затем позволяете Hibernate или такому инструменту, как Liquibase или Flyway, генерировать соответствующие таблицы базы данных.
С помощью jOOQ вы начинаете со своей базы данных. Ваша база данных и таблицы должны уже существовать, и затем вы используете генератор кода jOOQ для создания классов Java для вас.
Использование генератора кода jOOQ
Вы можете использовать генератор кода jOOQ примерно тремя способами:
Автономный: Вам нужно загрузить jOOQ с его веб-сайта.
Maven и jOOQ: Вы генерируете код с помощью плагина jOOQ Maven .
Gradle и jOOQ: Вы генерируете код с помощью плагина jOOQ Gradle .
Процесс генерации для всех трех вариантов всегда одинаков. В то время как в автономном случае вам нужно запускать генерацию вручную, с плагинами Maven и Gradle генерация кода будет происходить автоматически как часть процесса сборки.
В любом случае вам нужен конфигурационный файл для вашего генератора кода jOOQ, который по умолчанию вызывается library.xml . Это выглядит так:
com.mysql.cj.jdbc.Driver jdbc:mysql://localhost:3306/library root .* my.startup c:/dev/myproject/src/main/java
Как вы можете видеть, library.xml конфигурационный файл примерно сводится к следующему:
Ваш URL-адрес базы данных, имя пользователя и пароль.
Например, какие таблицы включать/исключать при создании схемы.
Куда поместить сгенерированные классы.
Пример:
Представьте, что в вашей базе данных есть таблица USERS . Запуск генератора кода с конфигурацией генератора создаст (среди многих других) два класса:
A my.startup. Класс Users , представляющий вашу таблицу базы данных Users . A
my.startup. Пользователи записывают класс, представляющий строку внутри вашей таблицы пользователей.
Давайте посмотрим, как мы можем выполнять SQL-запросы с помощью этих сгенерированных классов:
DSL от jOOQ
jOOQ имеет два класса, DSL и DSLContext (язык, специфичный для домена), которые разработчики должны использовать, чтобы начать писать SQL-запросы. Вы также можете вызвать эти классы DSL SQL Builder classes, поскольку они позволяют вам создавать SQL-запросы.
Поскольку jOOQ – это всего лишь оболочка вокруг JDBC, применяются основы базы данных Java, и для работы jOOQ вам необходимо подключиться к базе данных. Вы либо открываете его сами, либо просите свой пул подключений предоставить вам его.
Давайте посмотрим на пример jOOQ DSL, использующий DriverManager от Java.
import static my.startup.Tables.*; public class Main { public static void main(String[] args) { String userName = "root"; String password = ""; String url = "jdbc:mysql://localhost:3306/myhotstartup"; try (Connection conn = DriverManager.getConnection(url, userName, password)) { DSLContext create = DSL.using(conn, SQLDialect.MYSQL); Resultresult = create.select().from(USERS).fetch(); for (Record r : result) { Integer id = r.getValue(USERS.ID); String username = r.getValue(USERS.USERNAME); String email = r.getValue(USERS.EMAIL); System.out.println("ID: " + id + " + email: " + email ); } } catch (Exception e) { e.printStackTrace(); } } }
Что здесь происходит?
Вы открываете соединение с базой данных с помощью обычного JDBC. Это стандартная Java.
Вы создаете jooq DSLContext, который позволяет выполнять запросы к базе данных.
Вы выполняете простой select * from USERS с помощью jOOQ, а затем перебираете результирующие строки/записи, распечатывая идентификаторы пользователей и электронные письма.
Это оно.
Запросы jOOQ и CRUD
Это краткое руководство не может дать вам исчерпывающего объяснения по каждому возможному запросу jOOQ, поэтому давайте рассмотрим несколько простых, распространенных запросов, чтобы получить общее представление.
Имейте в виду, что запросы jOOQ читаются почти точно так же, как соответствующий SQL-запрос, поэтому без сильных навыков SQL вы столкнетесь с проблемами.
SQL выберите, где
Для выполнения простого выберите * из ПОЛЬЗОВАТЕЛЕЙ, где id =:id вы бы выполнили этот запрос:
UsersRecord record = dslContext.selectFrom(USERS) .where(USERS.ID.eq(id)) .fetchAny(); // do something with record.getEmail()
С помощью всего лишь небольшого изменения вы превратили бы запрос в select * from USERS where id in (:ids) :
ResultuserRecords = dslContext.selectFrom(USERS) .where(USERS.ID.in(ids)) .fetch(); // (for-loop over userRecords)
SQL-соединения
Давайте посмотрим на объединение двух таблиц, например: select * from USERS u inner join PAYMENTS p on.user_id :
Result> result = dslContext.select() .from(USERS.join(PAYMENTS) .on(PAYMENTS.USER_ID.eq(USERS.ID))) .fetch(); // (for-loop over join records)
Обновление и удаление SQL
Наконец, удаляет ( удаляет из ПОЛЬЗОВАТЕЛЕЙ, где ) или обновляет ( обновляет ПОЛЬЗОВАТЕЛЕЙ, устанавливающих email =:email, username =:username, где ) выглядеть так:
dslContext.delete(USERS) .where(USERS.ID.eq(1)) .execute(); dslContext.update(USERS) .set(USERS.USERNAME, "John Rambo") .set(USERS.EMAIL, "john@rambo.com") .where(USERS.ID.eq(1)) .execute();
Резюме
Теперь вы, возможно, понимаете, почему jOOQ называет себя typesafe |/библиотекой базы данных. Это позволяет вам писать Java-код, который выглядит как SQL. С тем преимуществом, что ваш сгенерированный DSL знает, что, например, идентификаторы пользователей должны быть числами, имена пользователей должны быть строками и т.д.
Рекомендуемый: Практикуйте дЖУК
Если вы хотите получить более подробные объяснения по отдельным шагам выше попробуйте этот видеокурс jOOQ//, рекомендованный создателем jOOQ Лукасом Эдером.
Он начинается с самых основ jOOQ, охватывает запросы, записи и dao гораздо более подробно и заканчивается тем, что вам приходится создавать крошечный реальный проект Spring Boot/jOOQ.
Как jOOQ интегрируется с Spring?
Ничто не мешает вам использовать jOOQ в сочетании с Spring. Однако существуют различные уровни интеграции между jOOQ и обширной экосистемой Spring.
@Транзакционная интеграция
В приложениях Spring вы обычно используете аннотацию @Transactional для определения границ транзакций базы данных. Чтобы заставить jOOQ участвовать в этих транзакциях, вам нужно будет выполнить некоторые дополнительные работы по настройке .
Интеграция пружинного ботинка
Spring Boot поставляется с автоматической конфигурацией jOOQ, что означает, что он настраивает DSLContext и интегрирует jOOQ с обработкой транзакций Spring для вас – без необходимости делать что-либо, кроме добавления следующей зависимости в ваш проект Spring Boot.
org.springframework.boot spring-boot-starter-jooq 2.2.2.RELEASE
Который затем позволяет вам сделать это:
import static my.startup.Tables.*; @Service public class UserService { @Autowired private DSLContext content; @Transactional public void registerUser(String email) { UsersRecord existingRecord = dslContext.selectFrom(USERS) .where(USERS.EMAIL.eq(email)) .fetchAny(); if (existingRecord != null) { return false; } // register user etc. } }
Spring Boot автоматически создает для вас DSLContext (в зависимости от источника данных).
jOOQ примет участие в весенней транзакции, обозначенной @Transactional.
Весенние данные
В настоящее время нет собственного проекта Spring Data для jOOQ, такого как Spring Data JDBC или Spring Data JPA . Извините.
Как jOOQ сравнивается с другими фреймворками баз данных Java?
jOOQ против гибернации
Как уже упоминалось в начале этого руководства, оба они совершенно разные. Hibernate использует подход, основанный на Java, в то время как вы (обычно) сначала пишете свои классы и сопоставления Java. Затем вы думаете о своей базе данных (таблицах).
С другой стороны, jOOQ – это прежде всего база данных или SQL, ему нужна существующая схема базы данных для работы и создания своих Java-классов.
Однако ничто не мешает вам использовать обе библиотеки в одном и том же проекте . Краткое введение о том, как это сделать, смотрите в этом превосходном посте от Торбена Janssen .
jOOQ против MyBatis
MyBatis – это язык шаблонов SQL, на котором вы пишете свой SQL в XML-файлах. Для получения дополнительной информации о различиях между ними ознакомьтесь с this stackoverflow thread .
XML-файлы MyBatis выглядят следующим образом:
Который позволяет вам сделать это:
// sqlsessionfactory is a myBatis specific entry point try (SqlSession session = sqlSessionFactory.openSession()) { UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.selectUser(1); }
jOOQ против QueryDSL
Существует определенное совпадение в том, что делают jOOQ и QueryDSL , и QueryDSL также работает с сгенерированными классами. Наш пример, приведенный выше, выглядит следующим образом с помощью QueryDSL:
// 'Q' classes are generated and let you access tables, columns etc QUser user = QUser.user; User john = queryFactory.selectFrom(user) .where(user.id.eq(1)) .fetchOne();
Подводя итог, можно сказать, что в средах на основе JPA (Lucene/Mongodb/JDO) QueryDSL часто является хорошим выбором, в средах на основе SQL jOOQ – лучший выбор.
Обратите внимание, однако, что QueryDSL некоторое время находился в состоянии стагнации и в настоящее время проходит процесс поглощения проекта.
Также взгляните на эту (более старую) статью, в которой сравниваются два: QueryDSL и jOOQ .
Плавник
Это руководство – всего лишь краткий ускоренный курс о том, что jOOQ может сделать для вас и вашего проекта и как он сравнивается с другими вариантами. Для получения дополнительной информации ознакомьтесь с курсом jOOQ или официальной документацией jOOQ .
Если у вас есть какие-либо комментарии или отзывы, просто оставьте комментарий ниже.
Спасибо за чтение.
Там, Откуда Это Взялось, Есть Еще Кое-Что
Эта статья первоначально появилась по адресу Эта статья первоначально появилась по адресу как часть серии руководств по современному программированию на Java. Чтобы найти больше руководств, посетите веб-сайт или подпишитесь на рассылку новостей, чтобы получать уведомления о новых опубликованных руководствах: https://bit.ly/2K0Ao4F
Оригинал: “https://dev.to/marcobehler/jooq-a-short-guide-542e”