Kotlin Spring Boot Web-Service与数据库集成


这篇文章的目的: 分析 Kotlin 网上服务的结构,以 CRUD 服务为例,考虑如何与数据库整合


Kotlin Spring Boot Web-Service与数据库集成

目前,Web 应用程序形式的服务尤其常见。很难想象某种网络应用程序不以任何方式存储数据。数据库是当今存储数据最常用的方式。

从服务端来看,任何数据库都像是一个外部集成。如果服务被测试覆盖,那就意味着需要对这个集成进行测试。有许多方法可以测试这种集成; 下面,我们将分析最流行的方法。

基础设施说明

例如,使用基于 Spring Boot 的基本 CRUD Kotlin 服务。

CRUD Web 服务提供了通过 HTTP 请求从数据库中创建(C)、读取(R)、更新(U)、删除(D)实体的功能。

例如,我们将考虑一个没有删除和更新功能的服务——只保留创建和读取功能。因为,原则上,我们将涵盖这两种方法所需的所有内容。

H2用作数据库,但任何关系数据库都可以使用。由于我们只关注集成测试,因此本文的总体意图将与其他流行的关系数据库相关。

Web 服务功能的描述

该示例中的服务的职责范围是与 pokeApi 集成,以根据名称获取有关口袋妖怪权重的信息。以及将此信息保存到数据库并提供获取所有保存记录的机会。

服务的主要功能使用以下依赖项:


    org.springframework.boot
    spring-boot-starter-data-jdbc


    org.springframework.boot
    spring-boot-starter-web


    com.fasterxml.jackson.module
    jackson-module-kotlin


    org.jetbrains.kotlin
    kotlin-reflect


    org.jetbrains.kotlin
    kotlin-stdlib-jdk8


    com.h2database
    h2
    runtime


数据库结构

The table for storing information about the weight of a Pokémon in the application's database looks like this:

用于在应用程序数据库中存储Pokémon重量信息的表如下所示:

create table pokemon (
    id     integer primary key auto_increment,
    name   varchar(25),
    weight integer
);

Id - Identity 字段

name - 一个用于存储有关口袋妖怪名称信息的字段

weight- 一个包含有关口袋妖怪重量信息的字段。

功能端点的描述

Web 服务有两个端点,它们具有需要测试覆盖的功能。


POST/pokemon - 将模型保存到数据库中。

模型有2个必需的字段-name (String)和 weight (Integer)。

举个例子:

###
POST http://localhost:8080/pokemon
Content-Type: application/json

{
  "name": "bulbasaur",
  "weight": 69
}


GET/pokemon 是一个端点,负责提供数据库中的所有记录。

作为响应,该方法返回一个包含3个字段的模型数组-id (Long)、 name (String)、 weight (Integer)。

举个例子:

###
GET http://localhost:8080/pokemon

response:

[
  {
    "id": 1,
    "name": "bulbasaur",
    "weight": 69
  },
  {
    "id": 2,
    "name": "ditto",
    "weight": 40
  }
]


控制器代码:

@RestController
@RequestMapping("/pokemon")
class PokemonController(private val pokemonDao: PokemonDao) {

    @PostMapping
    fun savePokemon(@RequestBody pokemon: Pokemon) {
        pokemonDao.save(pokemon)
    }

    @GetMapping
    fun getAll(): List = pokemonDao.getAll()

    @ExceptionHandler
    fun handleException(exception: Exception): ResponseEntity<*> {
        return ResponseEntity(exception.message, HttpStatus.BAD_REQUEST)
    }
}

DAO 层的描述

DAO (数据访问对象)层完全负责与存储库的集成。JdbcTemplate 用于描述数据库集成。JdbcTemplate 是一个 Spring 库,它允许您用本机 SQL 编写查询。

为了便于映射实体,使用了常规 objectMapper。在重负载下,这样的映射可以更改为更优的映射。

DAO 层如下所示:

@Service
class PokemonDao(private val jdbcTemplate: JdbcTemplate, private val objectMapper: ObjectMapper) {

    fun save(pokemon: Pokemon) {
        jdbcTemplate.update(SAVE_POKEMON, pokemon.name, pokemon.weight)
    }

    fun getAll(): List =
        jdbcTemplate.queryForList(SELECT_ALL_POKEMONS)
            .map { objectMapper.readValue(objectMapper.writeValueAsString(it), Pokemon::class.java) }
}

@Language("Sql")
private const val SAVE_POKEMON = "insert into pokemon values(default, ?, ?)"

@Language("Sql")
private const val SELECT_ALL_POKEMONS = "select * from pokemon"

数据库配置

数据库参数可以在 Web 服务之外和 application.properties 中配置:

spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE;
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

DDL 可以包含在 schema. sql 中

总之,我们已经考虑了使用 H2 + Spring Boot 的例子来实现 Web 服务与数据库集成的基本方法。

如何测试数据库集成?我将很高兴在评论中听到你们关于如何将 Web 服务与数据库集成的想法。

资源可以在我的 GitHub 存储库中找到: pokemon-app

https://github.com/v-aksenov/pokemon-app

Kotlin Spring Boot Web-Service与数据库集成

Spring   Kotlin   Web
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章