1. Введение
В этом учебнике, мы собираемся взять быстрый тур работает приложение с jOO’ (Ориентированный на объект Java запрос). Эта библиотека генерирует классы Java на основе таблиц баз данных и позволяет нам создавать запросы, безопасные для типов, с помощью свободного API.
Мы охватим всю настройку, подключение к базе данных PostgreS’L и несколько примеров операций CRUD.
2. Мейвен зависимостей
Для библиотеки jOO нам понадобится следующий три зависимости jOO :
org.jooq jooq 3.13.4 org.jooq jooq-meta 3.13.4 org.jooq jooq-codegen 3.13.4
Нам также понадобится одна зависимость для ПостгреСЗЛ водитель :
org.postgresql postgresql 42.2.16
3. Структура базы данных
Прежде чем мы начнем, давайте создадим простую схему DB для наших примеров. Мы будем использовать простую Автор и Статья связь:
create table AUTHOR ( ID integer PRIMARY KEY, FIRST_NAME varchar(255), LAST_NAME varchar(255), AGE integer ); create table ARTICLE ( ID integer PRIMARY KEY, TITLE varchar(255) not null, DESCRIPTION varchar(255), AUTHOR_ID integer CONSTRAINT fk_author_id REFERENCES AUTHOR );
4. Подключение к базе данных
Теперь давайте посмотрим, как мы будем подключения к нашей базе данных .
Во-первых, мы должны предоставить пользователю, пароль, и полный URL в базу данных. Мы будем использовать эти свойства для создания Связь объект с помощью ВодительManager и его getConnection метод:
String userName = "user"; String password = "pass"; String url = "jdbc:postgresql://db_host:5432/baeldung"; Connection conn = DriverManager.getConnection(url, userName, password);
Далее нам нужно создать экземпляр DSLContext . Этот объект будет нашей точкой входа для интерфейсов jOO:
DSLContext context = DSL.using(conn, SQLDialect.POSTGRES);
В нашем случае, мы проходят мимо ПОСТГРЕС диалект, но Есть несколько других доступных, как H2, MyS’L, S’Lite, и многое другое.
5. Поколение кода
Для создания классов Java для наших таблиц баз данных нам потребуется следующее jooq-config.xml файл:
org.postgresql.Driver jdbc:postgresql://db_url:5432/baeldung_database username password org.jooq.codegen.JavaGenerator org.jooq.meta.postgres.PostgresDatabase public .* com.baeldung.jooq.model C:/projects/baeldung/tutorials/jooq-examples/src/main/java
Пользовательская конфигурация требует изменений в
Для выполнения инструмента генерации кода jOO нам необходимо выполнить следующий код:
GenerationTool.generate( Files.readString( Path.of("jooq-config.xml") ) );
После завершения генерации мы получим два следующих класса, каждый из которых соответствует таблице баз данных:
com.baeldung.model.generated.tables.Article; com.baeldung.model.generated.tables.Author;
6. ОПЕРАЦИИ CRUD
Теперь давайте рассмотрим несколько основных операций CRUD, которые мы можем выполнить с библиотекой jOO.
6.1. Создание
Во-первых, давайте создадим новую Статья запись. Для этого нам необходимо ссылаться на newРекорд метод с надлежащей ссылкой таблицы в качестве параметра:
ArticleRecord article = context.newRecord(Article.ARTICLE);
Статья.ARTICLE переменная является справочным экземпляром к СТАТЬЯ таблицы баз данных. Он был автоматически создан jOO во время генерации кода.
Далее мы можем установить значения для всех необходимых свойств:
article.setId(2); article.setTitle("jOOQ examples"); article.setDescription("A few examples of jOOQ CRUD operations"); article.setAuthorId(1);
Наконец, мы должны ссылаться на магазин метод записи, чтобы сохранить его в базе данных:
article.store();
6.2. Чтение
Теперь давайте посмотрим, как мы можем читать значения из базы данных. В качестве примера выберите всех авторов:
Resultauthors = context.select() .from(Author.AUTHOR) .fetch();
Вот, мы используем выбрать метод в сочетании с из положение, указывая, из какой таблицы мы хотим прочитать. Ссылаясь на принести метод выполняет запрос S’L и возвращает полученный результат.
Результат объект реализует Итерируемые интерфейс, так что легко итерировать над каждым элементом. И имея доступ к одной записи, мы можем получить ее параметры с помощью getValue метод с надлежащей ссылкой на поле:
authors.forEach(author -> { Integer id = author.getValue(Author.AUTHOR.ID); String firstName = author.getValue(Author.AUTHOR.FIRST_NAME); String lastName = author.getValue(Author.AUTHOR.LAST_NAME); Integer age = author.getValue(Author.AUTHOR.AGE); System.out.printf("Author %s %s has id: %d and age: %d%n", firstName, lastName, id, age); });
Мы можем ограничить выбранный запрос набором конкретных полей. Давайте принесем только статьи идентификаторы и названия:
Result> articles = context.select(Article.ARTICLE.ID, Article.ARTICLE.TITLE) .from(Author.AUTHOR) .fetch();
Мы также можем выбрать один объект с fetchOne метод. Параметры для этого являются ссылкой на таблицу и условием, чтобы соответствовать надлежащей записи.
В нашем случае, давайте просто выбрать Автор с идентификатором, равным 1:
AuthorRecord author = context.fetchOne(Author.AUTHOR, Author.AUTHOR.ID.eq(1))
Если нет записи соответствует условию, fetchOne метод вернет нулевой .
6.3. Обновление
Чтобы обновить данный отчет, мы можем использовать обновление метод из DSLContext объект в сочетании с установить вызовы метода для каждой области, которую мы должны изменить. За этими заявлениями должен последовать где положение с надлежащим условием матча:
context.update(Author.AUTHOR) .set(Author.AUTHOR.FIRST_NAME, "David") .set(Author.AUTHOR.LAST_NAME, "Brown") .where(Author.AUTHOR.ID.eq(1)) .execute();
Запрос обновления будет работать только после того, как мы позвоним выполнить метод. В качестве возврата мы получим интегратор, равный количеству обновленных записей.
Кроме того, можно обновить уже принес запись, выполняя свои магазин метод:
ArticleRecord article = context.fetchOne(Article.ARTICLE, Article.ARTICLE.ID.eq(1)); article.setTitle("A New Article Title"); article.store();
магазин метод вернет 1 если операция прошла успешно или 0 если обновление не было необходимым. Например, ничто не соответствовало условию.
6.4. Удаление
Чтобы удалить данный отчет, мы можем использовать удалить метод из DSLContext объект. Условие удаления должно быть передано в качестве параметра в следующем где статья:
context.delete(Article.ARTICLE) .where(Article.ARTICLE.ID.eq(1)) .execute();
Запрос на удаление будет запущен только после того, как мы позвоним выполнить метод. В качестве возврата мы получим интегратор, равный количеству удаленных записей.
Кроме того, можно удалить уже принес запись, выполняя свои удалить метод:
ArticleRecord articleRecord = context.fetchOne(Article.ARTICLE, Article.ARTICLE.ID.eq(1)); articleRecord.delete();
удалить метод вернет 1 если операция прошла успешно или 0 если удаление не является необходимым. Например, когда ничего не соответствовало условию.
7. Заключение
В этой статье мы научились настраивать и создавать простое приложение CRUD с помощью фреймворка jOO. Как обычно, весь исходный код доступен более чем на GitHub.