今天是刘小爱自学Java的第152天。
感谢你的观看,谢谢你。
学习计划安排如下:
补充完昨天商品查询中关于分类和品牌的部分,其中牵扯到了两个非常重要的知识点:
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后沪漂,不为其它,只为学会自律做好自己,也愿我的每日打卡能给你带来勇气,欢迎点赞关注和评论。
领取专属 10元无门槛券
私享最新 技术干货