Spring Boot中实现一个递归获取省市区行政区划代码

Spring Boot中实现一个递归获取省市区行政区划代码

写于20240924 10:23

在Spring Boot中实现一个递归获取省市区行政区划代码的功能,可以按照以下步骤进行。我们将使用Spring Data JPA来与数据库交互,并构建一个递归的方法来获取层级数据。
首先这里数据库使用
mysql
jdk17
springboot3.3.2


下面开始实际案例分析:

1、定义实体类 Geographic

首先,定义一个实体类 Geographic,它将映射到数据库中的行政区划表。假设表中有字段 idnameparentId 来表示每个区域的唯一标识、名称及其父区域的ID。

package com.dependencies.springdatajpa.entity;import jakarta.persistence.*;
import lombok.Data;import java.util.ArrayList;
import java.util.List;/*** @author zhizhou   2024/9/24 09:56*/
@Data
@Entity
@Table(name = "geographic")
public class Geographic {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;private String code;@Column(name = "parent_id")private Long parentId;@Transientprivate List<Geographic> children = new ArrayList<>();
}

2、创建 GeographicRepository

使用Spring Data JPA创建一个仓库接口,以便于查询数据库。

package com.dependencies.springdatajpa.repository;import com.dependencies.springdatajpa.entity.Geographic;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;import java.util.List;/*** @author zhizhou   2024/9/24 09:55*/
@Repository
public interface GeographicRepository extends JpaRepository<Geographic, Long> { List<Geographic> findByParentId(Long parentId);
}

3、实现 GeographicService

在服务层中实现递归获取行政区划数据的方法 getGeographicListData

package com.dependencies.springdatajpa.service;import com.dependencies.springdatajpa.entity.Geographic;
import com.dependencies.springdatajpa.repository.GeographicRepository;
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;import java.util.ArrayList;
import java.util.List;/*** @author zhizhou   2024/9/24 09:55*/
@Service
public class GeographicService {@Autowiredprivate GeographicRepository geographicRepository;/*** V2 递归获取行政区划数据* @param parentId 父级ID,根节点传入null或0* @return 行政区划列表*/public List<Geographic> getGeographicListData(Long parentId) {List<Geographic> list = geographicRepository.findByParentId(parentId);for (Geographic geographic : list) {// 递归获取子节点List<Geographic> children = getGeographicListData(geographic.getId());geographic.setChildren(children);}return list;}//V2 批量查询:一次性查询所有数据,并在内存中构建树结构public List<Geographic> getGeographicListDataAll(Long parentId) {List<Geographic> allGeographics = geographicRepository.findAll();return buildTree(allGeographics, parentId);}private List<Geographic> buildTree(List<Geographic> all, Long parentId) {List<Geographic> tree = new ArrayList<>();for (Geographic geo : all) {if (geo.getParentId().equals(parentId)) {geo.setChildren(buildTree(all, geo.getId()));tree.add(geo);}}return tree;}}

4、创建 GeographicController 控制器

为了让前端能够调用该服务,我们可以创建一个控制器来暴露一个REST API端点。

获取行政区划列表这里提供了两种思路,依据实际场景进行实践,数据层级相对较小并发量较小时都可以采用,但当书记层级较深,频繁的查询数据库会造成没必要的资源消耗。

这里推荐第二种方案,批量查询:一次性查询所有数据,并在内存中构建树结构,省市区大概3180多条,数据量相对还好,内存大概不到1M,500KB左右。

package com.dependencies.springdatajpa.controller;import com.dependencies.springdatajpa.entity.Geographic;
import com.dependencies.springdatajpa.service.GeographicService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.List;/*** @author zhizhou   2024/9/24 09:54*/
@RestController
@RequestMapping("/api/geographics")
public class GeographicController {@Autowiredprivate GeographicService geographicService;/*** 获取行政区划列表(遍历查询数据库)* @param parentId 父级ID,可选参数,根节点传入null或不传* @return 行政区划列表*/@GetMappingpublic List<Geographic> getGeographics(@RequestParam(value = "parentId", required = false) Long parentId) {// 如果parentId为空,设为0或null,根据实际情况if (parentId == null) {parentId = 0L; // 假设根节点的parentId为0}return geographicService.getGeographicListData(parentId);}/*** 获取行政区划列表(批量查询:一次性查询所有数据,并在内存中构建树结构,省市区大概3180多条,数据量相对还好,内存大概不到1M,500KB左右)* @param parentId 父级ID,可选参数,根节点传入null或不传* @return 行政区划列表*/@GetMapping(value="/all")public List<Geographic> getGeographicsAll(@RequestParam(value = "parentId", required = false) Long parentId) {// 如果parentId为空,设为0或null,根据实际情况if (parentId == null) {parentId = 0L; // 假设根节点的parentId为0}return geographicService.getGeographicListDataAll(parentId);}  
}

5、数据库配置文件

确保在 application.properties 中正确配置了数据库连接。使用MySQL数据库:

spring.application.name=spring-data-jpa# MySQL Database configuration
spring.datasource.url=jdbc:mysql://localhost:3306/spring-dependencies?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

6、 示例数据

确保数据库中有相应的行政区划数据。例如:

idnamecodeparent_id
1北京市1100000
2朝阳区1101051
3海淀区1101081
4上海市3100000
5浦东新区3101154
6徐汇区3101044

7、debug测试

启动Spring Boot应用后,可以通过以下方式测试API:

