Статьи

Использование jOOQ с Spring: генерация кода

Как мы помним из первой части этого урока , jOOQ утверждает, что

jOOQ генерирует код Java из вашей базы данных и позволяет вам создавать безопасные для SQL запросы с помощью своего свободного API.

Первая часть этого руководства описывает, как мы можем сконфигурировать контекст приложения на платформе Spring, использующей jOOQ, но не описывает, как мы можем создавать безопасные для SQL запросы с помощью jOOQ.

Этот пост в блоге приближает нас к решению. Если мы хотим создавать безопасные для базы данных запросы с помощью jOOQ, нам необходимо выполнить реинжиниринг нашей базы данных и создать классы, которые представляют разные таблицы, записи и т. Д. Эти классы являются строительными блоками безопасных типов запросов SQL.

К счастью, jOOQ предоставляет простой способ автоматизации этого процесса . Этот пост описывает, как мы можем создавать необходимые классы с помощью Maven.

Давайте начнем.

Дополнительное чтение:

  • Создание файлов конфигурации для конкретного профиля с помощью Maven объясняет, как вы можете создавать различные конфигурации для разных сред с помощью профилей сборки Maven. Пример приложения этого блога настраивается с использованием подхода, описанного в этом посте.
  • Использование jOOQ с Spring: Configuration является первой частью этого учебного руководства и описывает, что вы можете настроить контекст приложения Spring, которое использует jOOQ. Вы понимаете этот пост в блоге, не читая первую часть этого руководства, но если вы действительно хотите использовать jOOQ в приложении на базе Spring, я рекомендую вам прочитать этот пост.

Генерация кода с Maven

Наш процесс сборки разделен на три важных этапа, которые описаны ниже:

  1. Прочитайте конфигурацию базы данных из файла конфигурации конкретного профиля . Мы хотим использовать один и тот же файл конфигурации для нашего приложения и нашего сценария сборки, поскольку это помогает нам избежать дублирования. Нам нужны детали подключения к базе данных, когда мы обновляем схему базы данных и генерируем код из нашей базы данных.
  2. Обновите схему базы данных, если это необходимо . Поскольку мы хотим генерировать код из нашей базы данных, мы должны убедиться, что его схема обновлена ​​до начала генерации кода.
  3. Генерация кода из базы данных . На этом этапе считываются метаданные из настроенной базы данных и создаются классы, которые используются для написания безопасных типов запросов к базе данных с помощью jOOQ.

Давайте продолжим и узнаем, как мы можем настроить эти фазы в нашем файле pom.xml .

Чтение свойств из файла свойств профиля

Мы можем прочитать свойства из файла свойств профиля, используя плагин Properties Maven . Этот плагин читает содержимое файла свойств и гарантирует, что мы можем использовать его свойства в нашем файле pom.xml .

Мы можем настроить этот плагин, выполнив следующие действия:

  1. Добавьте объявление плагина в раздел плагинов файла pom.xml .
  2. Создайте выполнение, которое запускает цель read-project-properties на этапе инициализации жизненного цикла Maven.
  3. Убедитесь, что свойства считываются из файла конфигурации профиля (profile / $ {build.profile.id} /config.properties ).

Конфигурация плагина Properties Maven выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>properties-maven-plugin</artifactId>
    <version>1.0-alpha-2</version>
    <executions>
        <execution>
            <phase>initialize</phase>
            <goals>
                <goal>read-project-properties</goal>
            </goals>
            <configuration>
                <files>
                    <file>profiles/${build.profile.id}/config.properties</file>
                </files>
            </configuration>
        </execution>
    </executions>
</plugin>

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

Обновление схемы базы данных

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

В реальных приложениях вы, вероятно, захотите использовать для этой цели либо Flyway, либо Liquibase .

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

Сначала мы должны создать файл SQL, который создает схему базы данных. Этот сценарий SQL создаст таблицу задач, если она не найдена в базе данных.

Файл schema.sql выглядит следующим образом:

1
2
3
4
5
6
7
CREATE TABLE IF NOT EXISTS todos (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  creation_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  description VARCHAR(500),
  modification_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title VARCHAR(100)
);

Во-вторых , мы должны добавить свойство skip.db.creation в раздел свойств файла pom.xml . Это свойство используется для включения и отключения обновления схемы. Поскольку мы хотим включить обновление схемы базы данных во всех профилях, мы должны установить значение этого свойства в false .

Соответствующая часть нашего файла POM выглядит следующим образом:

1
2
3
<properties>
    <skip.db.creation>false</skip.db.creation>
</properties>

В-третьих , мы должны настроить плагин SQL Maven. Мы можем сделать это, выполнив следующие действия:

  1. Добавьте объявление плагина в раздел плагинов файла pom.xml .
  2. Убедитесь, что создание схемы пропущено, если значение свойства skip.db.creation равно true .
  3. Создайте выполнение, которое запускает цель выполнения на этапе жизненного цикла Maven генерируемых источников .
  4. Настройте созданное выполнение, выполнив следующие действия:
    1. Настройте драйвер JDBC, URL базы данных, имя пользователя и пароль.
    2. Убедитесь, что изменения зафиксированы автоматически.
    3. Настройте местоположение сценария SQL, который создает схему нашей базы данных.
  5. Добавьте базу данных H2 как зависимость этого плагина.

