Spring-webflux訪問關系型數(shù)據(jù)庫實戰(zhàn)
1. pom.xml引入
主要是支持在響應式的環(huán)境下對關系型數(shù)據(jù)庫進行訪問
<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>
注意: 這里對于SpringBoot的版本似乎是有一些要求的,為了避免遇到無法正常啟動的情況,建議使用版本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)建實體類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. 啟動類上方增加 @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 // 必須新增這個 public class WebfluxDemoApplication { public static void main(String[] args) { SpringApplication.run(WebfluxDemoApplication.class, args); } }
6. 啟動然后訪問相關網址測試
其實除了以上的方式之外,還有另外的方式,即handler 和 router (路由的)方式
新增以下兩個類
- 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
訪問同樣的內容
正常
Tips
官方并不建議使用mysql和webflux相結合,主要是事務方面會產生一定的問題。
關于webflux,在國內其實會使用到的幾率并不是很大,所以大致了解一些簡單的使用基本就可以了。
以上就是Spring-webflux訪問關系型數(shù)據(jù)庫實戰(zhàn)的詳細內容,更多關于Spring-webflux訪問數(shù)據(jù)庫的資料請關注腳本之家其它相關文章!
相關文章
Java的Hibernate框架中復合主鍵映射的創(chuàng)建和使用教程
復合主鍵映射用起來比普通的增加主鍵字段要復雜,這里我們就來共同學習Java的Hibernate框架中復合主鍵映射的創(chuàng)建和使用教程,需要的朋友可以參考下2016-07-07springboot整合企微webhook機器人發(fā)送消息提醒
這篇文章主要為大家介紹了springboot整合企微webhook機器人發(fā)送消息提醒,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12