  • 获取所有省级行政区(假设parentId=0为省级)

    GET http://localhost:8080/api/geographics?parentId=0
    
  • 获取特定省市的子级行政区

    GET http://localhost:8080/api/geographics?parentId=1
    
  • 获取特定省市的子级行政区

    GET http://localhost:8080/api/geographics/all?parentId=1
    

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544253.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

11周年 | 初心不改,焕新前行,奔赴下一个10年!

2024年8月13日&#xff0c;爱加密正式迎来了11岁生日&#xff0c;在爱加密肩负着崇高使命踏浪而行的10年间&#xff0c;蓝绿色的品牌标识一直伴于左右。随着时代的变迁以及市场需求的不断变化&#xff0c;企业同样也需要在品牌上做出创新递进&#xff0c;从而更加适应市场竞争的…

数据科学的秘密武器:defaultdict——Python字典的自动化填充神器,让数据结构更灵活

目录 什么是defaultdict 引入动机 创建与初始化 工作原理 自定义默认值函数 注意事项 使用案例 使用场景 1: 计数 使用场景 2: 分组数据 使用场景 3: 嵌套字典结构 进阶案例使用 进阶案例 1: 使用 defaultdict 实现词频统计并排序 进阶案例 2: 使用 defaultdict 实…

OpenCSG推出StarShip SecScan:AI驱动的软件安全革新

OpenCSG 导读 如今&#xff0c;IT 技术迅速发展&#xff0c;软件安全不仅是企业稳健运营的基础&#xff0c;更是整个社会经济体系安全的保障。加强软件安全&#xff0c;尤其是在开发阶段识别和修补漏洞&#xff0c;是企业必须重视的问题。国际数据公司&#xff08;IDC&#xf…

MyBatis 入门教程-搭建入门工程

Maven作为一个优秀的项目构建和管理工具,在日常的开发中被大多数开发者使用,后续的项目也是基于Maven来构建。 创建一个Maven项目 利用IDEA创建项目工具来创建一个Maven项目 添加MyBatis的依赖 这里可以从Maven仓库地址中进行查看, https://mvnrepository.com/ 从这里可…

反汇编—switch

x64和x86分析类似 标号1的位置要计算出&#xff1a;减去(debug) / 加上(release)第一个case要等于0&#xff0c;因为第一个case在跳转表数组的0下标位置 通过1和2&#xff0c;可以知道它们应该是连续case&#xff0c;还要判断是否缺项&#xff0c;进入跳转表看 可以看到原本应…

经济型伺服电缸EMB系列

经济型伺服电缸系列特点 小型电缸&#xff0c;推力范围:5kg-1500kg 精巧设计 所有部件模块化组合&#xff0c;标准化&#xff0c;经济化 轧制滚珠丝杠&#xff0c;高效率&#xff0c;高速度 匹配经济型步进伺服电机驱动器一体化&#xff0c;可总线 can&#xff0c;erthercat等&…

NAS求变,“0成本、低门槛”的鲁大师能否脱颖而出?

互联网科技的高速发展&#xff0c;推动了全球信息爆炸的进程。如何高效地存储和使用这些海量数据成了困扰企业、乃至个人的一大难题。从U盘、到移动硬盘、再到各种网云盘、以及愈发大众化的NAS……存储解决方案也随着个人及家庭数据存储需求的不断增长而发展着。如今&#xff0…

shardingjdbc-读写分离配置

文章目录 1、application.yml2、shardingsphere.yaml3、创建实体类 User4、创建 UserMapper5、添加依赖6、读写分离测试7、事务测试 我们的主从复制已经提前搭建好&#xff1a; mysql-搭建主从复制&#xff1a;https://blog.csdn.net/m0_65152767/article/details/142214434 1…

AI最大的应用是什么,如何成为初代AGI产品经理?

❝ 在当今这个由数据驱动的时代&#xff0c;AI技术正以前所未有的速度发展&#xff0c;它不仅改变了我们与数字世界的互动方式&#xff0c;更在物理世界中掀起了一场革命。阿里巴巴集团CEO吴泳铭在2024云栖大会上的演讲&#xff0c;为我们描绘了AI技术未来的巨大潜力。他指出&a…

华为云长江鲲鹏深度赋能,大势智慧稳居“实景三维+AI”领域排头兵

本文转自长江日报大武汉客户端 走出象牙塔第10年&#xff0c;武汉大势智慧科技有限公司&#xff08;以下简称“大势智慧”&#xff09;已成长为国内三维技术创新及应用领域龙头企业&#xff0c;其自主研发的“重建大师”等三维测绘软件系统在各级测绘系统占有率达到87.5%。 这…

奇迹再现!帕金森患者6年后停药,竟能自如行走:背后的故事与启示

在医学的浩瀚星空中&#xff0c;总有一些故事如同璀璨星辰&#xff0c;照亮着患者与家属的希望之路。今天&#xff0c;我们要讲述的&#xff0c;就是一位与帕金森病抗争了6年之久的患者&#xff0c;如何在看似不可能的境遇下&#xff0c;实现了停药后自如行走的奇迹。这不仅是对…

前端——元素类型+文字样式

一、元素类型 1. 块级元素 >块级标签: div p h1~h6 ul ol li dl dt dd hr br等 还有表格标签 table 特征: 1.独占一行 不会共享一行的位置 2.不设置宽度 默认是继承父级宽度 100% 结构上没有父级那就是浏览器 3.高度不设置 默认由内容撑开 4.可…

mock虚拟接口技术

一、什么是mock mock指的就是使用mock创建出来的一个虚拟的接口 二、对于测试人员而言&#xff0c;我们为什么要使用mock 当我们进行接口测试时&#xff0c;如果对应的接口还没有开发好&#xff0c;但是我们又需要用到这个接口响应的信息&#xff0c;这个时候我们就可以使用…

学习threejs,绘制二维线

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制二维线1. ☘️…

筛子排序(SieveSort)

当你手头有了支持AVX-512&#xff08;SIMD&#xff09;的i9-11900K&#xff0c;你最想做什么&#xff1f; i9-11900K&#xff1f;现在都14代了&#xff0c;谁还用11代的&#xff1f; 但12代以上就没有AVX-512了&#xff01; AVX-512有什么特别之处&#xff1f;有了这个硬件支…

Redis 的 Java 客户端有哪些?官方推荐哪个?

Redis 官网展示的 Java 客户端如下图所示&#xff0c;其中官方推荐的是标星的3个&#xff1a;Jedis、Redisson 和 lettuce。 Redis 的 Java 客户端中&#xff0c;Jedis、Lettuce 和 Redisson 是最常用的三种。以下是它们的详细比较&#xff1a; Jedis&#xff1a; 线程安全&…

安卓13设置动态修改设置显示版本号 版本号增加信息显示 android13增加序列号

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号 在这里显示了系统的一些信息,但是这里面的信息并不包含序列号之类的信息,我们修改下系统设置,在这里增加上相关的序列号。 2.问题分析…

【Linux】Linux基本命令

目录 文件和目录操作&#xff1a; ls cd pwd cp mv rm mkdir rmdir touch clear history which/whereis 文件查看和编辑&#xff1a; cat less head tail vi 或 vim sz/rz echo 系统信息和管理&#xff1a; su uname hostname df free top ps ki…

高可用集群keepalived---实战案例1

目录 一、环境: 二、文件的配置 1、server1 下载keepalived 创建etc下的keepalived目录,编辑配置文件 开机启动keepalived 安装Nginx 启动keepalived 2、server2 下载keepalived 创建etc下的keepalived目录,编辑配置文件 开机启动keepalived 安装Nginx 启动keepali…

软件企业毛利率正在变得越来越低

软件开发毛利率逐渐降低的现象可能受到多种因素的影响&#xff1a; 市场竞争加剧&#xff1a;随着软件行业的快速发展&#xff0c;市场上的软件产品和服务越来越多&#xff0c;竞争也越来越激烈。为了在市场上保持竞争力&#xff0c;软件企业可能不得不降低价格&#xff0c;这直…