1.两表联查实现树形存储

1)sql数据库条件

表1数据:

表2数据:

2)解决方案(基于mybatis-plus)

1.依据表数据建立关系树
@Data
public class MainMenuVo {
   private String id;
   private String title;
   private String path;
   private List<SubMenuVo> children=new ArrayList<>();//建立父与子的链接
   /*注解*/
   //此处初始化的children必须new 一个对象,不然会出现空指针异常
}
@Data
public class SubMenuVo {
   private String sid;
   private String sTitle;
   private String sPath;
}
2.在service层初始化接口
public interface MainMenuService extends IService<MainMenu> {

   List<MainMenuVo> listTree();
}
3.在具体类中实现该方法
@Service
public class MainMenuServiceImpl extends ServiceImpl<MainMenuMapper, MainMenu> implements MainMenuService {
   
   @Resource  //实现依赖注入,自身方法用baseMapper即可调用
   private SubMenuMapper subMenuMapper;

   @Override
   public List<MainMenuVo> listTree() {
       //创建MainMenuVo的存储列表,用于封装 子项(此处为children列表)
       List<MainMenuVo> list=new ArrayList<>();
       //查询父,子数据库表,为封装做准备
       List<MainMenu> mainMenus = baseMapper.selectList(null);
       List<SubMenu> subMenus = subMenuMapper.selectList(null);
       for(MainMenu m:mainMenus){
           //遍历父表,将属性拷贝到父Vo中
           MainMenuVo vo=new MainMenuVo();
           BeanUtils.copyProperties(m,vo);
           for (SubMenu s:subMenus) {
               //遍历子表,如果子Vo的属性与对应的子类不同(SubMenuVo与SubMenu属性不对应),
               //不能用BeanUtils.copyProperties进行属性拷贝
               SubMenuVo svo = new SubMenuVo();
               svo.setSid(s.getId());
               svo.setSPath(s.getPath());
               svo.setSTitle(s.getTitle());
               if (m.getId().equals(s.getPid())){
                   //封装
                   vo.getChildren().add(svo);
              }
          }
           list.add(vo);
      }
       return list;
  }
}
4.使用
@GetMapping("/list")
  @ApiOperation("获取所有主菜单对象")
  public R list(){
      List<MainMenuVo> list = mainMenuService.listTree();
      return R.ok().data("items",list);
  }

翻译 朗读 复制 正在查询,请稍候…… 重试 朗读 复制 复制 朗读 复制 via 谷歌翻译(国内)