递归方法实现
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class Tree {
public static void main(String[] args) throws Exception {
//获得所有菜单
//List<TreeDTO> treeDatalist=Tree.getAllTreeDate();
//指定菜单下的菜单
String menuId="1";
List<TreeDTO> treeDatalist=Tree.getTreeDateByMenuId(menuId);
Tree.queryTreeData(treeDatalist);
}
/****
* 遍历树
* @param treeDatalist
* @throws Exception
*/
public static void queryTreeData(List<TreeDTO> treeDatalist) throws Exception{
StringBuffer sb=new StringBuffer();
for(int i=0;i<treeDatalist.size();i++){
TreeDTO treedto=treeDatalist.get(i);
sb.append("[menuId:").append(treedto.getMenu_id()+",");
sb.append("menuName:"+treedto.getMenu_name()+"]");
sb.append("\n");
//判断是否是叶子节点
String isleaf=treedto.getIs_leaf();
if("YES".equalsIgnoreCase(isleaf)){
//System.out.println("叶子节点");
}else{
List<TreeDTO> treeDatalist2 =Tree.getTreeDateByMenuId(treedto.getMenu_id());
Tree.queryTreeData(treeDatalist2);
}
}
System.out.println(sb.toString());
}
/****
* 获得所有的树形菜单
* @return
* @throws Exception
*/
public static List<TreeDTO> getAllTreeDate()throws Exception{
String sql="select t.menu_id, t.menu_name,t.menu_code,t.parent,"+"decode(connect_by_isleaf,0,'No',1,'Yes') is_leaf,level,"+
" sys_connect_by_path(t.menu_name,'/') path from smcs_menu t "+
" start with t.parent = '1' connect by prior t.menu_id = t.parent";
// System.out.println("sql===="+sql);
List<TreeDTO> treeDatalist=Tree.getTreeDate(sql);
return treeDatalist;
}
/****
* 根据 MenuId查询树形数据
* @return
* @throws Exception
*/
public static List<TreeDTO> getTreeDateByMenuId(String menuId)throws Exception{
String sql=" select * from (select t.menu_id, t.menu_name,t.menu_code,t.parent,"+"decode(connect_by_isleaf,0,'No',1,'Yes') is_leaf,level,"+
" sys_connect_by_path(t.menu_name,'/') path from smcs_menu t "+
" start with t.parent =" +menuId+ "connect by prior t.menu_id = t.parent ) where parent ="+ menuId;
// System.out.println("sql===="+sql);
List<TreeDTO> treeDatalist=Tree.getTreeDate(sql);
return treeDatalist;
}
/****
* 得到树形数据
* @param sql
* @return List<TreeDTO>
* @throws Exception
*/
public static List<TreeDTO> getTreeDate(String sql)throws Exception{
List<TreeDTO> treeDatalist=new ArrayList<TreeDTO>();
TreeDTO treedto=null;
Connection conn=Tree.GetCon();
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
treedto=new TreeDTO();
//设置属性
treedto.setMenu_id(rs.getString("menu_id"));
treedto.setMenu_name(rs.getString("menu_name"));
treedto.setMenu_code(rs.getString("menu_code"));
treedto.setParent(rs.getString("parent"));
treedto.setIs_leaf(rs.getString("is_leaf"));
treedto.setLevel(rs.getString("level"));
treedto.setPath(rs.getString("path"));
//设置属性
treeDatalist.add(treedto);
}
return treeDatalist;
}
/****
* 获得数据库连接
* @return
* @throws Exception
*/
public static Connection GetCon() throws Exception{
Connection con=null;
String url = "";
String username ="admin";
String password = "123456";
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection(url , username , password );
return con;
}
}
DTO
public class TreeDTO {
private String menu_id;
private String menu_name;
private String menu_code;
private String parent;
private String is_leaf;
private String level;
private String path;
/****
set get 略
****/
}
控制台输出
[menuId:101001,menuName:定点医疗机构信息维护]
[menuId:101002,menuName:定点医疗机构资格维护]
[menuId:101003,menuName:药品信息维护]
[menuId:101004,menuName:诊疗项目信息维护]
[menuId:102001,menuName:门诊特病申报]
[menuId:102002,menuName:门诊特病审批]
[menuId:103001,menuName:个人封锁解封]
[menuId:104001,menuName:中心报销]
[menuId:104002,menuName:报销审核]
[menuId:104003,menuName:取消报销]