本帖最后由 三胖的减肥之路 于 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语句过多,不利于系统优化
|