2021-06-16 java查询数据库三级分层实例

三级分层实例

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;//返回一级
    }
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值