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

用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

魔兽世界(正式服)PTR9。2内容汇总暗影国度在经历暗影界4大国度噬渊刻西亚后,将在明年迎来版本最后一次更新,即9。2永恒的终结,新地图扎雷殁(m)提斯,及暗影国度最终挑战击杀典狱长的新团本初诞者的圣墓。一新地图扎雷殁迎接LPL春季赛,TES小鹏放出狠话,Rank战绩不容小觑夜幕降临,LOL德杯落幕后,卧虎藏龙的LPL赛区进入短暂的休赛期,17支战队蓄势待发,静候2022LPL春季赛的到来。值得观众期待的劲旅不在少数,包括闯入德杯决赛的小凤凰FPX处于2021年末如何度过?不如就来坦克世界与自己心爱的坦克一起圆梦有的车长觉得有没有一种可能就是在坦克世界与自己心爱的坦克一起抓住2021年的尾巴呢?坦克世界官方回应这这简直就是小菜一碟,坦克世界假日行动说来就来,踩着岁末的尾巴,让我们一起加入坦拂晓的拾荒团手游拂晓的拾荒团手游是由朝露工作室研发的一款废土拾荒冒险手游,在这片轻松欢快的荒原大陆上,玩家将作为拾荒小队的一员,与伙伴们一起发掘物资,探索美食,将追寻生存的意义传进更多幸存者的心里梦幻团建赛震撼来袭,李九居居同台解说,剑仙寂然跨世纪合作王者荣耀的人气一直高居不下,在英雄联盟手游崛起后也未曾有过下降的趋势。这主要是因为各大直播平台的王者荣耀板块诞生了很多位优秀的主播,比如家喻户晓的剑仙寂然等等。而在直播平台的更迭中德杯预示版本走向,得后期者得天下?拳头硬才是硬道理24日的德杯半决赛对决中,转会期失去了多名主力的IG在面对滔搏时难以抵挡,滔搏以3比0的比分击败了IG,挺进决赛。本场比赛,有个人能力的体现,也是队伍版本适应力的体现。得后期者得天艾尔多战记平民阵容搭配攻略艾尔多战记平民阵容怎么搭配?艾尔多战记平民阵容推荐什么?艾尔多战记平民阵容怎么选择?艾尔多战记阵容搭配非常重要,但是有很多玩家都不知道应该怎搭配,那么这个游戏重点是阵容搭配的思路,碧蓝幻想光方初见FS多职业攻略作者NGAasagiriaria一前言在看到很多FS攻略后,发现通常大部分都是建立在很清楚特动表的前提下进行解说,虽然这样比较节省阅读时间(对于已经熟悉的人而言)。但对于正要拿第一体验服8名英雄强度调整,后羿大幅度加强,养猪流怕是要回来了最近官方也是对体验服里面的英雄进行频繁的调整,毕竟正式服离新版本越来越近了,这一次官方对体验服的八名英雄进行调整,他们的强度将会在新赛季与大家见面。首先这八个英雄当中有一个是专精装体验服英雄调整老虎喜提加强,边路女王芈月又回来了随着S26赛季的临近,体验服对于英雄的调整也是日益频繁,昨日对6名英雄进行了或多或少的调整,一起来看看有没有你的本命英雄吧。一裴擒虎调整内容如下人形态二技能效果调整攻速提升持续5秒英雄联盟小鱼人背景介绍菲兹潮汐海灵在久远的过去,符文之地的海洋便远在陆地之前孕育了文明。如今被称为守望者之海的深处曾经存在过一座宏伟的城市也是约德尔人菲兹定居的地方。他与这个高傲尊贵的族群中的工匠和战士
王者荣耀英雄调整,雅典娜被动重做可控制对手,铠加强典韦削弱相信小伙伴们都知道王者荣耀每次到了新版本就会有不少的英雄调整,那么这次都有哪些英雄变化呢?赶紧来看看吧!首先变化最大的就是雅典娜。雅典娜这个英雄现在已经非常下水道了,几乎没有人使用DNF鸟背地图能爆出苍穹幕落武器吗?你爆过吗?谢谢这位朋友的邀请!我非常明确的告诉你,DNF鸟背地图,打死BOSS通关后,会掉落所有的泰波尔斯系列装备,包括苍穹幕落武器!通常,我们在通关鸟背后,会翻牌获得30个苍穹碎片,913魔兽世界有哪些传说武器?谢邀。作为一家著名视频游戏制作和发行公司,暴雪公司塑造了一个拥有自己世界观的世界魔兽世界。在这个世界里,充满了英雄的传说。传说武器伴随着这些英雄流传了下来,成为了传说。那么废话不多哈利波特手游虎牙杀戮探索双子全新可能,偶遇风小团惨遭针对哈利波特手游是目前很火的一款游戏,随着游戏不断的更新,玩家们可以体验到越来越多游戏内容。最近这段时间比较火的套路是比多,不过比多并不是大家唯一的选择。哪怕是强悍的比多,也是可以被击DK中野降薪留队后,Nuguri临时变卦?牛宝被LCK网友骂惨了相信大家都已经听说了DK中野续约的消息了,不得不说DK这波操作属实让不少粉丝和水友都没有想到,毕竟在此之前手握数亿薪资的T1是一副势在必得的架势,而如今DK不知道用了什么手段竟然留48岁老阿姨有多强?玩DOTA2堵泉水被杀70次,还能夸对面打得好大家好,这里是正惊游戏,我是爱吃瓜的正惊小弟。在为什么不Ban猛犸事件爆发后,这届最像是菠菜的Ti10世界赛,让不少刀圈老玩家倍感失望,当场卸载游戏的都大有人在。只不过,在这股全民LCK转会炸锅faker天价续约,Nuguri被T1和DK争抢想造战舰小伙伴们大家好,欢迎阅览本期电竞资讯,我是小昊!相信有关注电竞动态的小伙伴都知道,这届LOL冬季转会已经正式开始了,由于这次转会期每个赛区都有明星选手合同到期,所以这次转会期内容是王者荣耀被叫3年外号的装备,现在你还知道几个真名?在王者荣耀中有很多的装备,都被玩家们冠上了其特有的名字。一些老玩家们,对于很熟悉的装备,都是以外号作为简化。这些外号言简意赅的描述出了装备的特性,并且朗朗上口。不过,面对这些,被叫Uzi加入BLG后,LPL解说伞皇也宣布复出,他是啥水平的选手?这几天,Uzi去哪里的事情基本上是尘埃落定了。但没有想到的是,除了Uzi,昔日LPL的顶级下路选手伞皇也宣布复出的消息。当然伞皇目前还是处于在寻找队伍的状态中,以他的话来说,如果试SK深夜发博后续还有轮换!TTG心态小崩,诺言Alan又要来了?2021年KPL秋季赛常规赛已经进入尾声,在estarpro以3比0的大比分战胜GK之后,这赛季第一支提前锁定季后赛胜者组的队伍诞生了,他就是estarpro!不得不说,estar高段位游戏体验还得靠游戏电视毫无疑问,随着科技的发速发展,游戏电视应运而生。目前来讲游戏电视可以说是非常热门,在我看来,游戏电视市场蓬勃快速发展的原因在于其能为玩家带来高段位的游戏体验。首先,对于游戏玩家来说