使用 Spring Data CrudRepository 进行数据库访问
在这一章中, 你将会迁移服务层, 使用 Spring Data CrudRepository 进行数据库访问, 而不是原来的 JdbcTemplate. CrudRepository 是一个 Spring Data 接口, 可以指定类型的仓库进行通常的 CRUD 操作. 它提供了一些现成的方法来操作数据库.
更新你的应用程序
首先, 你需要调整 Message 类, 来配合 CrudRepository API:
向
Message类添加@Table注解, 声明它与数据库表的映射关系. 在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类的使用更加符合 Kotlin 的编程习惯, 你可以将id属性的默认值设置为 null, 并翻转数据类的属性顺序:@Table("MESSAGES") data class Message(val text: String, @Id val id: String? = null)现在, 如果你需要创建的
Message类的新实例, 你可以在参数中只指定text属性:val message = Message("Hello") // id 为 null为
CrudRepository声明一个接口, 它负责操作Message数据类. 创建MessageRepository.kt文件, 添加以下代码:// MessageRepository.kt package com.example.demo import org.springframework.data.repository.CrudRepository interface MessageRepository : CrudRepository<Message, String>更新
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()函数是 Spring Data JDBC 中的CrudRepository接口的一个 扩展函数.在上面的代码中,
Optional<out T>.toList(),.toList()是Optional的扩展函数. 使用扩展函数, 你可以向任何类添加额外的函数, 当你想要扩展某些库中的类的功能时, 这样会非常有用.- CrudRepository save() 函数
这个函数的工作方式 是假定新的对象在数据库中没有 id. 因此, 对 insertion 操作, id 需要为 null.
如果 id 不是 null,
CrudRepository假定对象在数据库中已经存在, 并且这是一个 update 操作, 而不是 insert 操作. 在 insert 操作之后,id会由数据库生成, 并反过来赋值给Message实例. 这就是id属性需要使用var关键字来声明的原因.
更新 messages 表定义, 对 insert 的对象生成 id. 由于
id是一个字符串, 你可以使用RANDOM_UUID()函数来生成默认的 id 值:-- schema.sql CREATE TABLE IF NOT EXISTS messages ( id VARCHAR(60) DEFAULT RANDOM_UUID() PRIMARY KEY, text VARCHAR NOT NULL );更新
src/main/resources文件夹中的application.properties文件内的数据库名称: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
下面是应用程序的完整代码:
运行应用程序
恭喜! 应用程序可以再次运行了. 在将 JdbcTemplate 替换为 CrudRepository 之后, 功能没有改变, 因此应用程序会和以前一样运行.
现在你可以从 requests.http 文件 运行 POST 和 GET HTTP 请求, 并得到相同的结果.
下一步做什么
得到你个人的语言导航地图, 它可以帮助你浏览 Kotlin 的功能特性, 并追踪你学习语言的进度:
学习如何使用 Java 到 Kotlin 转换器 将既有的 Java 代码转换为 Kotlin.
阅读我们的 Java 代码向 Kotlin 迁移指南:
