最近项目中有需要获取全国行政区划省-市-区县-乡镇、街道办的树状结构数据,现将自己获取树的方法总结如下,有不到之处,敬请批评指正!

一、全国行政区划数据的整理以及获取

  1. 获取地址:https://pan.baidu.com/s/19JxdWH1R4z_HrrodFJUfjw?pwd=7bey    提取码:7bey
  2. 创建表

二、java代码示例

  • AreaTreeMapper.xml的编写 

    <select id="selectSymptomTreeNodeJson" resultType="com.boot.mybatis.entity.CategoryTreeNode">
      SELECT dq_id as id,dq_name AS title,parent_id as parentId FROM ft_sys_dq
    </select>

  • CategoryTreeNode实体类的编写

    • /**
      * @Project:
      * @Description:
      * @Auther: songwp
      * @Date: 2022/2/14 19:41
      **/
      @Data
      public class CategoryTreeNode {
      private BigInteger id;
      private String title;
      private BigInteger parentId;
      private List<CategoryTreeNode> children = new ArrayList<>();
      }

  • AreaTreeMapper接口编写

    /**
    * @Project:
    * @Description:
    * @Auther: songwp
    * @Date: 2022/2/14 19:44
    **/
    @Mapper
    public interface AreaTreeMapper {
      List<CategoryTreeNode> selectSymptomTreeNodeJson();
    }

  • AreaTreeService业务接口编写

    /**
    * @Project:
    * @Description:
    * @Auther: songwp
    * @Date: 2022/2/14 19:52
    **/
    public interface AreaTreeService {

      List<CategoryTreeNode> getSymptomTreeJson();
    }

  • AreaTreeServiceImpl的业务实现类编写

    • /**
      * @Project:
      * @Description:
      * @Auther: songwp
      * @Date: 2022/2/14 19:53
      **/
      @Service
      public class AreaTreeServiceImpl implements AreaTreeService {

      @Resource
      AreaTreeMapper areaTreeMapper;

      @Override
      public List<CategoryTreeNode> getSymptomTreeJson() {
      //从数据库获取数据的list(一次性获取的所有数据)
      List<CategoryTreeNode> list= areaTreeMapper.selectSymptomTreeNodeJson();
      List<CategoryTreeNode> resultList = new ArrayList<>();
      TreeUtil treeUtilNew = new TreeUtil();
      resultList = treeUtilNew.build(list); //进行封装
      return resultList; //返回树形结构json
      }
      }

  • AreaTreeController的编写  
    • /**
      * @Project:
      * @Description:
      * @Auther: songwp
      * @Date: 2022/2/14 19:57
      **/
      @RestController
      public class AreaTreeController {

      @Autowired
      AreaTreeService areaTreeService;

      @GetMapping("/getTreeList")
      public List<CategoryTreeNode> getTreeList(){
      return areaTreeService.getSymptomTreeJson();
      }

      }

  • TreeUtil的编写

    /**
    * @Project:
    * @Description: 构架树结构树形json--好用
    * @Auther: songwp
    * @Date: 2022/2/14 19:39
    **/
    public class TreeUtil {

    /**
    * 根据pid,构建树节点
    */
    public static <T extends CategoryTreeNode> List<T> build(List<T> treeNodes, Integer pid) {

      List<T> treeList = new ArrayList<>();
      for(T treeNode : treeNodes) {
        if (pid.equals(treeNode.getParentId())) {
          treeList.add(findChildren(treeNodes, treeNode));
        }
      }
    return treeList;
    }

    /**
    * 查找子节点
    */
    private static <T extends CategoryTreeNode> T findChildren(List<T> treeNodes, T rootNode) {
      for(T treeNode : treeNodes) {
        if(rootNode.getId().equals(treeNode.getParentId())) {
          rootNode.getChildren().add(findChildren(treeNodes, treeNode));
        }
      }
      return rootNode;
    }

    /**
    * 构建树节点
    */
    public static <T extends CategoryTreeNode> List<T> build(List<T> treeNodes) {
      List<T> result = new ArrayList<>();
      //list转map
      Map<BigInteger, T> nodeMap = new LinkedHashMap<>(treeNodes.size());
      for(T treeNode : treeNodes){
        nodeMap.put(treeNode.getId(), treeNode);
      }
      for(T node : nodeMap.values()) {
        T parent = nodeMap.get(node.getParentId());
          if(parent != null && !(node.getId().equals(parent.getId()))){
            parent.getChildren().add(node);
            continue;
            }

          result.add(node);
          }
        return result;
        }
    }

