A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 三胖的减肥之路 于 2017-11-27 18:20 编辑


这几天碰到一个数据库表,有一个表是用来做菜单的,但是因为习惯使用 有父id的方式进行自关联,所以第一反应是去找父id

但是没有找到 ,只找到一个结构码字段,实在不明白是什么意思,后来询问了做数据库设计的人说,使用的是4位为以及的方式,举例说明

一级菜单
     0001

二级菜单
     00010001

三级菜单
    000100010001

经过解释后,明白了,但是感觉很是恶心.......
没办法碰到了,就试着解决解决

首先想到了第一种方案
     使用递归的方式,每次只查询当前需要的数据

    写一个递归方法,作用是查询  当前父节点的子节点有哪些,表示手残代码忘保存了。。。。



第二种方案
    先把所有的数据查询出来,然后再对数据进行格式处理

[AppleScript] 纯文本查看 复制代码
public List<Tmenu> queryAllMenuList(String roleCode) {                
                
                //通过权限编码查询权限
                 Trole trole =        troleDao.get(roleCode);
                //通过权限获取菜单列表
                 Set<TroleMenu> set = trole.getTroleMenus();
                 List<Tmenu> t1 = new ArrayList<>();
                 List<Tmenu> t2 = new ArrayList<>();
                 List<Tmenu> t3 = new ArrayList<>();
                 for (TroleMenu troleMenu : set) {
                        if(troleMenu.getTmenu().getFstrutid().length()==4){
                                t1.add(troleMenu.getTmenu());
                        }else         if(troleMenu.getTmenu().getFstrutid().length()==8){
                                t2.add(troleMenu.getTmenu());
                        }else         if(troleMenu.getTmenu().getFstrutid().length()==12){
                                t3.add(troleMenu.getTmenu());
                        }
                }
                 
                 
                for (Tmenu tm2 : t2) {
                        List<Tmenu> t2z = new ArrayList<>();
                        for (Tmenu tm3 : t3) {
                                if(tm2.getFstrutid().equals(tm3.getFstrutid().substring(0, 8))){
                                        t2z.add(tm3);
                                }
                        }
                        tm2.setSubAuthorityList(t2z);
                }
                 
                 
                for (Tmenu tm1 : t1) {
                        List<Tmenu> t1z = new ArrayList<>();
                        for (Tmenu tm2 : t2) {
                                if(tm1.getFstrutid().equals(tm2.getFstrutid().substring(0, 4))){
                                        t1z.add(tm2);
                                }
                        }
                        tm1.setSubAuthorityList(t1z);
                }
                //对查询出的菜单列表进行整理返回
                Collections.sort(t1);
                return t1;                
        }




经过上面两种方式,很明显我使用了第二种,第二种其实写的代码一点也不优雅,但是有一个好处,就是发送的sql语句很少,
如果使用递归方式,每次都需要查询子节点有哪些,发送sql语句过多,不利于系统优化












0 个回复

您需要登录后才可以回帖 登录 | 加入黑马