Spring Boot整合WebFlux + R2DBC+Mysql
1、R2DBC介绍
R2DBC 基于 Reactive Streams 反应流规范,它是一个开放的规范,为驱动程序供应商和使用方提供接口( r2dbc-spi ),与 JDBC 的阻塞特性不同,它提供了完全反应式的非阻塞 API 与 关系型数据库 交互。 简单说, R2DBC 项目是支持使用反应式编程 API 访问关系型数据库的桥梁,定义统一接口规范,不同数据库厂家通过实现该规范提供驱动程序包。 同时, r2dbc 还提供反应式连接池r2dbc-pool 具体了解可以参考下面连接: https://cloud.tencent.com/developer/article/1741470
2、maven依赖
<!- 使用webFlux可以不需要在加载spring web依赖 -->
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-r2dbc</artifactId>
</dependency>
<dependency>
<groupId>dev.miku</groupId>
<artifactId>r2dbc-mysql</artifactId>
</dependency>
3、Spring Boot配置
spring:
r2dbc:
# 使用serverTimezone在控制台打印时间会出现乱码情况但不影响程序运行,翻阅资料之后换成serverZoneId可以解决这种问题。
# url: r2dbc:mysql://localhost:3306/数据库?serverTimezone=GMT%2b8&characterEncoding=UTF-8
url: r2dbc:mysql://localhost:3306/数据库?serverZoneId=GMT%2b8&characterEncoding=UTF-8
username: #用户名
password: #密码
4、Spring webFlux
Spring WebFlux在使用的时候其实和MVC形式基本是差不多的,但是更倾向于Mybatis-plus
和JPA形式的编码方式,所以在使用的时候就更加简单,一些基本的增删改查的接口是不用我们
自己再去xml里写入,通过继承ReactiveSortingRepository<?,?>来进行基本的接口调用。
5、代码整合(测试代码)
注:这里只是简单介绍如何连接mysql数据库进行增删改查操作,如果想深入了解可自行去官网查找资料进行学习,
本文章就不在进行详细描述和编码。
5-1、Entity
@Data
@Table("student")
public class Student implements Serializable {
@Id
private Long id;
private String code;
private String name;
private String gender;
private String address;
private Integer active;
}
5-2、Controller
@RestController
@RequestMapping("/test/webflux")
public class SpringWebFluxController {
@Autowired
SpringWebFluxService springWebFluxService;
/** Flux和Mono区别
* Flux发送出0~N个
* Mono发送出0~1个
* 请自行百度学习具体区别
*/
/** 测试r2dbc连接mysql数据库-查询 */
@GetMapping("/testR1")
public Flux<Student> Test(){
return springWebFluxService.findAll();
}
/** 测试r2dbc连接mysql数据库-新增 */
@PostMapping("/testR3")
public Mono<Student> Test2(@RequestBody Student student){
System.out.println(student);
return springWebFluxService.insertDefined(student);
}
5-3、serviceImpl
@Service
public class SpringWebFluxServiceImpl implements SpringWebFluxService {
@Resource
SpringWebFluxMapper springWebFluxMapper;
//查询
@Override
public Flux<Student> findAll() {
return springWebFluxMapper.findAll();
}
//新增
@Override
public Mono<Student> insertDefined(Student student) {
return springWebFluxMapper.insertDefined(student);
}
}
5-4、mapper
@Repository
public interface SpringWebFluxMapper extends ReactiveSortingRepository<Student,Long> {
/**
* 对象形式传参::#{#对象名.字段名}
* 字段传参::字段名(@param定义)
* 复杂查询同理
*/
@Modifying
@Query("insert into student(code,name,gender,active,address) values(:#{#student.code},:# {#student.name},:#{#student.gender},:#{#student.active},:#{#student.address})")
Mono<Student> insertDefined(Student student);
}
结尾
到这就算是结束了,想要更深入了解可自行查阅资料
在高并发下,Spring MVC + JDBC的响应时间开始下降。显然,R2DBC在更高的并发性下提供了更好的响应时间。Spring WebFlux也比使用Spring MVC的类似实现更好。