Конфигурация плагина SQL Maven выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<plugin>
<groupId>org.codehaus.mojo</groupId>
    <artifactId>sql-maven-plugin</artifactId>
    <version>1.5</version>
 
    <configuration>
        <skip>${skip.db.creation}</skip>
    </configuration>
 
    <executions>
        <execution>
            <id>create-database-h2</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>execute</goal>
            </goals>
            <configuration>
                <driver>${db.driver}</driver>
                <url>${db.url}</url>
                <username>${db.username}</username>
                <password>${db.password}</password>
 
                <autocommit>true</autocommit>
                <srcFiles>
                    <srcFile>src/main/resources/schema.sql</srcFile>
                </srcFiles>
            </configuration>
        </execution>
    </executions>
 
    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.174</version>
        </dependency>
    </dependencies>
</plugin>

Давайте продолжим и узнаем, как мы можем настроить плагин jOOQ-codegen Maven.

Генерация кода из базы данных

Наша последняя задача — настроить плагин jOOQ-codegen Maven. Давайте выясним, как это делается.

Во-первых , нам нужно добавить свойство jooq.generator.db.dialect в раздел раздела свойств файла pom.xml . Это свойство указывает правильный диалект базы данных и используется для настройки плагина jOOQ-codegen Maven. Поскольку наше примерное приложение использует базу данных H2, мы должны установить значение этого свойства в org.jooq.util.h2.H2Database .

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

Соответствующая часть нашего файла POM выглядит следующим образом:

1
2
3
<properties>
    <jooq.generator.db.dialect>org.jooq.util.h2.H2Database</jooq.generator.db.dialect>
</properties>

Во-вторых , нам нужно настроить плагин jOOQ-codegen Maven. Мы можем сделать это, выполнив следующие действия:

  1. Добавьте объявление плагина в раздел плагинов файла pom.xml .
  2. Создайте выполнение, которое запускает цель создания подключаемого модуля Maven jOOQ-codegen на этапе жизненного цикла генератора -источника .
  3. Настройте плагин, выполнив следующие действия:
    1. Настройте соединение JDBC и задайте имя класса драйвера, URL базы данных, имя пользователя и пароль. Помните, что фактические значения свойств считываются из файла конфигурации конкретного профиля.
    2. Настройте базу данных, которая используется в качестве источника, выполнив следующие действия:
      1. Убедитесь, что используемый диалект базы данных читается из свойства jooq.generator.db.dialect .
      2. Сконфигурируйте генерацию кода, чтобы включить все таблицы, найденные из схемы PUBLIC .
    3. Настройте генерацию кода для генерации классов для таблиц и записей базы данных .
    4. Настройте целевой пакет и каталог. Эти параметры конфигурации описаны ниже:
      • Целевой пакет указывает пакет, который является корневым пакетом созданных классов.
      • Целевой каталог указывает каталог, в котором создаются классы.
  4. Добавьте базу данных H2 как зависимость этого плагина.

Конфигурация плагина jOOQ-codegen Maven выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<plugin>
    <groupId>org.jooq</groupId>
    <artifactId>jooq-codegen-maven</artifactId>
    <version>3.2.2</version>
 
    <executions>
        <execution>
            <id>generate-h2</id>
            <phase>generate-sources</phase>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
 
    <dependencies>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>${h2.version}</version>
        </dependency>
    </dependencies>
 
    <configuration>
        <jdbc>
            <driver>${db.driver}</driver>
            <url>${db.url}</url>
            <user>${db.username}</user>
            <password>${db.password}</password>
        </jdbc>
 
        <generator>
            <database>
                <name>${jooq.generator.db.dialect}</name>
                <includes>.*</includes>
                <excludes></excludes>
                <inputSchema>PUBLIC</inputSchema>
            </database>
            <generate>
                <records>true</records>
            </generate>
            <target>
                <packageName>net.petrikainulainen.spring.jooq.todo.db</packageName>
                <directory>target/generated-sources/jooq</directory>
            </target>
        </generator>
    </configuration>
</plugin>

Вы можете получить больше информации о генерации кода из справочного руководства jOOQ:

Давайте выясним, что происходит при запуске генерации кода.

Что генерируется?

Когда вызывается цель создания плагина jOOQ-codegen Maven, он анализирует схему базы данных и генерирует классы для настроенного целевого каталога и пакета. В нашей ситуации это означает, что:

  • Код сгенерирован в каталог target / generate-sources / jooq .
  • Корневым пакетом сгенерированных классов является net.petrikainulainen.spring.jooq.todo.db .

Конфигурация, которую мы создали во время этого сообщения в блоге, обеспечивает создание следующих классов:

  • Классы, созданные в пакете net.petrikainulainen.spring.jooq.todo.db , содержат метаданные базы данных. jOOQ называет эти классы «глобальными» артефактами .
  • Класс net.petrikainulainen.spring.jooq.todo.db.tables.Todos является классом таблицы, который описывает структуру одной таблицы базы данных. Мы можем использовать этот класс для записи запросов базы данных к данным, хранящимся в таблице базы данных todos .
  • Класс net.petrikainulainen.spring.jooq.todo.db.tables.recods.TodoRecord является классом записей, который содержит информацию об одной строке таблицы. Запросы к базе данных, которые извлекают данные из таблицы базы данных todos, возвращают объекты TodoRecord (если мы решим это сделать).

Резюме

Теперь мы успешно сконфигурировали плагин jOOQ-codegen Maven для генерации кода из нашей базы данных. Этот урок научил нас двум вещам:

  • Мы узнали, как настроить плагин jOOQ-codegen Maven для генерации кода из базы данных.
  • Мы узнали, какие классы создаются при запуске генерации кода.

Следующая часть этого руководства описывает, как мы можем добавить функции CRUD в простое веб-приложение, используя классы, сгенерированные jOOQ.

  • Пример приложения этого блога доступен на Github .