Использование Spring Data CrudRepository для доступа к базе данных
В этой части вы перенесете слой сервиса на использование Spring Data CrudRepository вместо JdbcTemplate для доступа к базе данных. CrudRepository — это интерфейс Spring Data для общих операций CRUD над хранилищем определенного типа. Он предоставляет несколько методов "из коробки" для взаимодействия с базой данных.
Обновление вашего приложения
Сначала вам нужно адаптировать класс Message для работы с API CrudRepository:
-
Добавьте аннотацию
@Tableк классуMessage, чтобы объявить отображение на таблицу базы данных.
Добавьте аннотацию@Idперед полемid.import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table @Table("MESSAGES") data class Message(@Id var id: String?, val text: String)Помимо добавления аннотаций, вам также нужно сделать
idизменяемым (var) по причинам, связанным с тем, какCrudRepositoryработает при вставке новых объектов в базу данных. -
Объявите интерфейс для
CrudRepository, который будет работать сMessageклассом данных:import org.springframework.data.repository.CrudRepository interface MessageRepository : CrudRepository<Message, String>
-
Обновите класс
MessageService. Теперь он будет обращаться кMessageRepositoryвместо выполнения SQL-запросов:@Service class MessageService(val db: MessageRepository) { fun findMessages(): List<Message> = db.findAll().toList() fun findMessageById(id: String): List<Message> = db.findById(id).toList() fun save(message: Message) { db.save(message) } fun <T : Any> Optional<out T>.toList(): List<T> = if (isPresent) listOf(get()) else emptyList() }- Расширяющие функции
-
Тип возвращаемого значения функции
findById()в интерфейсеCrudRepository— экземпляр классаOptional. Однако было бы удобно возвращатьListс единственным сообщением для согласованности. Для этого вам нужно распаковать значениеOptional, если оно есть, и вернуть список со значением. Это можно реализовать как расширяющую функцию для типаOptional.В коде
Optional<out T>.toList(),toList()— это расширяющая функция дляOptional. Расширяющие функции позволяют писать дополнительные функции для любых классов, что особенно полезно при расширении функциональности класса какой-либо библиотеки. - Функция save() CrudRepository
-
Эта функция работает с предположением, что у нового объекта нет идентификатора в базе данных. Следовательно, идентификатор должен быть null для вставки.
Если идентификатор не null,
CrudRepositoryпредполагает, что объект уже существует в базе данных, и это операция обновления, а не вставки. После операции вставки идентификаторidбудет сгенерирован хранилищем данных и повторно назначен экземпляруMessage. Вот почему свойствоidдолжно быть объявлено с помощью ключевого словаvar.
-
Обновите определение таблицы сообщений, чтобы генерировать идентификаторы для вставленных объектов. Поскольку
id— строка, вы можете использовать функциюRANDOM_UUID()для генерации значения идентификатора по умолчанию:CREATE TABLE messages ( id VARCHAR(60) DEFAULT RANDOM_UUID() PRIMARY KEY, text VARCHAR NOT NULL );
Запуск приложения
Приложение готово к повторному запуску. Заменив JdbcTemplate на CrudRepository, функциональность не изменилась, поэтому приложение должно работать так же, как и раньше.
Следующий шаг
Получите свою персональную карту языковых выражений, чтобы помочь вам в навигации по функциям Kotlin и отслеживании вашего прогресса в изучении языка. Мы также отправим вам советы по языку и полезные материалы по использованию Kotlin с Spring.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/jvm-spring-boot-using-crudrepository.html