三级分层查询省市区数据

1、数据库数据

在这里插入图片描述
*

2、实现的效果

在这里插入图片描述

3、controller层

@Api(tags = "地址库")
@RestController
@RequestMapping("/basic/city")
public class DataTChinaCityController extends BaseController {@Resourceprivate IProductSaleDeliveryService productSaleDeliveryService;/*** 查询地址库-三级联动*/@GetMapping(value = "/queryCity")public AjaxResult queryCity() {return AjaxResult.success(productSaleDeliveryService.cacheChinaCityDataWhereLevel());}
}

4、Service层

public interface IProductSaleDeliveryService {/*** 缓存,查询地址库-三级联动** @return 全国城市数据*/Collection<BaseDataTChinaCity> cacheChinaCityDataWhereLevel();}

5、实现层

@Service
public class ProductSaleDeliveryServiceImpl implements IProductSaleDeliveryService {// 配合guava缓存一起使用,依赖自己搜素添加即可
// 创建缓存Cache<String, Object> chinaCityDataCache = Caffeine.newBuilder().expireAfterAccess(2, TimeUnit.HOURS) // 访问后过期时间 2小时.initialCapacity(64) // 设置初始容量.maximumSize(128) // 设置缓存的最大容量.build();@Resourcepublic IBaseDataTChinaCityService baseDataTChinaCityService;/*** 缓存,查询地址库-三级联动** @return 全国城市数据*/@Overridepublic Collection<BaseDataTChinaCity> cacheChinaCityDataWhereLevel() {try {// 设置redis的keyString redisKey = "juepeiscm:basedata:china:city:leveldata";if (chinaCityDataCache.getIfPresent(redisKey) != null) {return (Collection<BaseDataTChinaCity>) chinaCityDataCache.getIfPresent(redisKey);}// 三级联动Collection<BaseDataTChinaCity> baseDataTChinaCityCollections = baseDataTChinaCityService.queryCity();// 放入缓存chinaCityDataCache.put(redisKey, baseDataTChinaCityCollections);return baseDataTChinaCityCollections;} catch (Exception e) {log.error("服务产品小程序获取全国城市数据失败=", e);}return null;}
}

6、地址库对象 t_china_city

@ApiModel(description ="地址库")
@Data
public class BaseDataTChinaCity extends BaseEntity {private static final long serialVersionUID = 1L;/*** id*/@ApiModelProperty(value = "id")private Long indexId;@ApiModelProperty(value = "ids")private List<Long> indexIds;@ApiModelProperty(value = "城市名称")@Excel(name = "城市名称")private String cityName;/*** 父级ID*/@ApiModelProperty(value = "父级ID")@Excel(name = "父级ID")private Long parentId;@ApiModelProperty(value = "父级IDs")private List<Long> parentIds;/*** 层级*/@ApiModelProperty(value = "层级")@Excel(name = "层级")private Integer addressLevel;/*** 省*/@ApiModelProperty(value = "省")@Excel(name = "省")private String province;/*** 市*/@ApiModelProperty(value = "市")@Excel(name = "市")private String city;/*** 区*/@ApiModelProperty(value = "区")@Excel(name = "区")private String district;/*** 区域*/@ApiModelProperty(value = "区域")@Excel(name = "区域")private String area;/*** 0:启用  1:作废*/@ApiModelProperty(value = "0:启用  1:作废")@Excel(name = "0:启用  1:作废")private Integer status;@ApiModelProperty(value = "子级")List<BaseDataTChinaCity> children;@ApiModelProperty(value = "城市名称")String label;@ApiModelProperty(value = "城市名称")String value;public String getLabel() {return cityName;}public void setLabel(String label) {this.label = label;}public String getValue() {return cityName;}public void setValue(String value) {this.value = value;}@ApiModelProperty(value = "bms推送状态(0:未推送,1:推送成功,2:推送失败)")private Integer bmsSendStatus;@ApiModelProperty(value = "bms推送次数")private Integer bmsSendNum;@ApiModelProperty(value = "bms最后推送时间")private Date bmsLastSendTime;}

