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

网站UI设计

  这篇文章的目的: 分析 Kotlin 网上服务的结构,以 CRUD 服务为例,考虑如何与数据库整合 目前,Web 应用程序形式的服务尤其常见。很难想象某种网络应用程序不以任何方式存储数据。数据库是当今存储数据最常用的方式。 从服务端来看,任何数据库都像是一个外部集成。如果服务被测试覆盖,那就意味着需要对这个集成进行测试。有许多方法可以测试这种集成; 下面,我们将分析最流行的方法。 基础设施说明 例如,使用基于 Spring Boot 的基本 CRUD Kotlin 服务。 CRUD Web 服务提供了通过 HTTP 请求从数据库中创建(C)、读取(R)、更新(U)、删除(D)实体的功能。 例如,我们将考虑一个没有删除和更新功能的服务——只保留创建和读取功能。因为,原则上,我们将涵盖这两种方法所需的所有内容。 H2用作数据库,但任何关系数据库都可以使用。由于我们只集成测试,因此本文的总体意图将与其他流行的关系数据库相关。 Web 服务功能的描述 该示例中的服务的职责范围是与 pokeApi 集成,以根据名称获取有关口袋妖怪权重的信息。以及将此信息保存到数据库并提供获取所有保存记录的机会。 服务的主要功能使用以下依赖项: <depency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jdbc</artifactId></depency><depency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></depency><depency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-kotlin</artifactId></depency><depency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-reflect</artifactId></depency><depency> <groupId>org.jetbrains.kotlin</groupId> <artifactId>kotlin-stdlib-jdk8</artifactId></depency><depency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope></depency> 数据库结构 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/pokemonContent-Type: application/json{ "name": "bulbasaur", "weight": 69} GET/pokemon 是一个端点,负责提供数据库中的所有记录。 作为响应,该方法返回一个包含3个字段的模型数组-id (Long)、 name (String)、 weight (Integer)。 举个例子: ###GET http://localhost:8080/pokemonresponse:[ { "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<Pokemon> = pokemonDao.getAll() @ExceptionHandler fun handleException(exception: Exception): ResponseEntity<*> { return ResponseEntity(exception.message, HttpStatus.BAD_REQUEST) }}DAO 层的描述 DAO (数据访问对象)层完全负责与存储库的集成。JdbcTemplate 用于描述数据库集成。JdbcTemplate 是一个 Spring 库,它允许您用本机 SQL 编写查询。 为了便于映射实体,使用了常规 objectMapper。在重负载下,这样的映射可以更改为更优的映射。 DAO 层如下所示: @Serviceclass PokemonDao(private val jdbcTemplate: JdbcTemplate, private val objectMapper: ObjectMapper) { fun save(pokemon: Pokemon) { jdbcTemplate.update(SAVE_POKEMON, pokemon.name, pokemon.weight) } fun getAll(): List<Pokemon> = 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.Driverspring.datasource.username=saspring.datasource.password=passwordspring.jpa.database-platform=org.hibernate.dialect.H2DialectDDL 可以包含在 schema. sql 中 总之,我们已经考虑了使用 H2 + Spring Boot 的例子来实现 Web 服务与数据库集成的基本方法。 如何测试数据库集成?我将很高兴在评论中听到你们关于如何将 Web 服务与数据库集成的想法。 资源可以在我的 GitHub 存储库中找到: pokemon-app https://github.com/v-aksenov/pokemon-app

标签: 网站UI设计