前提: 数据库中准备一个表(与tree方法里面的元素保持一致)。准备 业务处理层(Dao),业务逻辑层(service),控制层(servlet),辅助类(util) ,实体类(model)。注意:字段与 数据库保持一致,在实体类中写一个自己存自己节点的方法(List)为之后的的service层做铺垫
我用的是oracle数据库,大家可以参考一下
在数据库中我们采用树表另外一个叫法自关联表
我是这样理解树表的,所谓树表你可以理解为一颗树。树是由主干,树枝,树叶组成的。树叶依附于树枝在上,树枝依附于主干上,一层套一层
这是另外一个博主解释的树决策,感兴趣的可以了解下 什么是树决策https://blog.csdn.net/moxiaoxuan123/article/details/81411396?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164645975416780271589399%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164645975416780271589399&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-11-81411396.pc_search_result_control_group&utm_term=%E4%BB%80%E4%B9%88%E6%98%AF%E6%A0%91%E8%A1%A8&spm=1018.2226.3001.4187
在这里可以看出树表的作用。在最大父级标签的PID中我们设置默认值为-1,ID设为20。你可以看到在有三个订单管理,id为20的是最大父级标签,而另外两个是它的子标签。在两个子标签中我们可以看到它的pid为是它的父级标签的id,它的id前面两位数是父级标签的两位。这样我们就可以更好的区分谁是谁的子标签,在调用的方法中会更好的查询。在下面我会进一步解释
当所有的准备工作做完就可以开始写我们的代码:
在Dao里面写一个根据pid查询的方法:注意:在sql语句中我们采用预编译的方法编写
什么是预编译:预编译简单来说就是在sql语句中用?占位符来赋值,它这样有什么好处:调用sql语句时发送到数据库中,只有第一次需要编译,之后不会再编译,大大提高运行速率。而且还能解决sql注入的问题,提高安全性。可以参考一下代码
什么是动态sql
简单来说动态sql就是字符串拼接,用++的方式来编写sql语句。这样写的坏处:每次发送到数据库时都需要编译,降低运行速率。可以参考以下代码
编写servlet
在这里我先提一个问题,我们如何才能得到表中所有数据,且是一层下面包一层的。可能有小伙伴说用查询所有的方法,我提前告诉你这个方法不可行。需达到这样的效果,可以在这里停留想一下
在上文中我们讲到数据库中用树表,这时候就充分树表的作用。在方法中我们要用到递归 什么是递归:简单来说就是自己调用自己
在编写方法中我们可以用查询单个pid的方法来实现这个功能。首先我们可以查询最大父级标签的pid,通过查询父级的pid我们可以得到父级标签的路径,细心的朋友可能在文中看到父级标签的url也就是路径是空的。我们可以判断如果路径为空,我们再调用查询pid的方法,这里就用到了递归。在查询pid的方法我们可以放父级标签的id,因为父级标签的id是子标签的pid。这样我们就可以得到所有的标签,代码如下
之后我们在servlet中调用这个方法,用json发送到前台去,在前台使用ajax就可以完成了
如果有同学不懂json和ajax的话那就得好好复习了