使用Spring Boot和Kotlin创建可以进行CRUD操作的API的方法

我們將使用Spring Boot和Kotlin來創建可以進行CRUD操作的API。

环境

Docker: 18.09.2
Springboot: 2.1.5
Kotlin: 1.3.31
MySQL: 5.7.26

Docker:18.09.2
Springboot:2.1.5
Kotlin:1.3.31
MySQL:5.7.26

创建项目

首先,我们来创建一个Spring Boot项目。

1. 访问 Sprin Initializr。
2. 项目可以选择 Maven 或 Gradle,语言选择 Kotlin,选择 Spring Boot 的版本为 2.X 及以上。
3. 根据需要修改项目元数据。本次选择的 artifact 是 sample_qiita。
4. 选择 Web、JPA 和 MySQL 作为依赖项。
5. 最后点击 Generate Project 下载已完成设置的项目,并在本地打开。

スクリーンショット 2019-06-05 12.16.40.png

我认为在本地的IDE中打开时,目录结构应如下所示。

sample_qiita
 ├ .idea
 ├ .gradle
 ├ src
 │ ├ main
 │ │ ├ kotlin
 │ │ │  └ com.example.sample_qiita
 │ │ │     └ SampleQiitaAppllication.kt
 │ │ └ resources
 │ │     ├ static 
 │ │    ├ templates
 │ │     └ application.properties
 │ └ test
 │   └ kotlin
 │     └ com.example.sampleqiita
 │       └ SampleQiitaAppllicationTests
 ├ .gitignore
 ├ build.gradle.kt
 ・
 ・
 ・
 └ External Libraries

MySQL的连接设置

由于我想要创建一个Docker容器并在其中使用MySQL,因此我将根据这篇文章在sample_qiita下创建docker-compose.yml文件。

db:
  image: mysql:5.7
  ports:
    - "3306:3306"
  environment:
    MYSQL_DATABASE: sample_qiita_db
    MYSQL_ROOT_USER: root
    MYSQL_ROOT_PASSWORD: root

下一步,需要对MySQL的URL、用户名和密码进行配置,以使Spring Boot能够创建数据源。请编辑src/main/resources/application.properties文件。

## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/sample_qiita_db?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
spring.datasource.username = root
spring.datasource.password = root

## Hibernate Properties

# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect

# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto = update

现在可以连接到Docker容器上的MySQL了。

建立模型

让我们创建一个实体。
在com.example.sample_qiita包内创建一个名为model的包,并在其中创建一个名为Qiita.kt的文件。

package com.example.sample_qiita.model

import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.validation.constraints.NotBlank

@Entity
data class Qiita (
        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        val id: Long = 0,

        @get: NotBlank
        val title: String = "",

        @get: NotBlank
        val content: String = ""
)

这次我们为Qiita类的所有字段设置了默认值。
这是因为Hibernate需要一个没有参数的构造函数来创建实体。

如果为所有字段分配默认值,则Hibernate可以实例化Qiita而无需传递参数。

创建存储库

在con.example.sample_qiita中创建一个repository包,并在其中创建一个QiitaRepository.kt文件。

package com.example.sample_qiita.repository

import com.example.sample_qiita.model.Qiita
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository

@Repository
interface QiitaRepository: JpaRepository<Qiita, Long>

由于这个操作,我们现在可以通过扩展JpaRepository来使用QiitaRepository,以便使用Qiita实体的所有CRUD方法。

创建控制器

请创建一个用于对Qiita实体执行CRUD操作的控制器。

在`com.example.sample_qiita`包中创建一个名为`controller`的包,并在其中创建`QiitaController.kt`文件。

package com.example.sample_qiita.controller

import com.example.sample_qiita.model.Qiita
import com.example.sample_qiita.repository.QiitaRepository
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.*
import javax.validation.Valid

@RestController
@RequestMapping("/api")
class QiitaController(private val qiitaRepository: QiitaRepository) {

    @GetMapping("/qiitas")
    fun getAllQiitas(): List<Qiita> =
            qiitaRepository.findAll()

    @PostMapping("/qiitas")
    fun createNewQiita(@Valid @RequestBody qiita: Qiita): Qiita =
            qiitaRepository.save(qiita)

