package com.jt.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@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;
}*/
}
查询三级目录和删除三级目录业务后端详情
最新推荐文章于 2022-05-15 12:20:31 发布
这是一个关于Java编程的博客,主要介绍了如何使用MyBatis Plus框架来处理商品分类数据。内容包括初始化Map来存储所有父子级关系,优化查询策略以减少数据库查询次数,以及实现商品分类的增删改查操作,强调了事务管理和性能优化。
摘要由CSDN通过智能技术生成