三级分层实例
1.1,封装类
@TableName("item_cat")
@Data
加粗样式@Accessors(chain = true)
public class ItemCat extends BasePojo{
@TableId(type = IdType.AUTO)
private Integer id; //定义主键
private Integer parentId; //定义父级菜单
private String name; //分类名称
private Boolean status; //分类状态 0 停用 1 正常
private Integer level; //商品分类等级 1 2 3
@TableField(exist = false) //由于自关联,但是不是数据库字段.需要特别注明.
private List<ItemCat> children;
}
1.2、方式一,for循环遍历。
@Override
public List<ItemCat> findItemCatList(Integer type) {
QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<>(); //条件构造器.pojo类:ItemCat
if(type == 1){//查询一级菜单
queryWrapper.eq("parent_id", 0);//表里parent_id 父ID号
List<ItemCat> list=itemCatMapper.selectList(queryWrapper);//selectList查询全部
return list;//返回一级
}
else if(type == 2){
queryWrapper.clear();//清除之前条件构造器的条件,
queryWrapper.eq("parent_id", 0);//重新构造条件
List<ItemCat> list=itemCatMapper.selectList(queryWrapper);//selectList查询全部
for(ItemCat itemCat1:list){ //遍历一级
queryWrapper.clear();//清除之前条件构造器的条件,
queryWrapper.eq("parent_id", itemCat1.getId());//重新构造条件。itemCat1.getId() 获取ID号
List<ItemCat> list1= itemCatMapper.selectList(queryWrapper);//查询二级
itemCat1.setChildren(list1);//查询二级信息给与Children.之前在ItemCat已经定义封装 private List<ItemCat> children;并赋值给ItemCat
}
return list;重新返回一级.里面已经包含二级
} else{
queryWrapper.clear();
queryWrapper.eq("parent_id", 0);
List<ItemCat> list=itemCatMapper.selectList(queryWrapper);
for(ItemCat itemCat1:list){
queryWrapper.clear();
queryWrapper.eq("parent_id", itemCat1.getId());
List<ItemCat> list2= itemCatMapper.selectList(queryWrapper);
itemCat1.setChildren(list2);
for (ItemCat itemCat2 : list2) {
queryWrapper.clear();
queryWrapper.eq("parent_id", itemCat2.getId());
List<ItemCat> list3= itemCatMapper.selectList(queryWrapper);
itemCat2.setChildren(list3);
}
}
return list;
}
}
1.3、方式二,Map封装数据,调用方法。
首先定义一个map方法,封装全部数据
/** 1.提高程序的效率,较少数据的交互.
* 2.查询的方法单独抽取.
* 如何有效存储父子关系?
* MAP(parent_id,子级)
*说明:
* 1级:map(0,List(ItemCat)) map.get(0)
* 2级:map( List(ItemCat).getId, List2(ItemCat遍历)) map.get(List(ItemCat).getId)
*3级:
*
* */
public Map<Integer,List<ItemCat>> getMap(){
//查询所有数据
List<ItemCat> list= itemCatMapper.selectList(null);
//封装给map.定义一个map
Map<Integer,List<ItemCat>> map=new HashMap<Integer,List<ItemCat>>();
for (ItemCat itemCat : list) {
//规则.判断是否有key
/**没有:该子级是第一个父级的元素,声明父级,作为第一个存入父级
* 有:找到父级的子级序列,将子级序列追加到序列中即可.
* */
if(map.containsKey(itemCat.getParentId())) {
//有父级
map.get(itemCat.getParentId()) //getParentId()获取父级id,根据key,获取value
.add(itemCat); //把value传入集合.把子级传入父级
}else {
//没有父级
List<ItemCat> list2=new ArrayList<>(); //声明一个存入父级的集合
list2.add(itemCat);
map.put(itemCat.getParentId(),list2);
}
}
return map;
}
其次,进行判断需要几级菜单:
@Override
public List<ItemCat> findItemCatList(Integer type) {
//获取上一个方法中定义的所有存入map的数据<ParentId:itemcat>父id,几级菜单
Map<Integer, List<ItemCat>> map = getMap();
if (type == 1) { //判断是一级菜单时
return map.get(0); //根据key=0,获取1级菜单.
} else if (type == 2) {//判断是二级菜单时
return getlevel2(map);//调用此方法.遍历一级,获取二级,在重新封装到一级
} else {//判断是三级菜单时
return getlevel3(map);//调用此方法.遍历一级,获取二级,在遍历二级,获取三级,在重新封装到一级
}
}
然后,根据上面需要使用的方法,进行调用
private List<ItemCat> getlevel3(Map<Integer, List<ItemCat>> map) {
//获取二级菜单.一级菜单里套二级菜单
List<ItemCat> list= getlevel2(map);
for (ItemCat itemCat1 : list) { //遍历一级菜单
List<ItemCat> list2=itemCat1.getChildren();//拿到二级list
for (ItemCat itemCat2 : list2) { //遍历二级菜单list
List<ItemCat> list3=map.get(itemCat2.getId());//根据二级的id,当做父id,查到三级
itemCat2.setChildren(list3);//在把三级封装到二级
}
// itemCat1.setChildren(list2);
}
return list;//返回一级
}
private List<ItemCat> getlevel2(Map<Integer, List<ItemCat>> map) {
List<ItemCat> list =map.get(0);//拿到一级菜单
for (ItemCat itemCat : list) {//遍历一级菜单
//itemCat.getId()获取一级菜单的ID.在根据ID获取额二级菜单.value
List<ItemCat> list1 = map.get(itemCat.getId());
itemCat.setChildren(list1);//在把二级菜单封装到一级
}
return list;//返回一级
}
}