比如:
public class Menu(){
private int id;
private String name;
private int pid;
private List<Menu> menu;//二级菜单。}
就这样的!那么我用jdbc的话 我应该怎么查询呢。我是先查询一级.然后再根据pid去查询二级。这样子不对吧 这样用了什么N+1次查询。想知道 如何通过一次查询就能达到目的!即查询当前菜单以及其子菜单。
(还有我查询出来后 页面如何遍历为一颗树那种....一级作为根,二级作为叶子):
新闻列表
--体育新闻
--军事新闻
--国际新闻
我可以这样遍历
${menu.name}(对应比如 新闻列表)
---
---
---
二级菜单如何遍历???
public class Menu(){
private int id;
private String name;
private int pid;
private List<Menu> menu;//二级菜单。}
就这样的!那么我用jdbc的话 我应该怎么查询呢。我是先查询一级.然后再根据pid去查询二级。这样子不对吧 这样用了什么N+1次查询。想知道 如何通过一次查询就能达到目的!即查询当前菜单以及其子菜单。
(还有我查询出来后 页面如何遍历为一颗树那种....一级作为根,二级作为叶子):
新闻列表
--体育新闻
--军事新闻
--国际新闻
我可以这样遍历
${menu.name}(对应比如 新闻列表)
---
---
---
二级菜单如何遍历???
nodeId,parentNodeId 两个key。在init树的时候,要读表中的每一个记录,这也是必须的,因为每个记录都是你树上的节点。
然后开始组装://step1:将所有node都初始化
Node node = new Node(nodeId,xxx,xxx);
...
//step2:建立关系
node.setParent(getParentById(parentNodeId);
...
据此判断只存在一个menu表,这个表里有一个PID(上级菜单编号)字段第一个需求,就是全查吧(select * form menu)
然后一点一点遍历这个结果集,把这个对象创建出来第二个需求,哈哈,来个歪招儿:重写Menu类的toString方法,在方法里把name和所有子菜单拼起来,这个不就递归输出了当然,这招可能有点损
然后去网上下载个dTree(js写的树),用起来挺方便的,
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
var zNodes = [
{ id: 1, pId: 0, name: ".Net技术" },
{ id: 2, pId: 0, name: "编程语言" },
{ id: 3, pId: 0, name: "软件设计" },
{ id: 4, pId: 1, name: ".Net新手区" },
{ id: 5, pId: 1, name: "Asp.Net" },
{ id: 6, pId: 1, name: "C#" },
{ id: 7, pId: 1, name: "WinForm" },
{ id: 8, pId: 4, name: ".Net码畜区" },
{ id: 9, pId: 2, name: "Java" },
];
var setting = ["id", "pId"];
//第一步: 转化数据结构模型
var result = ToForest(zNodes, setting);
var mynode = "<ul>" + GetNodes(result) + "</ul>";
$("body").append(mynode);
});
var html = "";
//第二步:深度优先(这里面的html格式可以自己更改)
function GetNodes(result) {
for (var i = 0; i < result.length; i++) {
html += "<li>" + result[i].name;
if (result[i].childs != undefined) {
html += "<ul>";
GetNodes(result[i].childs);
html += "</ul>";
}
html += "</li>";
}
return html;
}
//setting的格式:[ID,Name,PID]
function ToForest(sNodes, setting) {
var i, l,
//主键ID
key = setting[0];
//parentID
parentKey = setting[1];
//childs
childsKey = "childs";
//参数检查
if (!key || key == "" || !sNodes)
return [];
if ($.isArray(sNodes)) {
//存放森树形式的数据模型
var r = [];
//存放以ID为key,ID对应的实体为value
var tmpMap = [];
//赋值操作
for (i = 0; i < sNodes.length; i++) {
//获取当前的id
var id = sNodes[i][key];
tmpMap[id] = sNodes[i];
}
//对json逐层遍历确定层级关系
for (i = 0; i < sNodes.length; i++) {
//获取当前的pid
var pid = sNodes[i][parentKey];
//判断是否是顶级节点
if (tmpMap[pid]) {
//判断该节点是否有孩子节点
if (!tmpMap[pid][childsKey])
tmpMap[pid][childsKey] = [];
//将此节点放在该节点的孩子中
tmpMap[pid][childsKey].push(sNodes[i]);
} else {
//如果是顶级节点直接存放
r.push(sNodes[i]);
}
}
return r;
} else {
return [sNodes];
}
}
</script>
</head>
<body>
</body>
</html>
给个例子:
select s.id,s.sj_parent_id,level from tb_subject s where s.sj_parent_id is not null
connect by s.sj_parent_id = prior s.id start with id=69720 order by level