Статьи
YouTube-канал

Статьи с тэгом «Kotlin»

Написание запросов в Spring Data JPA

4 ноября 2020

Тэги: SQL, Collections, Spring Boot, Spring Data, Spring, Kotlin, Hibernate, PostgreSQL.

В статье CrudRepository на Kotlin я рассказывал о том, как Spring Data позволяет быстро создавать слой взаимодействия с БД, поддерживающий все основные операции: создание, чтение, обновление и удаление. Для получения этой стандартной функциональности вам достаточно лишь определить класс-сущность, поля которой такие же как и в целевой таблице в БД, и интерфейс самого репозитория, который можно унаследовать от стандартного интерфейса CrudRepository. Реализовывать интерфейс при этом не нужно - Spring Data всё сделает за вас.

Помимо стандартных методов вы также можете добавить в этот интерфейс свои собственные. Причём если вы будете следовать соглашениям об именовании методов, то Spring Data будет автоматически генерировать по ним sql-запросы. То есть вы определяете запросы к БД в декларативном стиле. Это, во-первых, позволяет давать методам удобочитаемые имена, а во-вторых, позволяет абстрагироваться от конкретной СУБД и специфики написания запросов к ней.

Читать полностью...

CrudRepository на Kotlin

29 октября 2020

Тэги: Spring Boot, Spring Data, SQL, PostgreSQL, Kotlin, rest, gradle, Spring.

Ранее я уже писал статью CrudRepository в Spring Data, в которой рассматривался пример rest-сервиса, работающего с базой данных. Теперь хочу показать аналогичный пример, но вместо Java написать его на Kotlin, который стремительно набирает популярность. Rest-сервис состоит из трёх слоёв: слой работы с БД, сервисный слой и контроллер. Мы пойдём последовательно по слоям, начиная с нижнего.

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

create table band
(
  id serial,
  name character varying(50) not null,
  players_count integer not null,
  created date not null,
  constraint band_pk primary key (id)
);

Тип данных serial означает поле, значение которого автоматически увеличивается на 1 с каждой новой записью.

Заготовку проекта удобно сгенерить через Spring Initializr. Там достаточно выбрать тип проекта - gradle, язык - kotlin. В качестве dependency надо добавить Spring Web (функциональность rest-контроллеров), Spring Data JPA (работа с БД), Validation (валидация входящих rest-запросов) и PostgreSQL Driver (драйвер нашей СУБД). Затем нажимаем Generate - и вы уже скачали архив с заготовкой вашего проекта. В итоге файл build.gradle.kts в секции dependencies помимо стандартных должен также содержать следующие зависимости:

Читать полностью...

Spring Data Rest с примерами на kotlin

25 октября 2020

Тэги: Hibernate, Spring, Spring Boot, rest, SQL, PostgreSQL, gradle, Spring Data, Kotlin, json, yaml.

Ранее я уже приводил пример в статье CrudRepository на Kotlin, как Spring Data позволяет легко выполнять основные операции над сущностями в БД. Теперь пойдём ещё дальше и рассмотрим как Spring Data Rest позволяет избежать написания контроллеров и сервисной логики. Исходники тестового проекта также прилагаются к этой статье и доступны на github. Также доступен видеогайд.

Подключаем Spring Data Rest

Для начала создадим заготовку проекта. Проще всего это сделать с помощью Spring Initializr. В настройках выбираем в качестве языка Kotlin и в качестве сборщика Gradle. В dependency нам нужно последовательно добавить три зависимости: Spring Data JPA, Rest Repositories и PostgreSQL Driver. В итоге файл build.gradle.kts должен содержать, помимо стандартных, следующие зависимости:

Читать полностью...

Подключение Swagger к Spring Boot

3 октября 2020

Тэги: Spring Boot, Spring, gradle, Kotlin, YouTube.

Swagger - это библиотека, которая при подключении к вашему проекту раз и навсегда решает вопрос актуальности технической документации. Swagger автоматически сканирует все эндпоинты вашего проекта, доступные снаружи, и отображает подробную информацию о них в веб-интерфейсе. Как только вы меняете существующие эндпоинты или добавляете новые - swagger тут же начинает отображать эти изменения. Кроме справочной информации, swagger также позволяет отправлять запросы в тестовых целях прямо через веб-интерфейс.

