摘要:一本節目標前兩章主要講了的基本操作,這一章我們將學習使用訪問,并通過完成簡單操作。這里有一個問題什么不選用數據庫呢答案是目前支持。突出點是,即非阻塞的。二構建項目及配置本章不在講解如何構建項目了,大家可以參考第一章。
一、本節目標
前兩章主要講了SpringBoot Kotlin的基本操作,這一章我們將學習使用Kotlin訪問MongoDB,并通過JPA完成(Create,Read,Update,Delete)簡單操作。這里有一個問題什么不選用MySQL數據庫呢?
答案是 Spring Data Reactive Repositories 目前支持 Mongo、Cassandra、Redis、Couchbase。不支持 MySQL,那究竟為啥呢?那就說明下 JDBC 和 Spring Data 的關系。
Spring Data Reactive Repositories 突出點是 Reactive,即非阻塞的。區別如下:
基于 JDBC 實現的 Spring Data,比如 Spring Data JPA 是阻塞的。原理是基于阻塞 IO 模型 消耗每個調用數據庫的線程(Connection)。
事務只能在一個 java.sql.Connection 使用,即一個事務一個操作。
二、構建項目及配置本章不在講解如何構建項目了,大家可以參考第一章。這里我們主要引入了mongodb-reactive框架,在pom文件加入下列內容即可。
org.springframework.boot spring-boot-starter-data-mongodb-reactive
如何jar包后我們需要配置一下MongoDB數據庫,在application.properties文件中加入一下配置即可,密碼和用戶名需要替換自己的,不然會報錯的。
spring.data.mongodb.host=localhost spring.data.mongodb.port=27017 spring.data.mongodb.password=student2018.Docker_ spring.data.mongodb.database=student spring.data.mongodb.username=student三、創建實體及具體實現 3.1實體創建
package io.intodream.kotlin03.entity import org.springframework.data.annotation.Id import org.springframework.data.mongodb.core.mapping.Document /** * @description * * @author Jwenk * @copyright intoDream.io 筑夢科技 * @email xmsjgzs@163.com * @date 2019-03-25,18:05 */ @Document class Student { @Id var id :String? = null var name :String? = null var age :Int? = 0 var gender :String? = null var sClass :String ?= null override fun toString(): String { return ObjectMapper().writeValueAsString(this) } }3.2Repository
package io.intodream.kotlin03.dao import io.intodream.kotlin03.entity.Student import org.springframework.data.mongodb.repository.ReactiveMongoRepository /** * @description * * @author Jwenk * @copyright intoDream.io 筑夢科技 * @email xmsjgzs@163.com * @date 2019-03-25,18:04 */ interface StudentRepository : ReactiveMongoRepository3.3Service{ }
package io.intodream.kotlin03.service import io.intodream.kotlin03.entity.Student import reactor.core.publisher.Flux import reactor.core.publisher.Mono /** * @description * * @author Jwenk * @copyright intoDream.io 筑夢科技 * @email xmsjgzs@163.com * @date 2019-03-25,18:04 */ interface StudentService { /** * 通過學生編號獲取學生信息 */ fun find(id : String): Mono3.4 Controller實現/** * 查找所有學生信息 */ fun list(): Flux /** * 創建一個學生信息 */ fun create(student: Student): Mono /** * 通過學生編號刪除學生信息 */ fun delete(id: String): Mono } // 接口實現類 package io.intodream.kotlin03.service.impl import io.intodream.kotlin03.dao.StudentRepository import io.intodream.kotlin03.entity.Student import io.intodream.kotlin03.service.StudentService import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service import reactor.core.publisher.Flux import reactor.core.publisher.Mono /** * @description * * @author Jwenk * @copyright intoDream.io 筑夢科技 * @email xmsjgzs@163.com * @date 2019-03-25,18:23 */ @Service class StudentServiceImpl : StudentService{ @Autowired lateinit var studentRepository: StudentRepository override fun find(id: String): Mono { return studentRepository.findById(id) } override fun list(): Flux { return studentRepository.findAll() } override fun create(student: Student): Mono { return studentRepository.save(student) } override fun delete(id: String): Mono { return studentRepository.deleteById(id) } }
package io.intodream.kotlin03.web import io.intodream.kotlin03.entity.Student import io.intodream.kotlin03.service.StudentService import org.slf4j.LoggerFactory import org.springframework.beans.factory.annotation.Autowired import org.springframework.web.bind.annotation.* import reactor.core.publisher.Flux import reactor.core.publisher.Mono /** * @description * * @author Jwenk * @copyright intoDream.io 筑夢科技 * @email xmsjgzs@163.com * @date 2019-03-25,18:03 */ @RestController @RequestMapping("/api/student") class StudentController { @Autowired lateinit var studentService: StudentService val logger = LoggerFactory.getLogger(this.javaClass) /** * 保存或新增學生信息 */ @PostMapping("/") fun create(@RequestBody student: Student): Mono四、接口測試{ logger.info("【保存學生信息】請求參數:{}", student) return studentService.create(student) } /** * 更新學生信息 */ @PutMapping("/") fun update(@RequestBody student: Student): Mono { logger.info("【更新學生信息】請求參數:{}", student) return studentService.create(student) } /** * 查找所有學生信息 */ @GetMapping("/list") fun listStudent(): Flux { return studentService.list() } /** * 通過學生編號查找學生信息 */ @GetMapping("/id") fun student(@RequestParam id : String): Mono { logger.info("查詢學生編號:{}", id) return studentService.find(id) } /** * 通過學生編號刪除學生信息 */ @DeleteMapping("/") fun delete(@RequestParam id: String): Mono { logger.info("刪除學生編號:{}", id) return studentService.delete(id) } }
這里我們使用Postman來對接口進行測試,關于Postman這里接不用做過多的介紹了,不懂可以自行百度。
控制臺打印如下:
2019-03-25 18:57:04.333 INFO 2705 --- [ctor-http-nio-3] i.i.kotlin03.web.StudentController : 【保存學生信息】請求參數:{"id":"1","name":"Tom","age":18,"gender":"Boy","sclass":"First class"}
我們看一下數據庫是否存儲了
其他接口測試情況
如果大家覺得文章有用麻煩點一下贊,有問題的地方歡迎大家指出來。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77524.html
摘要:一本節目標前兩章主要講了的基本操作,這一章我們將學習使用訪問,并通過完成簡單操作。這里有一個問題什么不選用數據庫呢答案是目前支持。突出點是,即非阻塞的。二構建項目及配置本章不在講解如何構建項目了,大家可以參考第一章。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 一、本節目標 前兩...
摘要:二教程環境三創建項目創建項目有兩種方式一種是在官網上創建二是在上創建如圖所示勾選然后點,然后一直默認最后點擊完成即可。我們這里看到和普通的接口沒有異同,除了返回類型是用包裝之外。與之對應的還有,這個后面我們會講到。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 從去年開始就開始學習...
摘要:下一代服務端開發下一代服務端開發第部門快速開始第章快速開始環境準備,,快速上手實現一個第章企業級服務開發從到語言的缺點發展歷程的缺點為什么是產生的背景解決了哪些問題為什么是的發展歷程容器的配置地獄是什么從到下一代企業級服務開發在移動開發領域 《 Kotlin + Spring Boot : 下一代 Java 服務端開發 》 Kotlin + Spring Boot : 下一代 Java...
showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 在開發項目中,我們經常會需要打印日志,這樣方便開發人員了解接口調用情況及定位錯誤問題,很多時候對于Controller或者是Service的入參和出參需要打印日志,但是我們又不想重復的在每個方法里去使用logger打印,這個時候希望有一個管理者統一...
摘要:在配置下上面啟動的配置數據庫名為賬號密碼也為。突出點是,即非阻塞的。四對象修改包里面的城市實體對象類。修改城市對象,代碼如下城市實體類城市編號省份編號城市名稱描述注解標記對應庫表的主鍵或者唯一標識符。 摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝! 這是泥瓦匠的第104篇原創 文章工程: JDK...
閱讀 1985·2021-11-22 14:45
閱讀 2593·2021-10-12 10:11
閱讀 768·2021-09-22 10:02
閱讀 1198·2019-08-30 15:55
閱讀 1142·2019-08-30 15:54
閱讀 3247·2019-08-30 15:54
閱讀 1181·2019-08-29 17:16
閱讀 3080·2019-08-28 17:55