    @GetMapping("/qiitas/{id}")
    fun getQiitaBiId(@PathVariable(value = "id") qiitaed: Long): ResponseEntity<Qiita> {
        return qiitaRepository.findById(qiitaed).map { qiita ->
            ResponseEntity.ok(qiita)
        }.orElse(ResponseEntity.notFound().build())
    }

    @PutMapping("/qiitas/{id}")
    fun updateQiitaById(@PathVariable(value = "id") qiitaed: Long,
                          @Valid @RequestBody newQiita: Qiita): ResponseEntity<Qiita> {

        return qiitaRepository.findById(qiitaed).map { existingQiita ->
            val updateQiita: Qiita = existingQiita
                    .copy(title = newQiita.title, content = newQiita.content)
            ResponseEntity.ok().body(qiitaRepository.save(updateQiita))
        }.orElse(ResponseEntity.notFound().build())

    }

    @DeleteMapping("/qiitas/{id}")
    fun deleteQiitaById(@PathVariable(value = "id") qiitaed: Long): ResponseEntity<Void> {

        return qiitaRepository.findById(qiitaed).map { qiita ->
            qiitaRepository.delete(qiita)
            ResponseEntity<Void>(HttpStatus.OK)
        }.orElse(ResponseEntity.notFound().build())
    }
}

因为以上所述,应用程序已经完成了,所以让我们立即测试一下吧。

启动方式

首先启动Docker容器。

$ docker-compose up -d

我们来运行下面创建的sample_qiita。

如果访问http://localhost:8080/api/qiitas时,显示一个空数组[],那么就表示成功。

对Rest API进行操作验证

让我们使用curl命令来测试是否可以获得正确的响应。

创建Qiita

我们将通过对/api/articles进行POST请求并发送数据,以确保是否成功创建了一个新的Qiita。

让我们尝试在命令行中执行以下内容。

curl -i -H "Content-Type: application/json" -X POST \
-d '{"title": "Create API by Spring Boot and Kotlin", "content": "Text of creating API"}' \
http://localhost:8080/api/qiitas

当执行此操作时,我认为会返回以下反应。

HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 05 Jun 2019 06:21:52 GMT

{"id":1,"title":"Create API by Spring Boot and Kotlin","content":"Text of creating API"}

新的Qiita数据已经成功保存到数据库中了。要确认,请访问http://localhost:8080/api/qiitas,或尝试以下方式。

获取所有数据。

让我们立即尝试输入下一行的命令。

curl -i -H 'Accept: application/json' http://localhost:8080/api/qiitas

HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 06 Oct 2017 03:25:29 GMT

{"id":1,"title":"Create API by Spring Boot and Kotlin","content":"Text of creating API"}

你好好地回来了呢!我想你会收到我们创建的所有Qiita数据。

获取使用ID指定的Qiita。

這是一個只獲取指定ID數據的命令。

curl -i -H 'Accept: application/json' http://localhost:8080/api/qiitas/1

HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 05 Jun 2019 06:33:27 GMT

{"id":1,"title":"Create API by Spring Boot and Kotlin","content":"Text of creating API"}

在URL(localhost:8080/api/qiitas/{id})的末尾,将获取与指定数字相同ID的Qiita数据。
当然,如果指定了不存在的ID号码,将返回404错误,请注意。

更新已创建的Qiita数据

要更新已经注册的数据,请使用PUT方法。

curl -i -H "Content-Type: application/json" -X PUT \
-d '{"title": "How to learn Spring boot and Kotlin", "content": "Resources to learn Spring boot and Kotlin"}' \
http://localhost:8080/api/qiitas/1

HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 05 Jun 2019 06:45:18 GMT

{"id":1,"title":"How to learn Spring boot and Kotlin","content":"Resources to learn Spring boot and Kotlin"}

删除Qiita数据。

要进行删除操作,需要使用DELETE方法。

curl -i -X DELETE http://localhost:8080/api/qiitas/1

HTTP/1.1 200 
Content-Length: 0
Date: Wed, 05 Jun 2019 06:47:21 GMT

文献引用

使用Kotlin、Spring Boot、Mysql、JPA和Hibernate构建Restful API

广告
将在 10 秒后关闭
bannerAds