如何在Kotlin和MongoDB中创建一个Spring Boot CRUD API

341 阅读4分钟

春季数据 MongoDB

Spring Data MongoDB使Spring Boot应用程序与Mongo文档数据库集成成为可能。它提供了一个MongoRepository ,包含用于执行MongoDB CRUD操作的所有方法。

在我们开始之前,我们将需要以下内容。

先决条件

  1. 在您的计算机上安装[JDK]。
  2. 你喜欢的IDE。我将使用[Intellij IDEA]社区版。
  3. 对[Java]和[Spring Boot]有一些了解。
  4. 在你的电脑上安装[MongoDB]。

MongoDB术语

  • 数据库是一个集合的容器,可以被认为是RDBMS数据库,它是一个表的容器。
  • 集合相当于RDBMS中的表,但与表不同,它有一个动态模式。一个集合存在于一个数据库中。
  • 文档是MongoDB集合中的一条记录。它可以被认为是RDBMS中的一个行。
  • 字段这是一个有零个或多个字段的文档。它就像RDBMS的列,有一个键值对。
  • 嵌入文档是一种有效和干净的方式来存储相关数据,特别是经常一起访问的数据。
  • 主键唯一地识别了一个文档。

创建应用程序

我们将使用[spring initializr]来创建我们的应用程序。

  1. 在浏览器中打开[Spring initializr]。
  2. 选择语言为Kotlin。
  3. 添加Spring Web,Spring Data MongoDB, dependencies。
  4. 将其他配置保留为默认,然后点击生成项目。
  5. 解压下载的项目,并在你喜欢的IDE中打开它。我将使用[Intelij IDEA社区],它是免费提供的。
  6. 将项目与maven同步,下载所有的依赖项。

领域层

在我们应用程序的根包中,创建一个名为domain 的包。

在我们上面创建的领域包中创建一个名为Todo.kt 的Kotlin文件,并将下面的代码片段添加到该文件中。


import org.springframework.data.annotation.Id

import org.springframework.data.mongodb.core.mapping.Document

@Document(collection = "todo")

data class Todo(

   @Id

   val id: String,

   var title: String,

   var description: String,

   var isCompleted: Boolean

)
  • @Document(collection = "todo") 注解将 数据类标记为MongoDB文件,该文件将被存储在 集合下。Todo todo

  • @Id 标记 字段为MongoDB集合中的唯一对象ID。id

控制器层

在我们应用程序的根包中,创建一个名为controllers 的包。

创建一个名为TodoController.kt 的Kotlin文件,并添加以下代码片段。


@RestController

@RequestMapping("/api/v1/todos/")

@CrossOrigin("*")

class TodoController(val todoService: TodoService) {

   //Get all todos in the database

   @GetMapping("")

   fun getAllTodos(): ResponseEntity<List<Todo>> {

       return ResponseEntity(todoService.getTodos(), HttpStatus.OK)

   }

   //Get Todo from the database by id

   @GetMapping("/{id}")

   fun getTodoById(@PathVariable("id") id: String): ResponseEntity<Todo> {

       return ResponseEntity(todoService.getTodoById(id), HttpStatus.OK)

   }

   //save a todo into the database

   @PostMapping("")

   fun saveTodo(@RequestBody todo: Todo): ResponseEntity<Any> {

       return ResponseEntity(todoService.saveTodo(todo), HttpStatus.CREATED)

   }

   //update todo

   @PutMapping("")

   fun updateTodo(@RequestBody todo: Todo): ResponseEntity<Any> {

       return ResponseEntity(todoService.updateTodo(todo), HttpStatus.OK)

   }

   //delete todo

   @DeleteMapping("/{id}")

   fun deleteTodo(@PathVariable("id") id: String): ResponseEntity<Any> {

       return ResponseEntity(todoService.deleteTodo(id), HttpStatus.NO_CONTENT)

   }

}
  • @CrossOrigin 注释配置了允许的起源。它也被称为 , 允许运行在不同域上的应用程序进行通信。cors cors

  • @RestController 注解定义了一个控制器,并指出方法的返回值应该被绑定到网络响应体。

  • @RequestMapping 声明控制器中的所有API的URL将以 开始。/api/v1/todos/

存储库层

在我们应用程序的根包中创建一个名为repository 的包,并在repository 包中创建一个名为TodoRepository.kt 的Kotlin文件,添加以下代码片段。


interface TodoRepository : MongoRepository<Todo, String> {

}
  • interface TodoRepository 扩展 接口,该接口包含所有我们要用来查询MongoDB集合的CRUD函数。MongoRepository

服务层

在根项目包中,创建一个名为service 的包,并添加两个Kotlin文件TodoService.kt,TodoServiceImpl ,代码片段如下。


interface TodoService {

   fun saveTodo(todo: Todo)

   fun getTodos(): List<Todo>

   fun getTodoById(id: String): Todo

   fun deleteTodo(id: String)

   fun updateTodo(todo: Todo)

}

@Service

class TodoServiceImpl(val todoRepository: TodoRepository) : TodoService {

   override fun saveTodo(todo: Todo) {

       todoRepository.save(todo)

   }

   override fun getTodos(): List<Todo> {

       return todoRepository.findAll()

   }

   override fun getTodoById(id: String): Todo {

       val todoQueried: Optional<Todo> = todoRepository.findById(id)

       if (todoQueried.isPresent) {

           return todoQueried.get()

       } else {

           throw IllegalStateException("Todo with id $id not found")

       }

   }

   override fun deleteTodo(id: String) {

       todoRepository.deleteById(id)

   }

   override fun updateTodo(todo: Todo) {

       val todoQueried: Optional<Todo> = todoRepository.findById(todo.id)

       if (todoQueried.isPresent) {

           val _todo = todoQueried.get()

           _todo.description = todo.description

           _todo.isCompleted = todo.isCompleted

           _todo.title = todo.title

           todoRepository.save(_todo)

       } else {

           throw IllegalStateException("Todo with id ${todo.id} is not found")

       }

   }

}

配置

本地连接到MongoDB在资源目录中,在IDE中打开application.properties 文件并添加以下配置。


spring.data.mongodb.database=todo_db

spring.data.mongodb.port=27017
  • spring.data.mongodb.database=todo_db 表示我们的数据库名称是 。todo_db

  • spring.data.mongodb.port=27017 表示我们将通过端口 连接到 mongodb 。27017

连接到Mongo Atlas

  1. 访问Mongo Atlas并创建一个账户。

  2. 点击Database Access 边上的菜单,添加一个数据库用户。

Mongo Atlas database user

  1. 点击Cluster 边上的菜单并创建一个数据库。

Mongo Atlas create database

  1. Cluster 边上的菜单上,点击connect ,选择连接方法为connect your application 。复制连接字符串。

Mongo Atlas connection string

  1. application.properties 文件中添加以下配置。

   #spring.data.mongodb.database=todo_db

   #spring.data.mongodb.port=27017

   spring.data.mongodb.uri=mongodb+srv://<username>:<password>@cluster0.vlohf.mongodb.net/<database>?retryWrites=true&w=majority
  • <username>,<password>, 和<database> 改为你在Mongo Atlas中创建的凭证。

总结

你现在已经学会了如何在Kotlin和MongoDB中创建一个Spring Boot CRUD API,在Todo 数据类中添加字段dateCreatedlastModified