7、地址库Service接口

public interface IBaseDataTChinaCityService {
/*** 查询地址库-三级联动(不带参数)*/Collection<BaseDataTChinaCity> queryCity();
}

8、查询地址库-三级联动(不带参)

@Service
public class BaseDataTChinaCityServiceImpl implements IBaseDataTChinaCityService {@Autowiredprivate BaseDataTChinaCityMapper baseDataTChinaCityMapper;/*** 查询地址库-三级联动(不带参)** @return 结果*/@Overridepublic Collection<BaseDataTChinaCity> queryCity() {return queryCityByEntity(null);}
}/*** 查询地址库-三级联动(方法提取)** @return 结果*/public Collection<BaseDataTChinaCity> queryCityByEntity(BaseDataTChinaCity baseDataTChinaCity) {//查询所有城市List<BaseDataTChinaCity> provinceList = baseDataTChinaCityMapper.queryCity(baseDataTChinaCity);return getCityByEntity(provinceList);}public Collection<BaseDataTChinaCity> getCityByEntity(List<BaseDataTChinaCity> provinceList){Map<Long, BaseDataTChinaCity> oneLevel = new HashMap<>();Map<Long, List<BaseDataTChinaCity>> twoLevel = new HashMap<>();Map<Long, List<BaseDataTChinaCity>> threeLevel = new HashMap<>();for (BaseDataTChinaCity city : provinceList) {switch (city.getAddressLevel()) {case 1:oneLevel.put(city.getIndexId(), city);break;case 2:twoLevel.computeIfAbsent(city.getParentId(), k -> new ArrayList<>());twoLevel.get(city.getParentId()).add(city);break;case 3:threeLevel.computeIfAbsent(city.getParentId(), k -> new ArrayList<>());threeLevel.get(city.getParentId()).add(city);break;default:break;}}for (Map.Entry<Long, List<BaseDataTChinaCity>> tmp :twoLevel.entrySet()) {for (BaseDataTChinaCity parentEntity :tmp.getValue()) {parentEntity.setChildren(threeLevel.get(parentEntity.getIndexId()));}}for (Map.Entry<Long, BaseDataTChinaCity> tmp :oneLevel.entrySet()) {BaseDataTChinaCity parent = tmp.getValue();parent.setChildren(twoLevel.get(parent.getIndexId()));}return oneLevel.values();}

9、地址库Mapper接口

@Mapper
public interface BaseDataTChinaCityMapper {
/*** 查询地址库-三级联动** @param baseDataTChinaCity 地址库* @return 结果*/List<BaseDataTChinaCity> queryCity(BaseDataTChinaCity baseDataTChinaCity);}<select id="queryCity" parameterType="BaseDataTChinaCity" resultMap="BaseDataTChinaCityResult"><include refid="selectTChinaCityVo"/><where><if test="parentId != null ">and parent_id = #{parentId}</if><if test="addressLevel != null ">and address_level = #{addressLevel}</if><if test="province != null  and province != ''">and province = #{province}</if><if test="city != null  and city != ''">and city = #{city}</if><if test="district != null  and district != ''">and district = #{district}</if><if test="area != null  and area != ''">and area = #{area}</if><if test="status != null ">and status = #{status}</if><if test="bmsSendStatus != null">and bms_send_status = #{bmsSendStatus}</if><if test="indexId != null">and index_id = #{indexId}</if><if test="indexIds != null and indexIds.size() > 0">and index_id in<foreach collection="indexIds" item="item" separator="," open="(" close=")">#{item}</foreach></if><if test="parentIds != null and parentIds.size() > 0">and parent_id in<foreach collection="parentIds" item="item" separator="," open="(" close=")">#{item}</foreach></if></where></select><sql id="selectTChinaCityVo">select index_id, parent_id, address_level, province, city, district, status,city_name,area from t_china_city</sql><resultMap type="BaseDataTChinaCity" id="BaseDataTChinaCityResult"><result property="indexId" column="index_id"/><result property="cityName" column="city_name"/><result property="parentId" column="parent_id"/><result property="addressLevel" column="address_level"/><result property="province" column="province"/><result property="city" column="city"/><result property="district" column="district"/><result property="area" column="area"/><result property="status" column="status"/></resultMap>

学费了吗?有问题请留言!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+Vue的旅游系统、前后端分离

博主24h在线&#xff0c;想要源码文档部署视频直接私聊&#xff0c;低价有偿&#xff01; 基于SpringBootVue的旅游系统、前后端分离 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI 工具&#xff1a;IDEA/Eci…

船舶IMO识别码是什么?

船舶编码和编码体系比较多&#xff0c;主要有船舶登记号、船检登记号、船舶呼号、IMO号、船舶MMSI、船体号等。 船舶的IMO Number&#xff08;国际海事组织识别码&#xff0c;下称IMO识别码&#xff09;是独一无二的&#xff0c;相当于船舶的身份证号码&#xff0c;并且此号码…

MYSQL多表联查on和where的区别

目录 一、背景 二、探究 2.1、统计每个班级中女生的数量 错误的写法 查询结果 正确的写法 查询结果 2.2、只统计"一班"的学生数量 错误的写法 查询结果 正确的写法 查询结果 三、总结 一、背景 在一次对数据进行统计的时候&#xff0c;需要对两张表进行…

spring技术体系的演进史

spring 最开始使用 spring 的时候&#xff0c;发现这个特别好用&#xff0c;最主要是把那些对象创建之前通过关键字 new 创建的方式把那些交给 spring ioc 容器来处理&#xff0c;其中 spring 还是使用了工厂模式来创建对应的对象。 然而这个时候需要自己写一堆配置&#xff…

SpringBoot内容协商(简单使用、源码解读、默认Converters、自定义Converters)

目录 1. 内容协商1.1 简单使用1.2 源码解读1.3 WebMvcAutoConfiguration提供几种默认HttpMessageConverters1.4 自定义HttpMessageConverter支持yaml格式输出 1. 内容协商 1.1 简单使用 一套系统适配多端数据返回 基于请求头内容协商&#xff1a;&#xff08;默认开启&#x…

C语言--分段函数

要求&#xff1a;写一个程序&#xff0c;输入x的值&#xff0c;输出y的值 思路&#xff1a;定义两个变量&#xff0c;一个y&#xff0c;一个x&#xff0c;当x<1时&#xff0c;yx&#xff0c;当x>1&&x<10&#xff0c;y2x-1&#xff0c;当x>10,y3x-11.用一个…

Linux 服务器监控

服务器几乎与任何 IT 基础设施密不可分&#xff0c;Linux 是服务器兼容性最强的开源操作系统&#xff0c;因为它具有灵活性、一致性和安全性。大多数 Linux 服务器都设置了以下 Linux 操作系统的任何变体&#xff1a;Red Hat Enterprise Linux &#xff08;RHEL&#xff09;、D…

Linux Shell和权限

目录 Shell命令及运行原理 权限 1.文件基本属性 2.文件权限值的表示方法 3.文件访问权限的相关设置方法 3.(1)chmod 组名修改 3.(2)chmod 二进制修改 3.(3)chown 3.(4)chgrp 3.(5)umask 4.目录权限 Shell命令及运行原理 Linux的操作系统&#xff0c;狭义上是…

看看顶级外贸业务员是如何跟进客户的?

许多外贸业务员&#xff0c;都碰到过客户跟进上的困难。那到底外贸业务员如何跟进客户&#xff0c;才能越跟越近&#xff0c;最终成交呢&#xff1f;本篇文章设定了几个客户回复的场景&#xff0c;看看顶尖销售都是怎么应对的吧&#xff1f; 一 客户说暂时没有需求 1.问清楚客…

案例研究|腾讯音乐娱乐集团与JumpServer共探安全运维审计解决方案

近年来&#xff0c;得益于人民消费水平的提升以及版权意识的加强&#xff0c;用户付费意愿和在线用户数量持续增长&#xff0c;中国在线音乐市场呈现出稳定增长的发展态势。随着腾讯音乐于2018年12月上市&#xff0c;进一步推动了中国在线音乐市场的发展。 腾讯音乐娱乐集团&a…

数据可视化:地图

1.基础地图的使用 如何添加颜色表示层级 代码实现 """基础地图的使用 """ from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 准备地图对象 map Map() # 准备数据 data [("北京市", 9),("上海市…

WebGL:基础练习 / 简单学习 / demo / canvas3D

一、前置内容 canvas&#xff1a;理解canvas / 基础使用 / 实用demo-CSDN博客 WebGL&#xff1a;开始学习 / 理解 WebGL / WebGL 需要掌握哪些知识 / 应用领域 / 前端值得学WebGL吗_webgl培训-CSDN博客 二、在线运行HTML 用来运行WebGL代码&#xff0c;粘贴--运行&#xff…

LangChain+LLM实战---Midjourney(v5.1) Prompt深度剖析

原文&#xff1a;Anatomy of Midjourney Promps: In-Depth Study for effective Prompting Strategies — V5.1 examples 作者&#xff1a;Michael King 你是否曾经发现自己盯着Midjourney的空白画布&#xff0c;手指悬停在键盘上&#xff0c;让我问自己&#xff1a;“我应该…

前端面试题之CSS篇

1、css选择器及其优先级 标签选择器: 1类选择器、属性选择器、伪类选择器&#xff1a;10id选择器&#xff1a;100内联选择器&#xff08;style“”&#xff09;&#xff1a;1000!important&#xff1a;10000 2、display的属性值及其作用 属性值作用none元素不显示&#xff0c…

使用VNC链接远程桌面

一、本地VNC客户端 本地主要需要一个VNC客户端&#xff0c;用来远程连接服务器端的VNC&#xff08;在不安装Web版本VNC情况下&#xff09;。VNC客户端下载地址&#xff1a; VNC客户端下载 二、安装Xfce桌面环境 在远程服务器控制台中安装Xfce桌面&#xff08;这个桌面环境比…

CSC公派遭美德拒签|计算机专业老师终赴意大利都灵理工大学访学

C老师拟申报CSC访学项目&#xff0c;希望先申请美国&#xff0c;并做好了一旦拒签再申请其它国家的心理准备。我们先用普渡大学的邀请函助其申报CSC&#xff0c;并顺利获批&#xff0c;但不出所料地被美国拒签了&#xff1b;很快又申请到德国奥芬堡应用技术大学&#xff0c;但不…

【Linux】简单部署Yearning并结合内网穿透实现公网访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单&#xff0c;高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开…

Jakarta-JVM篇

文章目录 一.前言1. 1 JVM-堆常用调参1.2 JVM-方法区常用参数1.3 JVM-codeCache 二.JVM内存结构三. 对象创建四. JVM垃圾回收算法4.1 可达性分析算法4.1.1 对象引用4.1.2 回收方法区. 4.2 分代回收4.3 标记清除4.4 标记复制4.5 标记整理 五.垃圾回收器5.1 根节点枚举5.2 安全点…

打造高效运营底座,极智嘉一体化软件系统彰显科技威能

在仓储成本和物流需求日益增加的今天&#xff0c;创新且高效的物流机器人解决方案能够显著提升物流运营效率&#xff0c;降低物流成本&#xff0c;实现智能化、精益化、一体化的物流管理。全球仓储机器人引领者极智嘉(Geek)以「一套系统&#xff0c;天生全能」为准则&#xff0…

python脚本-网页爬虫获取网页图片

python脚本-网页爬虫获取网页图片 代码 import requests import re import time url"http://10.9.47.154/python-spider/" # 爬取网站的url headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …