Рубрики
Без рубрики

jOOQ – краткое руководство

Вы можете использовать это руководство, чтобы понять, что такое jOOQ, как быстро начать работу с ним и как использовать jOOQ… С тегами java, sql, jooq, database.

Вы можете использовать это руководство, чтобы понять, что такое jOOQ, как быстро начать работу с ним и как jOOQ интегрируется с такими библиотеками, как Spring и Hibernate, или сравнивается с ними.

Что такое jOOQ?

jOOQ – это популярная библиотека баз данных Java, которая позволяет писать типобезопасные SQL-запросы на Java. Как это работает?

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

  2. Вместо того, чтобы писать строковые операторы SQL с помощью простого JDBC , вы будете использовать эти сгенерированные классы Java для написания ваших SQL-запросов.

  3. jOOQ удобно преобразует эти классы Java и запросы в реальный SQL, выполняет их в базе данных и сопоставляет результаты обратно с кодом Java.

Это, конечно, всего лишь обзор очень высокого уровня. Если вы хотите узнать более подробно, как работает jOOQ: Читайте дальше.

jOOQ: Ускоренный курс

Сначала: Ваша База Данных, Затем: Ваши классы Java

По сравнению с другими популярными библиотеками, такими как Hibernate , jOOQ использует подход, ориентированный на базу данных или SQL-ориентированный подход.

С помощью Hibernate вы обычно сначала начинаете писать свои классы Java, а затем позволяете Hibernate или такому инструменту, как Liquibase или Flyway, генерировать соответствующие таблицы базы данных.

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

Использование генератора кода jOOQ

Вы можете использовать генератор кода jOOQ примерно тремя способами:

  1. Автономный: Вам нужно загрузить jOOQ с его веб-сайта.

  2. Maven и jOOQ: Вы генерируете код с помощью плагина jOOQ Maven .

  3. 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);  

                 Result result = 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) :

    Result userRecords  = 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”