范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

用WebFlux写个CURD是什么体验?

  今天我们继续来搞 WebFlux!
  WebFlux 最为人所诟病的是数据库的支持问题,毕竟数据是一个应用的生命,我们接触的大部分应用程序都是有数据库的,而 WebFlux 在这一方面的支持行一直比较弱,这也是大家总是吐槽它的原因。
  不过从 Spring5 开始,这一问题得到了一定程度的缓解。
  Spring 官方在 Spring5 发布了响应式 Web 框架 Spring WebFlux 之后急需能够满足异步响应的数据库交互 API,不过由于缺乏标准和驱动,Pivotal 团队开始自己研究响应式关系型数据库连接 Reactive Relational Database Connectivity,并提出了 R2DBC 规范 API 用来评估可行性并讨论数据库厂商是否有兴趣支持响应式的异步非阻塞驱动程序。最早只有 PostgreSQL 、H2、MSSQL 三家数据库厂商,不过现在 MySQL 也加入进来了,这是一个极大的利好。目前 R2DBC 的最新版本是 0.9.0.RELEASE。
  松哥在接下来的文章中将会和大家演示 R2DBC 的用法,但是今天我们还是先来看看 WebFlux+MongoDB 的用法,毕竟这是 WebFlux 较早支持的数据库之一,各种 API 都比较成熟,我们一步一步来。  1.项目创建
  方便起见,我们这里就直接创建 Spring Boot 项目,首先创建一个 Spring Boot 项目,引入 MongoDB 依赖和 WebFlux 依赖,如下:
  注意我们这里选择的 MongoDB 依赖是 Spring Data Reactive MongoDB,千万别选错了。
  项目创建完成后,我们先在 application.properties 中对 MongoDB 进行简单配置,如下(如果小伙伴们尚不熟悉 MongoDB 的操作,可以在公众号底部菜单找到松哥原创的 MongoDB 教程):  spring.data.mongodb.port=27017 spring.data.mongodb.host=127.0.0.1 spring.data.mongodb.username=madmin spring.data.mongodb.password=m123 spring.data.mongodb.database=test spring.data.mongodb.authentication-database=admin
  多说一句,在之前的 Spring Boot 视频教程中,松哥对 MongoDB 也有过介绍,感兴趣的小伙伴戳这里:Spring Boot+Vue+微人事视频教程。
  配置完 MongoDB 后,我们的准备工作就算完成了。  2.实体类与 Dao
  接下来我们需要准备一个操作的实体类,这些都是 JPA 的基本操作,松哥就不再赘述,如果小伙伴们不熟悉的话,可以公号后台回复 666 查看原创的 Spring Boot 教程,里边有涉及到,实体类如下:  @Document public class User {     @Id     private String id;     private String username;     private String address;      public String getId() {         return id;     }      public void setId(String id) {         this.id = id;     }      public String getUsername() {         return username;     }      public void setUsername(String username) {         this.username = username;     }      public String getAddress() {         return address;     }      public void setAddress(String address) {         this.address = address;     } }
  接下来我们再提供一个实体类操作的接口,如下:  @EnableMongoRepositories public interface UserDao extends ReactiveMongoRepository { }
  自定义一个空的接口继承自 ReactiveMongoRepository,里边什么都不用写,这套路就和松哥之前视频中介绍的 JPA 的用法如出一辙(毕竟都是 Spring Data 家族),所以这块就没啥好说的,不赘述。  3.测试接口
  接下来我们来看看测试接口。  3.1 添加
  首先我们来看看添加数据。  @RestController @RequestMapping("/user") public class UserController {     @Autowired     UserDao userDao;      @PostMapping("/")     public Mono addUser(@RequestBody User user) {         return userDao.save(user);     } }
  添加完成后,返回刚刚添加成功的对象。save 方法的返回值就是 Mono。
  我们来看看测试效果:
  3.2 查询
  再来看看查询效果:  @GetMapping("/") public Flux getAll() {     return userDao.findAll(); } @GetMapping(value = "/stream/all", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux streamGetAll() {     return userDao.findAll(); }
  我们提供了两个查询接口,一个就是返回 Flux,里边包含多个对象,还有一个我设置了响应的 Content-Type 为 text/event-stream,通过响应式流返回数据,具体参见【服务端推送数据,除了 WebSocket 你还能想到啥?】一文。
  我们来看看查询效果:
  可以看到两种不同的查询方式返回的数据格式也有差异。前者是以数组形式一次性返回数据,后者是以 SSE 的形式多次返回数据。  3.3 删除
  再来看看删除。
  按照 RESTful 规范,如果删除成功请求响应码就是 200,如果删除失败请求响应码就是 404,因此,我们开发出来的接口如下:  @DeleteMapping("/{id}") public Mono> deleteUser(@PathVariable String id) {     return userDao.findById(id)             .flatMap(user -> userDao.delete(user).then(Mono.just(new ResponseEntity(HttpStatus.OK))))             .defaultIfEmpty(new ResponseEntity(HttpStatus.NOT_FOUND)); }
  首先从数据库中查询出相关的数据,然后调用 flatMap,在 flatMap 中对数据进行删除处理,删除完成后,给出一个 200 的响应码,如果查询的时候没有查询到数据,就给一个 404 响应码。
  可以看到,删除成功后,响应码为 200:
  删除失败后,响应码为 404:
  3.4 修改
  再来看看修改,和前面的删除类似,先查询,再修改:  @PutMapping("/") public Mono> updateUser(@RequestBody User user) {     return userDao.findById(user.getId())             .flatMap(u -> userDao.save(user))             .map(u->new ResponseEntity(u,HttpStatus.OK))             .defaultIfEmpty(new ResponseEntity(HttpStatus.NOT_FOUND)); }
  如果修改的数据不存在的话,就会给出一个 404 响应:
  3.5 自定义查询方法
  松哥之前的 Spring Data Jpa 中讲的一些查询 API,这里同样是适用的(公号后台回复 666 获取之前的教程)。
  例如我们可以在 UserDao 中自定义一个查询方法:  @EnableMongoRepositories public interface UserDao extends ReactiveMongoRepository {     Flux findUserByUsernameContaining(String name); }
  然后添加一个接口调用该方法:  @GetMapping("/byname") public Flux getUserByName(String name) {     return userDao.findUserByUsernameContaining(name); }
  这样该接口就可以查询名字中包含某关键字的所有用户了。
  其他关于 JPA 的用法这里都是适用的,因为在之前的文章中讲过,松哥这里就不再赘述了。  4.小结
  好啦,今天我们就用 WebFlux 写了一个简单的 CURD,大家先来感受下 WebFlux 的基本用法,后面的文章将和大家分享 WebFlux 如何连接关系型数据库,敬请期待。
  原文链接:https://mp.weixin.qq.com/s/KUDS8ss6BRIkMW_wjCe_Yg

王者峡谷之老亚瑟我叫亚瑟,你可以叫我老亚瑟,也可以叫我瑟哥,只是千万不要叫我瑟瑟。话说,那是一个秋天,我来到一个叫做王者峡谷的地方,一个陌生又让我终生难忘之地。那一天,乌云密布,电闪雷鸣。那一天,当世界霸主汇聚重返帝国,华夏文明阵营才是顶配?当世界上所有的英雄汇聚于一个时代,到底谁才是最后的霸主?相信不少人都有过这样的疑问,而现在重返帝国这款以中世纪和多文明为背景的策略手游出现了。在这款游戏里,英雄的原型均致敬了历史上2022年Switch最值得期待的独占游戏推荐星之卡比探索发现2022年3月25日星之卡比探索发现画风呆萌可爱,在玩法上则采用了与早期NS佳作马里奥奥德赛相似的开放世界设计,从游戏宣传短片来看,卡比新作依旧秉承了任天堂超强的关将门虎女吕玲绮,吕布的女儿可不是跟你嘻嘻哈哈的,人家有真本事将门虎女吕玲绮,吕布的女儿可不是跟你嘻嘻哈哈的,人家有真本事三国杀移动版本期小叮当要给大家带来的是民间扩展包,出林乳虎当中吕布的女儿吕玲绮,这个女子小叮当认为,在当时的那个时代应该补位AD怎么办?只见炸弹不见人,传送吉格斯玩法解析英雄联盟的补位机制在游戏的高分段是一个比较令人头疼的地方,因为高分段人数不算多,同时精通两个甚至3个位置的人并不多,也就是常说的其他位置达不到当前段位水平。尤其是面对下路ADC补位LCK赛程疑似曝光,Faker率T1迎战KDF,GEN直面DK时至凌晨,2021年临近尾声,在新春佳节到来前,2022LPL春季赛LCK春季赛将陆续掀开神秘的面纱,与热爱LOL职业赛事的观众重逢。蓄势待发的LOL顶尖强队有许多,比如手握LOL火柴燃不尽,战斗无止境!火柴人觉醒之路火柴人系列曾火爆全网,吸引很多玩家的注意。8月18日火柴人觉醒将上线,这款火柴人新作延续国漫剪影风,或将打造全新的放置卡牌手游。火柴人IP发展之路从联盟到觉醒火柴人最初是以flasDNF毕业附魔卡片减价7000多万,终于可以给我的恍惚上附魔了啦啦啦,我是你们的知墨小弟。我说的其实是下面这张卡,18属强的卡片,在上个版本堪称毕业附魔的存在。当然价格也非常贵要8000万,不过最近在各种新卡片的冲级下,这张卡片断崖式掉价,现分享一下武侠乂这款手游在这吃鸡流行的时间段,国产武侠出了武侠乂(yi),这也是也很期待的,毕竟现在还是很流行快餐游戏,相比较其他武侠题材游戏,升级装备漫无目的逛野区,氪金,让人感到很反感,而这部作品就是春季赛让人意外的队伍盘点,V5让人惊喜,BLG战队让人无语在EDG战队夺冠之后,LPL赛区的各大战队也开始了转会期,而转会期结束之后,很多战队也都完成了重组,其中有些战队更是来了一次大换血,春季赛赛程已经过半,在春季赛中最让人意外的队伍都原神止水之潘任务怎么做原神止水之潘任务流程原神止水之潘任务怎么做?原神止水之潘是最近开启的新任务玩法,这次的任务是需要我们触发的,具体的触发条件大家应该都不清楚吧,下面就带来了止水之潘任务触发的具体攻略,还不清楚的话就一起
英雄联盟lol冷知识大揭秘全联盟居然只有六个英雄没有控制!你知道都是谁吗?英雄联盟中每个英雄都有其独特的技能以及英雄的侧重点,不同的技能对应着不同的侧重点,一般高伤害英雄其控制就会比较不稳定,而坦克英雄大多数拥有一个或者多个控制。英雄联盟中有哪些英雄没有魔兽世界总监表示希尔瓦娜斯只是单纯的喜欢杀人,证实希女王实锤为反派了吗?魔兽世界的创意总监在早前的采访内容中确实有一句从目前的剧情走向看,希尔瓦娜斯只是单纯的喜欢杀人,其实这从8。0的前夕内容火烧泰达希尔的时候就已经看的出来了,火烧泰达希尔确实是希女王AKM在绝地求生中很受欢迎吗,为什么一些高端局队友都是人手一把AKM?现在在绝地求生武器改版后,AKM确实是最受欢迎的一把步枪。在没改版前,满配下的M416不管是性能还是稳定性都是最强的,因此当时也被大家称为神枪。不过随着改版后,很多武器的后坐力都增王者荣耀还有五天赛季就结束了,大结局的哪些英雄会崛起?大家都知道,王者荣耀的s8赛季就要结束了,很多人都在冲分了把?那么究竟哪些英雄好冲分呢?我们来根据目前的胜率和大家形态说明下吧。首先我们要知道,赛季末冲分的什么人最多,肯定有一些平S11小组赛首轮比赛结束,国外网站公布各大赛区夺冠赔率,LPL登顶近日,英雄联盟S11全球总决赛小组赛的第一轮比赛已经全部结束。在首轮比赛中,我们LPL赛区取得了10胜2负的好成绩,而LCK则是8胜4负,战绩也非常不错,反倒是欧美赛区这次的成绩有SKT历任上单中,最菜的选手和最强的选手是谁?木不团,马不蹦,杜不传,胡不肉?Impact由于面部肌肉神似某明星,被粉丝们称为东尼大木,简称大木!SKT一代目上单,世界级荣誉s3世界冠军。线上打法凶悍,不喜欢打团战,三局贾克斯DNF现阶段最完美的装备搭配是什么?要谈到完美的装备搭配,在没有超时空的时候,感觉大多数玩家都不会纠结,因为必定是本命B套恍惚套海博伦作为标准的毕业套,而出现超时空之后,有了右面的五件套和三件套属性,这之后搭配就出现火影手游团购忍者强度排名是怎样的?目前火影忍者手游里一共有六名团购忍者,分别是普通角都地怨虞角都团藏年轻三代忍战勘九郎和秽土阿斯玛,这里面强度比较高的基本上就是忍战勘九郎和秽土阿斯玛,按照我的个人排序应该是这样的。英雄联盟打上王者段位跟考上清华北大哪个更有难度?先说结论,清华北大更难然后,这两者根本就没有可比性,如果把王者段位换成职业选手可能还有的比,为什么呢?1。lol总人数算的是所有年龄段,而高考总人数只算了同岁的,很明显基数不对称。LOL职业比赛队伍不能超过两名外援,这个规定竟与当年的神超有关,怎么评价?很多人知道一个队伍不能超过两名外援这个拳头的规定,但是少有人知道这个规定其实是和中国选手神超有很大的关系。那么是什么原因促使了拳头颁布了这个规定呢?LMQ的诞生说到外援的事情就不得听说各种手游里都有一种职业者,叫做托,这个托到底要怎么去当?找游戏商申请吗?说一下,之前我在58同城找了一份工作就是手游推广员,看着招聘条件还不错,除了玩游戏就是玩游戏。就去面试了。刚开始也不懂,甚至不知道工作内容,反正就是看那些人坐电脑前打游戏,同时还挂