Внимание! Для последних версий Spring Boot данная статья уже не актуальна. См. статью Springdoc для документации REST API.

Помимо данной статьи вы можете также посмотреть видеогайд на эту тему.

Подключение

Если ваше приложение основано на Spring Boot, для подключения swagger достаточно добавить всего лишь одну зависимость (пример для gradle):

Читать полностью...

Преобразование массива байт в hex-строку

1 октября 2020

Тэги: Kotlin.

В процессе разработки часто бывает необходимо отобразить «сырой» массив данных, состоящий из массива байт, в виде читаемой строки. При этом далеко не все возможные значения байта (которых всего 256) отображаются в виде читаемых символов. Общепринятным подходом является отображение значения байта в шестандцатеричном формате (hexadecimal или hex).

В данном формате значения от 0 до 9 отображаются как есть, затем 10 заменяется на первую букву английского алфавита A, 11 преобразуется в B и т.д. И так до значения 15, т.е. до F. Затем значение 16 в шестнадцатеричном формате отображается в виде 10 (переполнился первый разряд, который стал нулём и мы заняли второй разряд). И далее 17 становится 11, 18 преобразуется в 12 и т.д. Максимальное значение байта 255 отображается как FF.

В Java (а, значит, и в Kotlin) наиболее простой способ отображения числа в шестнадцатеричном виде - это использование специального шаблона в методе String.format(). Рассмотрим код на kotlin:

Читать полностью...

Как получить последний день месяца

30 сентября 2020

Тэги: Java, Java 8, Kotlin, алгоритмы.

При работе с датами часто бывает нужно получить последний день текущего месяца или года. Поскольку последний день года всегда равен 31 декабря, то мы можем напрямую создать эту дату с помощью метода LocalDate.of(). А вот последний день месяца зависит от конкретного месяца. Дней в месяце может быть 30 или 31, а для февраля и вовсе 28 или 29.

Чтобы не разбираться в логике работы календаря, начиная с Java 8 (а, значит, и в Kotlin) нам доступен специальный класс TemporalAdjusters. Он имеет несколько полезных методов, но в данном случае нас интересует lastDayOfMonth(), возвращающий специальный объект с интерфейсом TemporalAdjuster. Этот интерфейс содержит метод adjustInto(), который позволяет «выравнивать» любую переданную ему дату (или дату со временем) по определённому правилу. В нашем случае дата будет выровнена по последнему дню месяца.

Читать полностью...

Чтение ресурсных файлов

1 марта 2020

Тэги: Kotlin, gradle, maven, Java 11, файлы.

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

Например, нам нужно прочитать файл test.txt. Положим его в папку resources вашего проекта (она есть и в maven, и в gradle). Важно положить именно в ту resources, которая относится к самому приложению, а не к тестам, иначе вы не сможете обратиться к файлу.

public class ResourceReader {

    public static void main(String[] args) throws Exception {
        var example = new ResourceReader();
        var content = example.readTextResource("test.txt");
        System.out.println(content);
    }

    public String readTextResource(String filename) throws Exception {
        var uri = getClass().getResource(String.format("/%s", filename)).toURI();
        return Files.readString(Paths.get(uri));
    }
}

Доступ к ресурсам мы получаем через метод getResource(), который имеется у объекта Class. Но доступ к классу из статичного контекста метода main() получить нельзя, поэтому мы сначала создаём экземпляр класса, а затем внутри него уже обращаемся к ресурсу. Обратите внимание, что имя ресурса начинается со слеша. Путь до ресурса указывается от корня папки resources. Для чтения содержимого файла целиком в строку используем метод Files.readString(), появившийся в Java 11. Если у вас более ранняя версия Java, то данный метод будет недоступен. В случае, если файл будет очень большим, также лучше данный метод не использовать, а читать файл с помощью буферизованного потока.

Читать полностью...

❮ Назад