Controller
@RestController
@CrossOrigin
@RequestMapping("/itemCat")
public class ItemCatController {
@Autowired
private ItemCatService itemCatService;
/**
* 需求: 查詢3級商品分類清單資訊
* URL: /itemCat/findItemCatList/{level}
* 參數: level 查詢的層級
* 傳回值: SysResult對象(List<ItemCat>)
*/
@GetMapping("/findItemCatList/{level}")
public SysResult findItemCatList(@PathVariable Integer level){
List<ItemCat> itemCatList = itemCatService.findItemCatList(level);
return SysResult.success(itemCatList);
}
/**
* 業務需求: 實作狀态的修改
* 1.URL: /itemCat/status/{id}/{status}
* 2.請求類型: put
* 3.傳回值: SysResult對象
*/
@PutMapping("/status/{id}/{status}")
public SysResult updateStatus(ItemCat itemCat){
itemCatService.updateStatus(itemCat);
return SysResult.success();
}
/**
* 需求: 實作商品分類入庫
* URL: /itemCat/saveItemCat
* 類型: post類型
* 參數: itemCat對象~~~JSON
* 傳回值: SysResult
*/
@PostMapping("/saveItemCat")
public SysResult saveItemCat(@RequestBody ItemCat itemCat){
itemCatService.saveItemCat(itemCat);
return SysResult.success();
}
/**
* 商品分類删除操作
* URL: /itemCat/deleteItemCat?id=1&level=3
* 類型: delete
* 參數: id/level
* 傳回值: SysResult對象
*/
@DeleteMapping("/deleteItemCat")
public SysResult deleteItemCat(Integer id,Integer level){
itemCatService.deleteItemCat(id,level);
return SysResult.success();
}
}
Service
@Service
public class ItemCatServiceImpl implements ItemCatService {
@Autowired
private ItemCatMapper itemCatMapper;
/**
* 1.封裝Map集合 Map<Key=父級ID,value=List<ItemCat對象>>
* 2.說明: 将所有的資料庫的父子關系,進行封裝.(沒有嵌套!!!!)
* 3.優勢: 隻查詢一次資料庫,就可以完成父子關系的封裝.
政策:
* 1. key不存在, 準備一個新List集合,将自己當作第一個元素追加
* 2. key存在, 擷取原有list集合,将自己追加.
*
*/
public Map<Integer,List<ItemCat>> initMap(){
//Map中包含了所有的父子級關系.
Map<Integer,List<ItemCat>> map = new HashMap<>();
//1.查詢item_cat表中的所有的記錄(1/2/3級菜單)
List<ItemCat> itemCatList = itemCatMapper.selectList(null);
//2.實作資料的封裝
for(ItemCat itemCat : itemCatList){
int key = itemCat.getParentId();
if(map.containsKey(key)){ //存在
List<ItemCat> list = map.get(key);
//将自己追加到其中
list.add(itemCat);
}else{ //不存在: 準備List集合,将自己作為第一個元素封裝
List<ItemCat> list = new ArrayList<>();
list.add(itemCat);
map.put(key,list);
}
}
//将封裝的資料進行傳回.
return map;
}
/**
* level 1 隻查詢一級商品分類
* 2 查詢一級/二級 嵌套封裝
* 3 查詢一級/二級/三級 嵌套封裝
* @param level
* @return
*/
@Override
public List<ItemCat> findItemCatList(Integer level) {
long startTime = System.currentTimeMillis();
//Map集合裡邊封裝的是所有的父子級關系.
Map<Integer,List<ItemCat>> map = initMap();
if(level == 1){ //隻擷取1級菜單. parent_id = 0
return map.get(0);
}
//使用者查詢1/2級商品分類資訊
if(level == 2){
return getLevel2List(map);
}
//如果程式執行到這裡,則說明使用者查詢的是1-2-3級菜單
List<ItemCat> list = getLevel3List(map);
long endTime = System.currentTimeMillis();
System.out.println("耗時:"+(endTime-startTime)+"毫秒");
return list;
}
@Override
@Transactional
public void updateStatus(ItemCat itemCat) {//id/status
itemCatMapper.updateById(itemCat);
}
@Override
@Transactional
public void saveItemCat(ItemCat itemCat) {
itemCat.setStatus(true);
itemCatMapper.insert(itemCat);
}
/**
* 1.易用性,性能高
*
* @param id
* @param level
*/
@Override
@Transactional //添加事務的控制
public void deleteItemCat(Integer id, Integer level) {
if(level == 3){
itemCatMapper.deleteById(id);
}
if(level == 2){
//1.先删除3級菜單
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("parent_id",id);
itemCatMapper.delete(queryWrapper);
//2.再删除2級菜單
itemCatMapper.deleteById(id);
}
//如果程式執行到這一行 則需要先删除3級/再删除2級/最後删除1級
if(level == 1){
List<Integer> ids = new ArrayList<>();
//1.查詢所有的二級菜單
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("parent_id",id);
List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);
for (ItemCat twoItemCat : twoList){
//删除3級菜單
queryWrapper.clear();
queryWrapper.eq("parent_id",twoItemCat.getId());
//delete from item_cat where parent_id = "二級ID"
itemCatMapper.delete(queryWrapper);
//擷取需要删除的ID資訊
ids.add(twoItemCat.getId());
}
//将所有的二級/一級ID封裝到List集合中
ids.add(id);
itemCatMapper.deleteBatchIds(ids);
}
}
public List<ItemCat> getLevel3List(Map<Integer, List<ItemCat>> map) {
//1.先查詢1-2級
List<ItemCat> oneList = getLevel2List(map);
//2.周遊集合
for(ItemCat oneItemCat : oneList){
//擷取二級集合資訊
List<ItemCat> twoList = oneItemCat.getChildren();
if(twoList == null || twoList.size() ==0){
//目前一級菜單沒有二級元素.結束本次循環,開始下一次!!!
continue;
}
//該元素有二級,應該查詢三級.
for(ItemCat twoItemCat : twoList){
List<ItemCat> threeList = map.get(twoItemCat.getId());
twoItemCat.setChildren(threeList);
}
}
return oneList;
}
//查詢一級和二級資訊
public List<ItemCat> getLevel2List(Map<Integer, List<ItemCat>> map) {
//思路: 先查詢一級,之後循環周遊,再次封裝2級
//1.擷取一級
List<ItemCat> oneList = map.get(0);
for(ItemCat oneItemCat : oneList){
//2.如何根據一級查詢二級? 通過Map集合擷取
List<ItemCat> twoList = map.get(oneItemCat.getId());
//3.實作了一級二級的封裝
oneItemCat.setChildren(twoList);
}
return oneList;
}
/**
* 業務: 查詢3級商品分類資訊
* 1. 一級中嵌套二級集合
* 2. 二級菜單嵌套三級集合.
*
* 1.0版本: for循環嵌套結構 暫時不考慮level 最好了解的
* 常識:
* 1.使用者第一次查詢資料庫 需要建立連結.
* 2.第二次查詢 從連結池中動态擷取連結 是以速度更快!!!
*
* 思考: 該業務查詢了多少次資料庫??? 第一層循環10個 第二層循環10 總查詢數=10*10=100次
* 如何優化查詢政策!!!!
* @param level
* @return
*/
/* @Override
public List<ItemCat> findItemCatList(Integer level) {
//性能問題:!!!!!
long startTime = System.currentTimeMillis();
//1.查詢一級商品分類資訊
QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_id", 0);
List<ItemCat> oneList = itemCatMapper.selectList(queryWrapper);
//2.查詢二級商品分類資訊 周遊一級集合
for(ItemCat oneItemCat : oneList){
queryWrapper.clear(); //清空條件
queryWrapper.eq("parent_id", oneItemCat.getId());
List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);
//3.查詢三級商品分類資訊 周遊
for(ItemCat twoItemCat : twoList){
queryWrapper.clear();
queryWrapper.eq("parent_id", twoItemCat.getId());
List<ItemCat> threeList = itemCatMapper.selectList(queryWrapper);
//将三級封裝給二級
twoItemCat.setChildren(threeList);
}
//3.将二級記錄封裝給一級
oneItemCat.setChildren(twoList);
}
//記錄程式的結束時間
long endTime = System.currentTimeMillis();
System.out.println("查詢耗時:"+(endTime - startTime)+"毫秒");
return oneList;
}*/
}