看这个需要看我以前分享了很多WebFlux的知识哦 好啦,开始今天的正文。 前面我们用WebFlux已经写了一个CURD了,不过数据库用的是MongoDB。很多人对WebFlux持怀疑态度,包括松哥之前发文章的时候,还有人在说不能连接MySQL的WebFlux是没有任何意义的!这句话没错,但是我们也要看到WebFlux正处于一个高速发展的时期,所有不可能的事情都会变得可能,所有以前没有的功能以后都会有,WebFlux的变化速度是肉眼可见的。 比如我们今天要介绍的R2DBC就能在一定程度上打消一些人的疑虑,虽然这个工具还不是特别完美,但是我们看到了WebFlux在努力解决这些存在的问题,我们也有理由相信WebFlux未来会越来越好。 好啦,不吹了,还是来看点实际的东西吧。1。什么是R2DBC? 首先大家要知道,我们最常使用的JDBC其实是同步的,而我们使用WebFlux的目的是为了通过异步的方式来提高服务端的响应效率,WebFlux虽然实现了异步,但是由于JDBC还是同步的,而大部分应用都是离不开数据库的,所以其实效率本质上还是没有提升。 那么怎么办呢?有没有异步的JDBC呢?有! 目前市面上异步JDBC主要是两种:ADAB:ADBA是Oracle主导的Java异步数据库访问的标准API,它将会集成于未来的Java标准发行版中。但是目前发展比较慢,只提供OpenJDK的沙盒特性供开发者研究之用。R2DBC:R2DBC是Spring官方在Spring5发布了响应式Web框架SpringWebFlux之后急需能够满足异步响应的数据库交互API,不过由于缺乏标准和驱动,Pivotal团队开始自己研究响应式关系型数据库连接ReactiveRelationalDatabaseConnectivity,并提出了R2DBC规范API用来评估可行性并讨论数据库厂商是否有兴趣支持响应式的异步非阻塞驱动程序。最早只有PostgreSQL、H2、MSSQL三家数据库厂商,不过现在MySQL也加入进来了,这是一个极大的利好。目前R2DBC的最新版本是0。9。0。RELEASE。 需要注意的是,这两个都不是对原来JDBC的补充,都是打算重新去设计数据库访问方案! 好了,现在大家对R2DBC有一个基本的认知了,接下来我们就通过一个简单的例子,我们一起来体验一把如何通过R2DBC来操作MySQL数据库。2。代码实践2。1创建项目 首先我们来创建一个SpringBoot项目,引入WebFlux和R2DBC依赖,如下图: 项目创建成功后,pom。xml文件中会自动加入R2DBC相关的依赖,如下:dependencygroupIdorg。springframework。bootgroupIdspringbootstarterdatar2dbcartifactIddependencydependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebfluxartifactIddependencydependencygroupIddev。mikugroupIdr2dbcmysqlartifactIdscoperuntimescopedependencydependencygroupIdmysqlgroupIdmysqlconnectorjavaartifactIdscoperuntimescopedependency 接下来我们在application。properties中配置数据库的连接信息,注意这次的配置和之前的有些不同:spring。r2dbc。urlr2dbcs:mysql:localhost:3306test01spring。r2dbc。usernamerootspring。r2dbc。password123 配置文件除了属性的key不同之外,数据库的连接协议也从jdbc变为r2dbc了。 OK,如此,我们的准备工作就算完成了。2。2数据库脚本 我们准备一个简单的数据表,如下: 这个脚本很简单,应该不用我提供了吧。2。3CURD 我们首先来提供一个实体类,如下:publicclassUser{IdprivateLongid;privateStringusername;privateStringaddress;省略gettersetter} 然后我们需要一个UserRepository接口,这个接口直接继承自ReactiveCrudRepository即可,这跟之前MongoDB的玩法比较类似。publicinterfaceUserRepositoryextendsReactiveCrudRepositoryUser,Long{} 接下来我们来定义User表的处理器,这个也跟之前MongoDB中的差不多,如下:importstaticjava。lang。Long。parseLong;importstaticorg。springframework。http。MediaType。APPLICATIONJSON;importstaticorg。springframework。web。reactive。function。server。ServerResponse。notFound;importstaticorg。springframework。web。reactive。function。server。ServerResponse。ok;ComponentpublicclassUserHandler{AutowiredUserRepositoryuserRepository;publicMonoServerResponsegetAllUsers(ServerRequestserverRequest){returnok()。contentType(APPLICATIONJSON)。body(userRepository。findAll(),User。class);}publicMonoServerResponseaddUser(ServerRequestserverRequest){returnok()。contentType(APPLICATIONJSON)。body(userRepository。saveAll(serverRequest。bodyToMono(User。class)),User。class);}publicMonoServerResponsedeleteUser(ServerRequestserverRequest){returnuserRepository。findById(parseLong(serverRequest。pathVariable(id)))。flatMap(useruserRepository。delete(user)。then(ok()。build()))。switchIfEmpty(notFound()。build());}} 最后我们再来配置请求地址路由,如下:ConfigurationpublicclassRouterConfiguration{BeanRouterFunctionServerResponseuserRouterFunction(UserHandleruserHandler){returnRouterFunctions。nest(RequestPredicates。path(user),RouterFunctions。route(RequestPredicates。GET(),userHandler::getAllUsers)。andRoute(RequestPredicates。POST(),userHandler::addUser)。andRoute(RequestPredicates。DELETE({id}),userHandler::deleteUser));}} 这一块其实都没啥好说的,如果大家感到困惑,可以参考我们前两篇文章中的讲解。用WebFlux写个CURD是什么体验?WebFlux中的请求地址路由怎么玩?3。测试 最后我们来简单测试下。 查询: 添加: 更新: 有id并且id已经存在,默认就是更新。 删除: 删除成功响应200: 删除成功响应200 删除失败响应404: 删除失败响应404 好啦,这就是一个简单的WebFlux操作关系型数据库的案例 原文链接:https:mp。weixin。qq。comsBq3ECq7LVvT2AqFygdy6tQ