Spec-Zone.ru › Kotlin 2

Использование Spring Data CrudRepository для доступа к базе данных

В этой части вы перенесёте уровень сервисов на использование Spring Data CrudRepository вместо JdbcTemplate для доступа к базе данных. CrudRepository — это интерфейс Spring Data для выполнения стандартных операций CRUD с репозиторием определённого типа. Он предоставляет несколько готовых методов для взаимодействия с базой данных.

Обновление приложения

Сначала нужно изменить класс Message для работы с API CrudRepository:

  1. Добавьте аннотацию @Table к классу Message, чтобы указать соответствие таблице базы данных.
    Добавьте аннотацию @Id перед полем id.

    Для этих аннотаций также потребуются дополнительные импорты.

    // Message.kt
    package com.example.demo
    
    import org.springframework.data.annotation.Id
    import org.springframework.data.relational.core.mapping.Table
    
    @Table("MESSAGES")
    data class Message(@Id val id: String?, val text: String)
    

    Кроме того, чтобы использовать класс Message более идиоматично, можно задать для свойства id значение по умолчанию null и изменить порядок свойств класса данных:

    @Table("MESSAGES")
    data class Message(val text: String, @Id val id: String? = null)
    

    Теперь, если нужно создать новый экземпляр класса Message, можно указать в качестве параметра только свойство text:

    val message = Message("Hello") // id is null
    
  2. Объявите интерфейс для CrudRepository, который будет работать с классом данных Message. Создайте файл MessageRepository.kt и добавьте в него следующий код:

    // MessageRepository.kt
    package com.example.demo
    
    import org.springframework.data.repository.CrudRepository
    
    interface MessageRepository : CrudRepository<Message, String>
    
  3. Обновите класс MessageService. Теперь он будет использовать MessageRepository вместо выполнения SQL-запросов:

    // MessageService.kt
    package com.example.demo
    
    import org.springframework.data.repository.findByIdOrNull
    import org.springframework.stereotype.Service
    
    @Service
    class MessageService(private val db: MessageRepository) {
        fun findMessages(): List<Message> = db.findAll().toList()
    
        fun findMessageById(id: String): Message? = db.findByIdOrNull(id)
    
        fun save(message: Message): Message = db.save(message)
    }
    
    Функции расширения

    Функция findByIdOrNull() — это функция расширения для интерфейса CrudRepository в Spring Data JDBC.

    Функция CrudRepository save()

    Эта функция работает исходя из предположения, что у нового объекта нет идентификатора в базе данных. Поэтому при вставке идентификатор должен быть равен null.

    Если идентификатор не равен null, CrudRepository предполагает, что объект уже существует в базе данных и выполняется операция обновления, а не операция вставки. После выполнения операции вставки хранилище данных сгенерирует id и присвоит его экземпляру Message.

  4. Обновите определение таблицы messages, чтобы идентификаторы вставляемых объектов генерировались автоматически. Поскольку id — это строка, для генерации значения идентификатора по умолчанию можно использовать функцию RANDOM_UUID():

    -- schema.sql 
    CREATE TABLE IF NOT EXISTS messages (
        id      VARCHAR(60)  DEFAULT RANDOM_UUID() PRIMARY KEY,
        text    VARCHAR      NOT NULL
    );
    
  5. Измените имя базы данных в файле application.properties, расположенном в папке src/main/resources:

    spring.application.name=demo
    spring.datasource.driver-class-name=org.h2.Driver
    spring.datasource.url=jdbc:h2:file:./data/testdb2
    spring.datasource.username=name
    spring.datasource.password=password
    spring.sql.init.schema-locations=classpath:schema.sql
    spring.sql.init.mode=always
    

Полный код приложения:

// DemoApplication.kt package com.example.demo import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication @SpringBootApplication class DemoApplication fun main(args: Array<String>) { runApplication<DemoApplication>(*args) }
// Message.kt package com.example.demo import org.springframework.data.annotation.Id import org.springframework.data.relational.core.mapping.Table @Table("MESSAGES") data class Message(val text: String, @Id val id: String? = null)
// MessageRepository.kt package com.example.demo import org.springframework.data.repository.CrudRepository interface MessageRepository : CrudRepository<Message, String>
// MessageService.kt package com.example.demo import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @Service class MessageService(private val db: MessageRepository) { fun findMessages(): List<Message> = db.findAll().toList() fun findMessageById(id: String): Message? = db.findByIdOrNull(id) fun save(message: Message): Message = db.save(message) }
// MessageController.kt package com.example.demo import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController import java.net.URI @RestController @RequestMapping("/") class MessageController(private val service: MessageService) { @GetMapping fun listMessages() = ResponseEntity.ok(service.findMessages()) @PostMapping fun post(@RequestBody message: Message): ResponseEntity<Message> { val savedMessage = service.save(message) return ResponseEntity.created(URI("/${savedMessage.id}")).body(savedMessage) } @GetMapping("/{id}") fun getMessage(@PathVariable id: String): ResponseEntity<Message> = service.findMessageById(id).toResponseEntity() private fun Message?.toResponseEntity(): ResponseEntity<Message> = // If the message is null (not found), set response code to 404 this?.let { ResponseEntity.ok(it) } ?: ResponseEntity.notFound().build() }

Запуск приложения

Поздравляем! Приложение снова готово к запуску. После замены JdbcTemplate на CrudRepository функциональность не изменилась, поэтому приложение работает как и прежде.

Теперь можно выполнить HTTP-запросы POST и GET из файла requests.http и получить те же результаты.

  • Предыдущий шаг

Что дальше

Получите персональную карту языка, которая поможет ориентироваться в возможностях Kotlin и отслеживать прогресс в изучении языка:

Получить карту языка Kotlin

  • Ознакомьтесь с документацией Spring Framework.

  • Создайте простое веб-приложение с защищёнными ресурсами, следуя руководству Защита веб-приложения.

  • Пройдите руководство Создание веб-приложений с помощью Spring Boot и Kotlin.

1 сентября 2026 г.
Добавление поддержки базы данных в проект Spring BootСоздание приложения для управления задачами с помощью Spring Boot и Claude

© 2010–2026 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API