专栏首页零基础自学Java【微服务】152:Stream流和通用mapper批量查询的使用

【微服务】152:Stream流和通用mapper批量查询的使用

学习计划安排如下:

  • 补充完昨天商品查询中关于分类和品牌的部分,其中牵扯到了两个非常重要的知识点:
  • Stream流的使用,这个学过后基本就没怎么使用过,这次做一个回顾。
  • 通用Mapper根据多个id批量查询,以前在写其使用教程的时候都不知道还有这种用法。

一、业务需求分析

昨天虽然完成了商品查询,但是其有一个问题,我们查询的数据是SPU,SPU中关于商品分类和品牌只是记录了其Id。

而在前端页面,我们需要显示商品分类和商品品牌对应的具体值。

有两种解决方法:

第一种:响应SPU中关于商品分类和品牌对应的id给前端,再分别根据id发送请求去数据库查询,这种对于前端人员来说就比较麻烦了。

第二种:在查询SPU时就分别查询出对应的商品分类和品牌,再将其数据一并响应给前端。

首先要在前端页面确定需要的字段名,分别为:cname和bname。

其次在SPU实体类中添加这两个属性,当然最正规的做法是重新创建一个实体类,这边为了方便就不这样做了。

使用注解@Transient将这两个属性设为瞬态,意思是从数据库查询时不考虑它们。

最后在查询完毕后通过setCname方法和setBname方法给它们赋值,再响应给前端。

二、Java代码编写

我们从SPU数据表中查询出了商品分类和品牌对应的id,再分别调用:

  • CategoryService中的代码查询商品分类。
  • BrandService中的代码查询商品品牌。

1Category业务代码补充

因为有多级商品分类,所以对应多个id。

根据多个id去数据库查询,如果是常规方法,会将这些id遍历,再一一去数据库查询。

但是在通用Mapper中,有selectByIdList()方法可以直接根据id集合完成批量查询。

只需要在Mapper层中继承IdListMapper接口并指定泛型即可。

同样的道理,有批量查询也会有批量新增:继承InsertListMapper接口并指定泛型即可。

2Brand业务代码说明

因为品牌不像商品分类有多级之分,一个商品就一个品牌,所以查询起来很方便。

使用通用mapper中的根据主键查询即可。

3Goods业务代码整合

上述两种查询方式,可以通过前端页面依次发送请求访问服务器实现查询。

但比较麻烦不太合适,所以我们要做的就是将上述两种查询方式整合到Goods业务中。

这样等于是只需要在前端发送一次请求,就对数据库完成了三次查询:

①spuList加工处理

spuList是从数据库中查询到的spu集合,这里对它的处理说白了就是:

依次调用spu的setBname方法和setCname方法给spu添加对应的商品分类和品牌。

②品牌的添加setBname方法

因为查询到的spu中有品牌对应的id,所以直接调用BrandService中的方法即可查询。

③商品分类的添加setCname方法

这个就比较复杂了,依次获取多级分类对应的id,使用Arrays的asList方法将其转换成集合,再调用CategoryService中的方法查询。

查询到的是一个商品分类集合,按照我们常规的方法就是:

遍历商品分类集合,然后逐一获取各个分类,再将这些分类用“/”拼接起来。

这样自然也是可以的,但是使用Stream流更加地方便,Stream流是jdk8的新特性。

我们看上述图中关于Stream流的注释,都有很清楚的说明,依次调用:

  • steam()方法将其转换成Category的流。
  • map()方法将其转换成了字符串的流。
  • 什么字符串呢?就是Category中的getName方法。
  • collect()方法完成流的收集,即流结束了。
  • 其中Collectors.joining("/")是表示将收集到的数据以“/”完成拼接。

三、测试

代码编写完毕,做一个测试:

再次查询商品列表,会发现,商品分类和品牌就都显示出来了。

其中商品分类因为是多级分类,所以用“/”隔开,这就是在Stream流中设置的。

最后

行有不得反求诸己,我是@刘小爱

一个白天上班晚上学习的95后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。

本文分享自微信公众号 - 刘小爱(liuxiaoai946),作者:刘小爱

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【JavaWeb】64:多表查询详解

    万万没有想到,学个数据库竟然还能接触到笛卡尔积?后面不会学着学着还会出现牛顿吧……

    刘小爱
  • 【框架】118:mybatis之多表高级查询

    又要提到前面那个说了好几遍的起别名问题了,使用resultMap标签也能解决这个问题。

    刘小爱
  • 【微服务】159:Elasticsearch的使用

    昨天我们给索引库设定了几个字段,以上述例子中的title字段为例,给其添加一条数据“小爱手机”,这样后面可以通过索引库来快速定位这条数据了。

    刘小爱
  • GUN 意思

    http://blog.csdn.net/luoweifu/article/details/50153461

    bear_fish
  • 渗透利器 | 提权辅助工具箱

    作为技术宅的我,日常最大的爱好就是逛论坛。某日看到论坛里有一款基于主机的漏洞扫描工具,用来查找主机上公开EXP的CVE。嗯嗯,我想还是叫提权辅助工具可能会更顺口...

    Bypass
  • Jupyter插件安装及其虚拟多环境创建

    jupyter contrib nbextension install --user

    卡尔曼和玻尔兹曼谁曼
  • 【STM32H7教程】第38章 STM32H7的LPTIM低功耗定时器应用之超时唤醒

    完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980

    armfly
  • dotnet OpenXML 元素 cNvPr NonVisual Drawing Properties 的属性作用

    本文收集元素属性 cNvPr Non-Visual Drawing Properties 的属性的作用

    林德熙
  • 如何使用jMeter对某个OData服务进行高并发性能测试

    For project reason I have to measure the performance of OData service being acce...

    Jerry Wang
  • 如何使用jMeter对某个OData服务进行高并发性能测试

    For project reason I have to measure the performance of OData service being acce...

    Jerry Wang

扫码关注云+社区

领取腾讯云代金券