三、调用接口获取数据如下:

SpringBoot树获取方法总结的更多相关文章

  1. php 两种获取分类树的方法

    php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...

  2. SpringBoot中获取spring.profiles.active的值

    一.网上很多采用@Profile("dev")的方式获取,但是这个是类级别的 二.开发中可能需要代码级别 1.刚开始我想通过classpath下的文件读取方式,麻烦死了,于是换了个 ...

  3. SpringBoot web获取请求数据【转】

    SpringBoot web获取请求数据 一个网站最基本的功能就是匹配请求,获取请求数据,处理请求(业务处理),请求响应,我们今天来看SpringBoot中怎么获取请求数据. 文章包含的内容如下: 获 ...

  4. monkeyrunner之坐标或控件ID获取方法-续

    在之前的文章中,介绍过控件坐标和ID的获取方法,这里,我们再介绍一个新的工具-uiautomatorviewer. Uiautomatorviewer是Android sdk自带的工具,位置在sdk/ ...

  5. AspectJ获取方法注解的信息

    在使用Aspectj获取方法注解信息的时候,可以使用下面的代码片段: /** * Get value of annotated method parameter */ private <T ex ...

  6. Android应用启动时间及启动日志获取方法

    1. Android应用中,可以使用如下方式进行应用启动时间的查看 2. 启动日志获取方法:

  7. 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。

    先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素 复制代码 ...

  8. Java获取方法参数名、Spring SpEL解析

    @Test public void testParse() { //表达式解析 ExpressionParser expressionParser = new SpelExpressionParser ...

  9. <经验杂谈>C#中一种最简单、最基本的反射(Reflection):通过反射获取方法函数

    说起反射之前和很多用C#/.net的同仁们一样,相比于一般应用层对数据的增删改查总有点觉得深奥到难以理解.其实程序这东西,用过.实践过就很简单,我一直这么认为. 先说下概念:反射 Reflection ...

随机推荐

  1. nginxWebUI

    nginx网页配置工具 github: https://github.com/cym1102/nginxWebUI 功能说明 本项目可以使用WebUI配置nginx的各项功能, 包括http协议转发, ...

  2. 关于Mysql的Qcache优化

    query_cache_size = 64M 指定MySQL查询缓冲区的大小.可以通过在MySQL控制台执行以下命令观察:# > SHOW VARIABLES LIKE '%query_cach ...

  3. STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  4. k8s中的nginx-ingress如何配置路径重定向

    k8s中的nginx-ingress如何配置路径重定向 一. 需求描述 路径重定向的一般应用场景: 调整用户浏览的URL,看起来更规范 为了让搜索引擎收录网站内容,让用户体验更好 网站更换新域名后 根 ...

  5. Java 异常分析

    Java 异常分析 本文是对以下内容的分析: Java异常设计 Java 异常分类 Java异常可以告诉什么问题 Java异常处理最佳实践 Java Exception 是为了处理应用程序的异常行为而 ...

  6. Web开发之Cookie and Session

    会话 什么是会话? 简单说:用户开一个浏览器,点击多个超链接,访问服务器的多个web资源,然后关闭浏览器,整个过程就称之为一个会话. 会话过程要解决什么问题 每个用户在使用浏览器与服务器进行会话的过程 ...

  7. 《剑指offer》面试题36. 二叉搜索树与双向链表

    问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜 ...

  8. JavaScript中数字常用方法

    数字常用方法 (1)返回0-1(不包含1)随机小数(random()) 格式:Math.random() var num=parseInt(Math.random()*11) //拿到0-10中的随机 ...

  9. dgv 自动换行

    //设置自动换行 dgv.DefaultCellStyle.WrapMode = DataGridViewTriState.True; //设置自动调整高度 dgv.AutoSizeRowsMode ...

  10. spring 事务失效的几种场景

    以下场景是基于mysql数据库,InnoDB的存储引擎. 一.没有添加@Transactional注解 二.方法声明是private或者static 三.没有抛出异常而是try catch了异常 下面 ...