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的类似实现更好。