摘要:一本節(jié)目標(biāo)前兩章主要講了的基本操作,這一章我們將學(xué)習(xí)使用訪問(wèn),并通過(guò)完成簡(jiǎn)單操作。這里有一個(gè)問(wèn)題什么不選用數(shù)據(jù)庫(kù)呢答案是目前支持。突出點(diǎn)是,即非阻塞的。二構(gòu)建項(xiàng)目及配置本章不在講解如何構(gòu)建項(xiàng)目了,大家可以參考第一章。
一、本節(jié)目標(biāo)
前兩章主要講了SpringBoot Kotlin的基本操作,這一章我們將學(xué)習(xí)使用Kotlin訪問(wèn)MongoDB,并通過(guò)JPA完成(Create,Read,Update,Delete)簡(jiǎn)單操作。這里有一個(gè)問(wèn)題什么不選用MySQL數(shù)據(jù)庫(kù)呢?
答案是 Spring Data Reactive Repositories 目前支持 Mongo、Cassandra、Redis、Couchbase。不支持 MySQL,那究竟為啥呢?那就說(shuō)明下 JDBC 和 Spring Data 的關(guān)系。
Spring Data Reactive Repositories 突出點(diǎn)是 Reactive,即非阻塞的。區(qū)別如下:
基于 JDBC 實(shí)現(xiàn)的 Spring Data,比如 Spring Data JPA 是阻塞的。原理是基于阻塞 IO 模型 消耗每個(gè)調(diào)用數(shù)據(jù)庫(kù)的線程(Connection)。
事務(wù)只能在一個(gè) java.sql.Connection 使用,即一個(gè)事務(wù)一個(gè)操作。
二、構(gòu)建項(xiàng)目及配置本章不在講解如何構(gòu)建項(xiàng)目了,大家可以參考第一章。這里我們主要引入了mongodb-reactive框架,在pom文件加入下列內(nèi)容即可。
org.springframework.boot spring-boot-starter-data-mongodb-reactive
如何jar包后我們需要配置一下MongoDB數(shù)據(jù)庫(kù),在application.properties文件中加入一下配置即可,密碼和用戶名需要替換自己的,不然會(huì)報(bào)錯(cuò)的。
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三、創(chuàng)建實(shí)體及具體實(shí)現(xiàn) 3.1實(shí)體創(chuàng)建
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 筑夢(mèng)科技 * @email [email protected] * @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 筑夢(mèng)科技 * @email [email protected] * @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 筑夢(mèng)科技 * @email [email protected] * @date 2019-03-25,18:04 */ interface StudentService { /** * 通過(guò)學(xué)生編號(hào)獲取學(xué)生信息 */ fun find(id : String): Mono3.4 Controller實(shí)現(xiàn)/** * 查找所有學(xué)生信息 */ fun list(): Flux /** * 創(chuàng)建一個(gè)學(xué)生信息 */ fun create(student: Student): Mono /** * 通過(guò)學(xué)生編號(hào)刪除學(xué)生信息 */ fun delete(id: String): Mono } // 接口實(shí)現(xiàn)類 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 筑夢(mèng)科技 * @email [email protected] * @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 筑夢(mèng)科技 * @email [email protected] * @date 2019-03-25,18:03 */ @RestController @RequestMapping("/api/student") class StudentController { @Autowired lateinit var studentService: StudentService val logger = LoggerFactory.getLogger(this.javaClass) /** * 保存或新增學(xué)生信息 */ @PostMapping("/") fun create(@RequestBody student: Student): Mono四、接口測(cè)試{ logger.info("【保存學(xué)生信息】請(qǐng)求參數(shù):{}", student) return studentService.create(student) } /** * 更新學(xué)生信息 */ @PutMapping("/") fun update(@RequestBody student: Student): Mono { logger.info("【更新學(xué)生信息】請(qǐng)求參數(shù):{}", student) return studentService.create(student) } /** * 查找所有學(xué)生信息 */ @GetMapping("/list") fun listStudent(): Flux { return studentService.list() } /** * 通過(guò)學(xué)生編號(hào)查找學(xué)生信息 */ @GetMapping("/id") fun student(@RequestParam id : String): Mono { logger.info("查詢學(xué)生編號(hào):{}", id) return studentService.find(id) } /** * 通過(guò)學(xué)生編號(hào)刪除學(xué)生信息 */ @DeleteMapping("/") fun delete(@RequestParam id: String): Mono { logger.info("刪除學(xué)生編號(hào):{}", id) return studentService.delete(id) } }
這里我們使用Postman來(lái)對(duì)接口進(jìn)行測(cè)試,關(guān)于Postman這里接不用做過(guò)多的介紹了,不懂可以自行百度。
控制臺(tái)打印如下:
2019-03-25 18:57:04.333 INFO 2705 --- [ctor-http-nio-3] i.i.kotlin03.web.StudentController : 【保存學(xué)生信息】請(qǐng)求參數(shù):{"id":"1","name":"Tom","age":18,"gender":"Boy","sclass":"First class"}
我們看一下數(shù)據(jù)庫(kù)是否存儲(chǔ)了
其他接口測(cè)試情況
如果大家覺(jué)得文章有用麻煩點(diǎn)一下贊,有問(wèn)題的地方歡迎大家指出來(lái)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19502.html
摘要:一本節(jié)目標(biāo)前兩章主要講了的基本操作,這一章我們將學(xué)習(xí)使用訪問(wèn),并通過(guò)完成簡(jiǎn)單操作。這里有一個(gè)問(wèn)題什么不選用數(shù)據(jù)庫(kù)呢答案是目前支持。突出點(diǎn)是,即非阻塞的。二構(gòu)建項(xiàng)目及配置本章不在講解如何構(gòu)建項(xiàng)目了,大家可以參考第一章。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 一、本節(jié)目標(biāo) 前兩...
摘要:二教程環(huán)境三創(chuàng)建項(xiàng)目創(chuàng)建項(xiàng)目有兩種方式一種是在官網(wǎng)上創(chuàng)建二是在上創(chuàng)建如圖所示勾選然后點(diǎn),然后一直默認(rèn)最后點(diǎn)擊完成即可。我們這里看到和普通的接口沒(méi)有異同,除了返回類型是用包裝之外。與之對(duì)應(yīng)的還有,這個(gè)后面我們會(huì)講到。 showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 從去年開(kāi)始就開(kāi)始學(xué)習(xí)...
摘要:下一代服務(wù)端開(kāi)發(fā)下一代服務(wù)端開(kāi)發(fā)第部門快速開(kāi)始第章快速開(kāi)始環(huán)境準(zhǔn)備,,快速上手實(shí)現(xiàn)一個(gè)第章企業(yè)級(jí)服務(wù)開(kāi)發(fā)從到語(yǔ)言的缺點(diǎn)發(fā)展歷程的缺點(diǎn)為什么是產(chǎn)生的背景解決了哪些問(wèn)題為什么是的發(fā)展歷程容器的配置地獄是什么從到下一代企業(yè)級(jí)服務(wù)開(kāi)發(fā)在移動(dòng)開(kāi)發(fā)領(lǐng)域 《 Kotlin + Spring Boot : 下一代 Java 服務(wù)端開(kāi)發(fā) 》 Kotlin + Spring Boot : 下一代 Java...
showImg(https://segmentfault.com/img/remote/1460000018819338?w=1024&h=500); 在開(kāi)發(fā)項(xiàng)目中,我們經(jīng)常會(huì)需要打印日志,這樣方便開(kāi)發(fā)人員了解接口調(diào)用情況及定位錯(cuò)誤問(wèn)題,很多時(shí)候?qū)τ贑ontroller或者是Service的入?yún)⒑统鰠⑿枰蛴∪罩?,但是我們又不想重?fù)的在每個(gè)方法里去使用logger打印,這個(gè)時(shí)候希望有一個(gè)管理者統(tǒng)一...
摘要:在配置下上面啟動(dòng)的配置數(shù)據(jù)庫(kù)名為賬號(hào)密碼也為。突出點(diǎn)是,即非阻塞的。四對(duì)象修改包里面的城市實(shí)體對(duì)象類。修改城市對(duì)象,代碼如下城市實(shí)體類城市編號(hào)省份編號(hào)城市名稱描述注解標(biāo)記對(duì)應(yīng)庫(kù)表的主鍵或者唯一標(biāo)識(shí)符。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 這是泥瓦匠的第104篇原創(chuàng) 文章工程: JDK...
閱讀 2833·2023-04-26 01:00
閱讀 763·2021-10-11 10:59
閱讀 2984·2019-08-30 11:18
閱讀 2684·2019-08-29 11:18
閱讀 1023·2019-08-28 18:28
閱讀 3019·2019-08-26 18:36
閱讀 2138·2019-08-23 18:16
閱讀 1072·2019-08-23 15:56