当前位置: 代码迷 >> J2SE >> jdbc 递归无限极tree解决方案
  详细解决方案

jdbc 递归无限极tree解决方案

热度:77   发布时间:2016-04-23 19:59:38.0
jdbc 递归无限极tree
现在是写死的两层,但是考虑以后可能不止两层,想写一个无限极的,无论多少成都可以生成一个List<TreeData>,递归写老是出错,所以请教一下各位大哥


public static List<TreeData> findMenuTreeData(String roleUuid) {
List<TreeData> list=new ArrayList<TreeData>();
try {
PQL pql = new PQL();
session = pql.getDefaultDataSource().createSession();
String sql = "SELECT * FROM systemaction WHERE UUID IN(SELECT actionuuid FROM systemactiongroup WHERE roleuuid='"+roleUuid+"') AND puuid='0' AND ismenu='1'";
SqlResultSet rs = session.queryBySQL(sql);
while (rs.next()) {//第一层
TreeData td=new TreeData();
td.setId(rs.getString("uuid"));
td.setText(rs.getString("actionname"));
td.setAttributes(new ItemData(rs.getString("action") , rs.getString("actionname")));
List<TreeData> sublist=new ArrayList<TreeData>();
String sql2 = "SELECT * FROM systemaction WHERE UUID IN(SELECT actionuuid FROM systemactiongroup WHERE roleuuid='"+roleUuid+"') AND puuid='"+td.getId()+"' AND ismenu='1'";
SqlResultSet rs2 = session.queryBySQL(sql2);
while (rs2.next()) {//第二层
TreeData t=new TreeData();
t.setId(rs2.getString("uuid"));
t.setText(rs2.getString("actionname"));
t.setAttributes(new ItemData(rs2.getString("action"), rs.getString("actionname")+">--->"+rs2.getString("actionname")));
sublist.add(t);
}
td.setChildren(sublist);//将第二层设为第一层子节点
list.add(td);//最后都加到list中便于前台展示
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (null != session) session.closeSession();
}
return list;
}


public static void main(String[] args) {
List<TreeData> list = new ArrayList<TreeData>();
List<TreeData> datas = AuthorityHelper.findMenuTreeData("0O5v62zr3b");
for (int i = 0; i < datas.size(); i++) {
System.out.println(datas.get(i).getAttributes().getTitle() + "\t" + datas.get(i).getAttributes().getUrl());
for (int j = 0; j < datas.get(i).getChildren().size(); j++) {
System.out.println("-----\t"+datas.get(i).getChildren().get(j).getAttributes().getTitle() + "\t" + datas.get(i).getChildren().get(j).getAttributes().getUrl());
}
}
}

------解决思路----------------------
既然都无限级了,不要一次加载完吧?应该考虑动态加载,按需加载..............
------解决思路----------------------
不知道你的数据库表的结构,只能说说我的思路。下面是伪代码,按照这个思路你可以解决你的问题
public List<TreeData> ff(pid){
新建一个List<TreeData>对象 list
根据pid查询数据库得到记录集rs
遍历rs{
新建一个TreeData对象td
取出一条记录r
用r对td的各个属性赋值
如果r的isMenu属性为true{
以r的id为参数,调用ff()     //注意:这一步就是所谓的递归调用
将得到的结果赋予td的sublist属性
}
将td加入list
}
返回list
}
  相关解决方案