Тэги: Collections, Spring Data, Spring Boot, rest, Kotlin, YouTube, руководство, SQL.
В предыдущей статье Spring Data JPA, REST и Kotlin: "один-ко-многим", изменение данных мы научились изменять дочерние сущности городов при изменении родительской сущности страны. А сейчас давайте научимся выбирать из таблицы только те поля, которые нам реально нужны, а не всю сущность целиком. В Spring Data JPA есть такое понятие как проекции. Рассмотрим конкретный пример.
Давайте сделаем новый эндпоинт, который будет возвращать список названий всех стран, отсортированный по алфавиту. Кроме названий, других полей выводить не требуется. Опираясь на уже имеющиеся у нас знания из предыдущих статей, добавим в CountryRepository такой метод:
Тэги: SQL, json, Spring, Hibernate, Collections, rest.
Spring Framework – это один из самых популярных Java-фреймворков, который предоставляет набор инструментов и возможностей для разработки веб-приложений. Одним из таких инструментов является интерфейс RowMapper, который используется при чтении данных из БД в объекты Java.
В Spring Framework существует несколько стандартных реализаций интерфейса RowMapper, каждый из которых предоставляет свой набор функциональности и возможностей. Рассмотрим каждый из них подробнее на конкретном примере.
Тэги: Collections, Spring Boot, YouTube, PostgreSQL, руководство, Spring Data, Kotlin, SQL, rest.
В предыдущей статье Spring Data JPA, REST и Kotlin: обработка ошибок мы научились менять формат ответа при возникновении ошибки. А сегодня добавим в базу данных отношение «один-ко-многим». У нас уже имеется таблица country, которая содержит страны.
Давайте создадим новую таблицу city, которая будет содержать города. И добавим между этими таблицами связь через поле country_id в таблице city. То есть несколько разных городов могут ссылаться на одну и ту же страну. Это и есть отношение «один-ко-многим».
Тэги: SQL, Spring Boot, руководство, YouTube, PostgreSQL, Kotlin, rest, Spring Data, json.
В предыдущей статье Spring Data JPA, REST и Kotlin: поиск записей мы научились искать записи по id и по части названия страны. Теперь рассмотрим, как реализовать создание записи, её обновление и удаление. Нам потребуется добавить в наше REST API три новых метода.
Методы создания и обновления будут принимать на вход ранее созданную нами DTO (data transfer object), в которой будут указаны все параметры страны. Однако при создании id страны нам неизвестно, поэтому нужно модифицировать DTO так, чтобы оно допускало null в качестве id:
Тэги: Spring Boot, PostgreSQL, Spring Data, Hibernate, yaml, YouTube, SQL, Kotlin, gradle, rest, руководство.
В предыдущей статье Spring Data JPA, REST и Kotlin: заготовка проекта мы сделали заготовку проекта и научились отдавать статический список стран. А сейчас разберёмся с подключением к базе.
Теперь пришла пора подключиться к базе данных и научиться считывать данные из неё. Сначала создадим таблицу country и наполним её данными:
Тэги: SQL, Spring, Kotlin, PostgreSQL, Spring Boot, YouTube.
Давайте рассмотрим, как обеспечить пакетную вставку (batch insert) большого количества данных с помощью Spring JDBC API. Допустим, нам нужно вставить 100 000 строк в таблицу в postgres. В качестве драйвера для работы с БД используем стандартный org.postgresql:postgresql.
Мы рассмотрим несколько вариантов, начиная с самого простого и заканчивая самым быстрым, постепенно улучшая нашу реализацию. Если вам нужен финальный вариант, листайте сразу к последнему.
Данный материал доступен также в формате видео на YouTube.
Допустим у нас есть такая таблица для хранения истории каких-то заказов:
Тэги: SQL, PostgreSQL, Spring Boot, gradle, Kotlin, yaml.
Liquibase позволяет автоматизировать внесение обновлений в структуру БД. Каждое изменение описывается в декларативном стиле и версионируется. Обновления накатываются в заранее определённом порядке на данную БД, если они ещё не накатывались. Автоматизация процесса наката изменений на базу данных особенно важна, если у вас несколько различных экземпляров приложений и для каждого из них требуется поддерживать свою БД.
Данный материал также доступен в формате видео на YouTube.
Рассмотрим работу с Liquibase на конкретном примере. С помощью Spring Initializr создадим заготовку нашего Spring Boot приложения (выбираем в качестве языка kotlin, а в качестве сборщика – gradle). В dependencies выберем компоненты Spring Web (функциональность rest-контроллеров), Spring Data JDBC (работа с БД), PostgreSQL Driver (драйвер нашей СУБД) и сам Liquibase Migration. В итоге файл build.gradle.kts в секции dependencies должен содержать следующие зависимости:
Тэги: PostgreSQL, SQL, YouTube.
Когда различные иерархии находятся в пределах одной таблицы, может потребоваться пройтись по одной из веток этой иерархии, начиная с самого нижнего элемента и заканчивая корневым. Примером иерархических данных может служить структура каталогов на файловой системе, оргструктура в компании или справочник географических объектов (города-страны-континенты).
PostgreSQL предоставляет специальный синтаксис with recursive для написания рекурсивных запросов. Эти запросы позволяют легко выбирать иерархические данные.
Данный гайд также доступен в формате видео на YouTube.
Рассмотрим конкретную таблицу:
Тэги: Spring Boot, rest, SQL, PostgreSQL, Java.
Spring Boot предоставляет два интерфейса для обработки выборки из БД: RowMapper и ResultSetExtractor. Давайте разберём их назначение, а также выясним, чем они различаются на примере справочника городов и стран.
Чаще всего при работе со списками в restful-сервисах, построенных на Spring Boot, вы будете использовать RowMapper. Этот класс обрабатывает отдельно каждую запись, полученную из БД, и возвращает уже готовый объект – модель данных. В большинстве случаев его вполне хватает.
Создадим простенький rest-контроллер, который будет возвращать список всех стран. Эти страны будем хранить в БД. Определение таблицы в СУБД postgres выглядит следующим образом:
Здесь тип serial представляет собой обычный integer, который автоматически увеличивается на 1 при добавлении каждой новой записи. То есть нет нужды при вставке явно указывать id.
Добавим туда несколько стран для примера:
Тэги: SQL, Collections, Spring Boot, Spring Data, Kotlin, Hibernate, PostgreSQL.
В статье CrudRepository на Kotlin я рассказывал о том, как Spring Data позволяет быстро создавать слой взаимодействия с БД, поддерживающий все основные операции: создание, чтение, обновление и удаление. Для получения этой стандартной функциональности вам достаточно лишь определить класс-сущность, поля которой такие же как и в целевой таблице в БД, и интерфейс самого репозитория, который можно унаследовать от стандартного интерфейса CrudRepository. Реализовывать интерфейс при этом не нужно – Spring Data всё сделает за вас.
Помимо стандартных методов вы также можете добавить в этот интерфейс свои собственные. Причём если вы будете следовать соглашениям об именовании методов, то Spring Data будет автоматически генерировать по ним sql-запросы. То есть вы определяете запросы к БД в декларативном стиле. Это, во-первых, позволяет давать методам удобочитаемые имена, а во-вторых, позволяет абстрагироваться от конкретной СУБД и специфики написания запросов к ней.
Kotlin, Java, Spring, Spring Boot, Spring Data, Spring AI, SQL, PostgreSQL, Oracle, H2, Linux, Hibernate, Collections, Stream API, многопоточность, чат-боты, нейросети, файлы, devops, Docker, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.