使用通用mapper实现条件查询_【微服务】152:Stream流和通用mapper批量查询的使用...
今天是劉小愛自學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后滬漂,不為其它,只為學會自律做好自己,也愿我的每日打卡能給你帶來勇氣,歡迎點贊關注和評論。
總結
以上是生活随笔為你收集整理的使用通用mapper实现条件查询_【微服务】152:Stream流和通用mapper批量查询的使用...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: axios vue 加载效果动画_vue
- 下一篇: c++代码整洁之道pdf_别再问如何用p