Java 树形结构

树形结构可以清楚地呈现数据的从属关系,在数据库中我们可以用自关联来保存这样的关系。但是在取出数据的时候,如果采用以往的手段,免不了要进行递归操作。递归在理论上是可以解决树形结构的问题,但是如果数据量够大,目录层次够深,我们递归出层次关系是比较消耗资源的。我们可以从数据结构入手,树有它的分支,每个分支又可以延伸出新的分支,那么我们可以在每个节点中增加它的左支和右支,左支和右支良好的维护了树形体系。父节点的左支是永远小于子节点的左支,父节点的右支是永远大于子节点的右支,有了这样的关系,我们想要表现出树形结构是很简单的。所以我们将数据库表设计为自关联表,每个记录中都维护着一个坐支和右支。不必在表中添加父节点列也可以轻松搞定树状关系。

效果图:

 

 

Dao层

  1. package cn.dk.dao;  
  2.   
  3. import java.sql.SQLException;  
  4. import java.util.List;  
  5. import org.apache.commons.dbutils.QueryRunner;  
  6. import org.apache.commons.dbutils.handlers.BeanHandler;  
  7. import org.apache.commons.dbutils.handlers.BeanListHandler;  
  8. import cn.dk.domain.Category;  
  9. import cn.dk.utils.JdbcUtils;  
  10.   
  11. public class CategoryDao {  
  12.   
  13.     @SuppressWarnings("unchecked")  
  14.     public List<Category> selectAllCategory() {  
  15.         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());  
  16.         String sql = "select c.id,c.name,c.left_hand,c.right_hand,count(c.name) depth from category p,category c where p.left_hand<=c.left_hand and p.right_hand>=c.right_hand group by c.name order by c.left_hand";  
  17.         try {  
  18.             return (List<Category>) runner.query(sql, new BeanListHandler(  
  19.                     Category.class));  
  20.         } catch (SQLException e) {  
  21.             throw new RuntimeException(e);  
  22.         }  
  23.     }  
  24.   
  25.     public Category selectCategory(String id) {  
  26.         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());  
  27.         String sql = "select id,name,left_hand,right_hand from category where id=?";  
  28.         Object[] params = { id };  
  29.         try {  
  30.             return (Category) runner.query(sql,  
  31.                     new BeanHandler(Category.class), params);  
  32.         } catch (SQLException e) {  
  33.             throw new RuntimeException(e);  
  34.         }  
  35.     }  
  36.   
  37.     public void insertCategory(Category category) {  
  38.         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());  
  39.         String sql = "insert into category values(?,?,?,?)";  
  40.         Object[] params = { category.getId(), category.getName(),  
  41.                 category.getLeft_hand(), category.getRight_hand() };  
  42.         try {  
  43.             runner.update(sql, params);  
  44.         } catch (SQLException e) {  
  45.             throw new RuntimeException(e);  
  46.         }  
  47.     }  
  48.   
  49.     @SuppressWarnings("unchecked")  
  50.     public List<Category> selectParent(String id) {  
  51.         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());  
  52.         String sql = "select p.id,p.name,p.left_hand,p.right_hand from category p,category c where p.left_hand <= c.left_hand and p.right_hand >= c.right_hand and c.id=? order by p.left_hand";  
  53.         Object[] params = { id };  
  54.         try {  
  55.             return (List<Category>) runner.query(sql, new BeanListHandler(  
  56.                     Category.class), params);  
  57.         } catch (SQLException e) {  
  58.             throw new RuntimeException(e);  
  59.         }  
  60.     }  
  61.   
  62.     public void updateCategory(int left_hand) {  
  63.         String sql = "update category set left_hand=left_hand+2 where left_hand>? ";  
  64.         QueryRunner runner = new QueryRunner(JdbcUtils.getDataSource());  
  65.         try {  
  66.             runner.update(sql, left_hand);  
  67.         } catch (SQLException e) {  
  68.             throw new RuntimeException(e);  
  69.         }  
  70.         sql = "update category set right_hand=right_hand+2 where right_hand>=? ";  
  71.         try {  
  72.             runner.update(sql, left_hand);  
  73.         } catch (SQLException e) {  
  74.             throw new RuntimeException(e);  
  75.         }  
  76.     }  
  77. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java树形结构的封装可以通过递归思路进行构建。可以定义一个树节点数据类,其中包含节点的ID、父节点ID、节点名称以及子节点列表等信息。可以使用Lombok库来简化代码,省略实体类的set()和get()方法。引入Lombok的Jar包后,可以使用@Data注解来自动生成这些方法。\[1\] 在树节点数据类中,可以定义入参和出参,使用泛型来处理通用的基本信息。可以使用@Builder注解来生成构建器方法,方便创建对象。\[2\] 另外,可以定义一个TreeNode类来表示每个节点的信息,包括节点ID、父节点ID、节点名称以及子节点列表。可以使用@Getter和@Setter注解来自动生成get和set方法。\[3\] 通过递归的方式,可以根据给定的数据构建树形结构。可以根据节点的父节点ID来递归地将节点添加到对应的父节点的子节点列表中,最终形成完整的树形结构。 这样封装的树形结构可以方便地返回给前端,并以下拉菜单等形式进行展示。 #### 引用[.reference_title] - *1* *3* [Java后端递归构建树形结构](https://blog.csdn.net/a18505947362/article/details/122458089)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [java代码封装的树型通用结构](https://blog.csdn.net/weixin_41905047/article/details/128889084)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值