SpringBoot树获取方法总结
最近项目中有需要获取全国行政区划省-市-区县-乡镇、街道办的树状结构数据,现将自己获取树的方法总结如下,有不到之处,敬请批评指正!
一、全国行政区划数据的整理以及获取
- 获取地址:https://pan.baidu.com/s/19JxdWH1R4z_HrrodFJUfjw?pwd=7bey 提取码:7bey
- 创建表


二、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树获取方法总结的更多相关文章
- php 两种获取分类树的方法
php 两种获取分类树的方法 1. /** * 获取分类树 * @param array $array 数据源 * @param int $pid 父级ID * @param int $level 分 ...
- SpringBoot中获取spring.profiles.active的值
一.网上很多采用@Profile("dev")的方式获取,但是这个是类级别的 二.开发中可能需要代码级别 1.刚开始我想通过classpath下的文件读取方式,麻烦死了,于是换了个 ...
- SpringBoot web获取请求数据【转】
SpringBoot web获取请求数据 一个网站最基本的功能就是匹配请求,获取请求数据,处理请求(业务处理),请求响应,我们今天来看SpringBoot中怎么获取请求数据. 文章包含的内容如下: 获 ...
- monkeyrunner之坐标或控件ID获取方法-续
在之前的文章中,介绍过控件坐标和ID的获取方法,这里,我们再介绍一个新的工具-uiautomatorviewer. Uiautomatorviewer是Android sdk自带的工具,位置在sdk/ ...
- AspectJ获取方法注解的信息
在使用Aspectj获取方法注解信息的时候,可以使用下面的代码片段: /** * Get value of annotated method parameter */ private <T ex ...
- Android应用启动时间及启动日志获取方法
1. Android应用中,可以使用如下方式进行应用启动时间的查看 2. 启动日志获取方法:
- 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比。
先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比. JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素 复制代码 ...
- Java获取方法参数名、Spring SpEL解析
@Test public void testParse() { //表达式解析 ExpressionParser expressionParser = new SpelExpressionParser ...
- <经验杂谈>C#中一种最简单、最基本的反射(Reflection):通过反射获取方法函数
说起反射之前和很多用C#/.net的同仁们一样,相比于一般应用层对数据的增删改查总有点觉得深奥到难以理解.其实程序这东西,用过.实践过就很简单,我一直这么认为. 先说下概念:反射 Reflection ...
随机推荐
- python requests发起请求,报“Max retries exceeded with url”
需要高频率重复调用一个接口,偶尔会出现"Max retries exceeded with url" 在使用requests多次访问同一个ip时,尤其是在高频率访问下,http连接 ...
- 初识python: 异常处理
异常处理基本语法: try: pass except Exception,ex: pass 常用异常种类: AttributeError 试图访问一个对象,没有的属性.比如foo.x,但是foo没有属 ...
- Redis_设置密码
一.临时设置密码 # 获取密码 config get requirepass # 设置密码为123456 config set requirepass 123456 # 验证密码.当设置密码后,进入r ...
- Django_环境配置(一)
一.安装Django # 在CMD中运行 pip install django # 查看djangp版本 python manage.py version 二.创建项目 # 在CMD中运行django ...
- kubeadm 安装Kubernetes 1.16.3 (CentOS7+IPVS+Calico)
目录 · . 一.更新系统内核(全部节点) · . 二.基础环境设置(全部节点) · . 1.修改 Host · . 2.修改 Hostname · . 3.主机时间同步 · . 4.关闭 ...
- sqlplus -S参数表示什么意思?
sqlplus -S , -S选项是静默模式,是Silent的缩写.在这种模式下将会以最精简的形式完成SQL*Plus的交互过程. -S模式多用于脚本模式.在命令行sqlplus -S还有可能出现卡住 ...
- SYCOJ4972的幂次方
题目- 2的幂次方 (shiyancang.cn) 递归题 #include<bits/stdc++.h> using namespace std; int k; void f(int n ...
- css3中transition属性详解
css3中通过transition属性可以实现一些简单的动画过渡效果~ 1.语法 transition: property duration timing-function delay; transi ...
- java日志打印使用指南
一.简介 日志打印是java代码开发中不可缺少的重要一步. 日志可以排查问题,可以搜集数据 二.常用日志框架 比较常用的日志框架就是logback, 一些老项目会使用log4j,他们用的都是slf4j ...
- 通过UI库深入了解Vue的插槽的使用技巧
Vue官网对于插槽的介绍比较简略,插槽本身也比较"烧脑",很容易看晕,我就一直没看懂,直到 使用了element-plus的组件的插槽. 其实我们可以换一个角度来理解插槽,就会豁然 ...