如何在java中从数据库中获取所有子类别
我的数据库中有一个树状结构,如下所示如何在java中从数据库中获取所有子类别,java,mysql,database,jdbc,relational-database,Java,Mysql,Database,Jdbc,Relational Database,我的数据库中有一个树状结构,如下所示 mysql> select * from categories; +----+---------------+-----------+ | id | category_name | parent_id | +----+---------------+-----------+ | 1 | footwear | -1 | | 2 | kids footwear | 1 | | 3 | for girls
mysql> select * from categories;
+----+---------------+-----------+
| id | category_name | parent_id |
+----+---------------+-----------+
| 1 | footwear | -1 |
| 2 | kids footwear | 1 |
| 3 | for girls | 2 |
| 4 | sandals | 3 |
| 5 | electronics | -1 |
| 6 | kids | -1 |
+----+---------------+-----------+
6 rows in set (0.00 sec)
我想读取父类别的所有子类别,表中的-1将该类别显示为父类别或最上面的类别。树中可能有任何级别
一旦用户单击父类别(-1),我就需要显示它的所有子类别。我不想每次单击都再次访问数据库(&i)。
我有一些类似的想法,可以通过将表条目转换成树来实现&而不是遍历树,但是从表本身检索是一项困难的任务,这变得太复杂了
我从这个链接中得到了一些想法,可以用另一种方法(第二种方法)
但是在这个方法中,如果我想插入一个新的子类别,那么我必须修改整个表
还有其他建议吗?好的,只有几种可行的方法:
- 以广度优先的方式检索级别,例如通过多次执行查询。此查询可能一次检索多个级别。这就是我们为浅树所做的
- 使用链接的实体化路径/嵌套集路径
- 读取所有行并在代码中构建树,这可能是最简单的方法,对于小树仍然是可行的。对于大树,您可能会考虑一些缓存机制。
另一种方法可能是使用不同的数据库;) 您必须使用递归函数来处理此类问题
public String findcategoryList() {
List<Category> results = dao.findAllCategory();
LinkedHashMap<String, List<String>> map = new LinkedHashMap();
LinkedHashMap<Integer, List<Integer>> mapKey = new LinkedHashMap();
for (Object object : results) {
Category ee = (Category) object;
Set<Category> stsd = ee.getSubCategories();
if (stsd != null && stsd.size() > 0 && ee.getCategory() == null) {
dispaly(stsd, ee, map, mapKey);
} else if (ee.getCategory() == null) {
List<String> list = new ArrayList<String>();
List<Integer> listKey = new ArrayList<Integer>();
map.put(ee.getCategoryname(), list);
mapKey.put(ee.getCategoryId(), listKey);
System.out.println(ee.getCategoryname() + "---- No Child");
System.out.println(ee.getCategoryId() + "---- No Child");
}
}
StringBuilder menu = new StringBuilder();
System.out.println("------------------Menu Start----------------");
Set<String> keys = new TreeSet<String>(map.keySet());
menu.append("<ul class='drop'>");
Set<String> sets = new HashSet<String>();
if(map.size() == mapKey.size()){
Iterator<Entry<String, List<String>>> iter1 = map.entrySet().iterator();
Iterator<Entry<Integer, List<Integer>>> iter2 = mapKey.entrySet().iterator();
while(iter1.hasNext() || iter2.hasNext()) {
Entry<String, List<String>> e1 = iter1.next();
Entry<Integer, List<Integer>> e2 = iter2.next();
String key = e1.getKey();
List<String> child = map.get(key);
Integer keyId = e2.getKey();
List<Integer> childKey = mapKey.get(keyId);
if (!sets.contains(key)) {
System.out.println("key : "+key);
if (child != null && child.size() > 0) {
menu.append("<li><a href='#'>").append(key).append("<i class='fa fa-caret-down'></i></a>");
menu.append("\n");
menu.append("<ul class='sub_menu submenu'>");
menu.append("\n");
}else{
menu.append("<li><a href='./viewVideos-"+keyId+"'>").append(key).append("<i class='fa fa-caret-down'></i></a>");
menu.append("\n");
}
sets.add(key);
menuCreate(menu, child, childKey, map, mapKey, sets);
if (child != null && child.size() > 0) {
menu.append("</ul>");
menu.append("\n");
}
menu.append("</li>");
}
}
}
menu.append("</ul>");
//System.out.println(menu.toString());
return menu.toString();
}
public static void menuCreate(StringBuilder menu, List<String> child, List<Integer> childKey, Map<String, List<String>> map,
Map<Integer, List<Integer>> mapKey,
Set<String> sets) {
if (child != null && child.size() > 0) {
// Collections.sort(child, ComparatorUtils.NATURAL_COMPARATOR);
for (int i=0;i<child.size();i++) {
List<String> subChild = map.get(child.get(i));
List<Integer> subChildKey = mapKey.get(childKey.get(i));
System.out.println("subChild : "+subChild+ " child : " + child + " Value : " + child.get(i));
menu.append("<li>");
boolean flag = false;
if (subChild == null || (child != null && child.size() <= 0)) {
menu.append("<a href='./viewVideos-"+childKey.get(i)+"'>");
flag = true;
}
if(flag){
menu.append(child.get(i)).append("<i class='fa fa-caret-right'></i>");
menu.append("</a>");
}else{
menu.append("<a href='#'>").append(child.get(i)).append("<i class='fa fa-caret-right'></i></a>");
}
menu.append("\n");
if (subChild != null && subChild.size() > 0) {
if (!sets.contains(child.get(i))) {
sets.add(child.get(i));
menu.append("<ul class='sub_menu submenu'>");
menu.append("\n");
menuCreate(menu, subChild, subChildKey, map, mapKey, sets);
menu.append("</ul>");
menu.append("\n");
}
}
menu.append("</li>");
}
}
}
public void dispaly(Set<Category> msp, Category ee, Map<String, List<String>> map, Map<Integer, List<Integer>> mapKey) {
for (Category category : msp) {
Set<Category> stsd = category.getSubCategories();
if (category.getCategory() != null) {
if (map.get(category.getCategory().getCategoryname()) == null) {
List<String> list = new ArrayList<String>();
List<Integer> listKey = new ArrayList<Integer>();
list.add(category.getCategoryname());
listKey.add(category.getCategoryId());
map.put(category.getCategory().getCategoryname(), list);
mapKey.put(category.getCategory().getCategoryId(), listKey);
} else {
List<String> list = map.get(category.getCategory().getCategoryname());
List<Integer> listKey = mapKey.get(category.getCategory().getCategoryId());
list.add(category.getCategoryname());
listKey.add(category.getCategoryId());
map.put(category.getCategory().getCategoryname(), list);
mapKey.put(category.getCategory().getCategoryId(), listKey);
}
System.out.println(category.getCategory().getCategoryname() + "----" + category.getCategoryname());
System.out.println(category.getCategory().getCategoryId() + "----" + category.getCategoryId());
}
if (stsd != null && stsd.size() > 0) {
dispaly(stsd, category, map, mapKey);
}
}
公共字符串findcategoryList(){
List results=dao.findAllCategory();
LinkedHashMap=新建LinkedHashMap();
LinkedHashMap mapKey=新建LinkedHashMap();
用于(对象:结果){
类别ee=(类别)对象;
设置stsd=ee.getSubCategories();
if(stsd!=null&&stsd.size()>0&&ee.getCategory()==null){
显示(STD、ee、map、mapKey);
}else if(ee.getCategory()==null){
列表=新的ArrayList();
List listKey=new ArrayList();
put(ee.getCategoryname(),list);
put(ee.getCategoryId(),listKey);
System.out.println(ee.getCategoryname()+“----无子项”);
System.out.println(ee.getCategoryId()+“----无子项”);
}
}
StringBuilder菜单=新建StringBuilder();
System.out.println(“--------------菜单开始--------------------”;
Set keys=new TreeSet(map.keySet());
菜单.追加(“”);
Set Set=新的HashSet();
if(map.size()==mapKey.size()){
迭代器iter1=map.entrySet().Iterator();
迭代器iter2=mapKey.entrySet().Iterator();
while(iter1.hasNext()| | iter2.hasNext()){
条目e1=iter1.next();
条目e2=iter2.next();
字符串key=e1.getKey();
List child=map.get(key);
整数keyId=e2.getKey();
List childKey=mapKey.get(keyId);
如果(!set.contains(键)){
System.out.println(“key:+key”);
if(child!=null&&child.size()>0){
菜单。追加(“- ”);
菜单。追加(“\n”);
菜单。追加(“
”);
}
}
}
菜单。追加(“ ”);
菜单。追加(“\n”);
}
菜单。追加(“
”);
//System.out.println(menu.toString());
return menu.toString();
}
公共静态void菜单创建(StringBuilder菜单、列表子项、列表子项键、映射、,
mapKey,
(套){
if(child!=null&&child.size()>0){
//Collections.sort(child、ComparatorUtils.NATURAL\u COMPARATOR);
对于(int i=0;i 0){
显示(标准差分、类别、地图、地图键);
}
}
menu.toString()将为您提供html格式的树栏。@Neel??English please…:)使用嵌套集方法确实可以在单个查询中完成此操作。如果父/子级别的数量非常有限,则可以为每个级别执行联接,因此仅使用单个查询。否则,您将不得不读取所有记录并执行一些com操作请注意,按照惯例,我们对邻接列表中的孤立项使用NULL。