Spring-webflux訪問關(guān)系型數(shù)據(jù)庫實(shí)戰(zhàn)
1. pom.xml引入
主要是支持在響應(yīng)式的環(huán)境下對(duì)關(guān)系型數(shù)據(jù)庫進(jìn)行訪問
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> </dependency> <dependency> <groupId>com.github.jasync-sql</groupId> <artifactId>jasync-r2dbc-mysql</artifactId> <version>1.1.3</version> </dependency>
注意: 這里對(duì)于SpringBoot的版本似乎是有一些要求的,為了避免遇到無法正常啟動(dòng)的情況,建議使用版本2.3.0-RELEASE版本
完整的xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>cn.lazyfennec</groupId> <artifactId>webflux-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>webflux-demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.0.RELEASE</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r2dbc</artifactId> </dependency> <dependency> <groupId>com.github.jasync-sql</groupId> <artifactId>jasync-r2dbc-mysql</artifactId> <version>1.1.3</version> </dependency> </dependencies> <!-- 這里很重要,限定了SpringBoot的依賴版本 --> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> </plugins> </build> </project>
2. 修改application.yml
spring: r2dbc: url: r2dbcs:mysql://localhost:3306/test username: root password: 123456
3. 創(chuàng)建實(shí)體類User
package cn.lazyfennec.webfluxdemo.model; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.Table; /** * @Author: Neco * @Description: * @Date: create in 2022/7/25 23:15 */ @Table("t_user") @Data @AllArgsConstructor @NoArgsConstructor public class User { @Id private Long id; private String name; }
4. 修改UserController
package cn.lazyfennec.webfluxdemo.controller; import cn.lazyfennec.webfluxdemo.dao.UserDao; import cn.lazyfennec.webfluxdemo.model.User; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.stream.IntStream; /** * @Author: Neco * @Description: * @Date: create in 2022/7/25 22:13 */ @RestController @Slf4j @AllArgsConstructor public class UserController { private final UserDao userDao; @GetMapping("user") public Flux<User> findAll(){ return userDao.findAll(); } @PostMapping("save") public Mono save(@RequestBody User user){ return userDao.save(user); } @DeleteMapping("user/{id}") public Mono delete(@PathVariable Long id){ return userDao.deleteById(id); } @GetMapping("user/{id}") public Mono findById(@PathVariable Long id){ return userDao.findById(id); } }
5. 啟動(dòng)類上方增加 @EnableR2dbcRepositories
package cn.lazyfennec.webfluxdemo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories; @SpringBootApplication @EnableR2dbcRepositories // 必須新增這個(gè) public class WebfluxDemoApplication { public static void main(String[] args) { SpringApplication.run(WebfluxDemoApplication.class, args); } }
6. 啟動(dòng)然后訪問相關(guān)網(wǎng)址測(cè)試
其實(shí)除了以上的方式之外,還有另外的方式,即handler 和 router (路由的)方式
新增以下兩個(gè)類
- UserHandler
package cn.lazyfennec.webfluxdemo.handler; import cn.lazyfennec.webfluxdemo.dao.UserDao; import cn.lazyfennec.webfluxdemo.model.User; import lombok.AllArgsConstructor; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; /** * @Author: Neco * @Description: * @Date: create in 2022/7/26 0:25 */ @Component @AllArgsConstructor public class UserHandler { private final UserDao userDao; //http://localhost:8080/save public Mono<ServerResponse> saveUser(ServerRequest request) { Mono<User> mono = request.bodyToMono(User.class); User user = mono.block(); return ServerResponse.ok().build(userDao.save(user).then()); } public Mono<ServerResponse> deleteUser(ServerRequest request) { Long id = Long.valueOf(request.pathVariable("id")); return ServerResponse.ok().build(userDao.deleteById(id).then()); } public Mono<ServerResponse> getUserbyId(ServerRequest request) { Long id = Long.valueOf(request.pathVariable("id")); Mono<User> mono = userDao.findById(id); return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(mono, User.class); } public Mono<ServerResponse> listUser(ServerRequest serverRequest) { Flux<User> userFlux = userDao.findAll(); return ServerResponse.ok().contentType(MediaType.APPLICATION_JSON).body(userFlux, User.class); } }
- UserRouter
package cn.lazyfennec.webfluxdemo.config; import cn.lazyfennec.webfluxdemo.handler.UserHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.web.reactive.function.server.RequestPredicates; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; /** * @Author: Neco * @Description: * @Date: create in 2022/7/26 0:27 */ @Configuration public class UserRouter { @Bean public RouterFunction<ServerResponse> routUser(UserHandler userHandler) { return RouterFunctions .route(RequestPredicates.GET("/user") .and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), userHandler::listUser) .andRoute(RequestPredicates.GET("/user/{id}") .and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), userHandler::getUserbyId) .andRoute(RequestPredicates.DELETE("/user/{id}") .and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), userHandler::deleteUser); } }
- 注釋掉UserController
訪問同樣的內(nèi)容
正常
Tips
官方并不建議使用mysql和webflux相結(jié)合,主要是事務(wù)方面會(huì)產(chǎn)生一定的問題。
關(guān)于webflux,在國內(nèi)其實(shí)會(huì)使用到的幾率并不是很大,所以大致了解一些簡(jiǎn)單的使用基本就可以了。
以上就是Spring-webflux訪問關(guān)系型數(shù)據(jù)庫實(shí)戰(zhàn)的詳細(xì)內(nèi)容,更多關(guān)于Spring-webflux訪問數(shù)據(jù)庫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解如何在SpringBoot項(xiàng)目中使用全局異常處理
在完整的項(xiàng)目開發(fā)中,異常的出現(xiàn)幾乎是無法避免的;如果凡是有可能出現(xiàn)異常的地方,我們都手動(dòng)的使用try-catch將其捕獲的話,會(huì)使得代碼顯得十分臃腫并且后期不好維護(hù)。本文介紹了pringBoot項(xiàng)目中使用全局異常處理的方法,需要的可以參考一下2022-10-10Java的Hibernate框架中復(fù)合主鍵映射的創(chuàng)建和使用教程
復(fù)合主鍵映射用起來比普通的增加主鍵字段要復(fù)雜,這里我們就來共同學(xué)習(xí)Java的Hibernate框架中復(fù)合主鍵映射的創(chuàng)建和使用教程,需要的朋友可以參考下2016-07-07springboot整合企微webhook機(jī)器人發(fā)送消息提醒
這篇文章主要為大家介紹了springboot整合企微webhook機(jī)器人發(fā)送消息提醒,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12IDEA如何一鍵部署SpringBoot項(xiàng)目到服務(wù)器
文章介紹了如何在IDEA中部署SpringBoot項(xiàng)目到服務(wù)器,使用AlibabaCloudToolkit插件進(jìn)行配置部署,步驟包括設(shè)置服務(wù)名稱、選擇文件上傳類型、選擇jar文件、添加服務(wù)器信息、輸入上傳路徑、選擇上傳后執(zhí)行的腳本以及執(zhí)行前的操作命令2024-12-12