需求:

  根据数据库表,获取省市县的级连json数据,供前台下拉列表。效果图

  

表结构:

 1 CREATE TABLE `bxqk_pe_area` (
 2   `id` int(11) NOT NULL AUTO_INCREMENT,
 3   `fk_parent_id` int(11) DEFAULT NULL COMMENT '父id',
 4   `name` varchar(20) NOT NULL COMMENT '名称',
 5   `flag_active` varchar(50) NOT NULL COMMENT '是否有效',
 6   `type` int(11) NOT NULL COMMENT '类型(0:省、直辖市,1:市,2:区/县)',
 7   `is_delete` int(11) DEFAULT '0' COMMENT '是否删除',
 8   `create_user` varchar(50) DEFAULT NULL,
 9   `create_time` date DEFAULT NULL,
10   `update_user` varchar(50) DEFAULT NULL,
11   `update_time` date DEFAULT NULL,
12   `note` varchar(50) DEFAULT NULL,
13   PRIMARY KEY (`id`),
14   KEY `index_type` (`type`),
15   KEY `fk_area_parent` (`fk_parent_id`),
16   KEY `fk_area_enum_const_active` (`flag_active`),
17   CONSTRAINT `fk_area_enum_const_active` FOREIGN KEY (`flag_active`) REFERENCES `enum_const` (`ID`),
18   CONSTRAINT `fk_area_parent` FOREIGN KEY (`fk_parent_id`) REFERENCES `bxqk_pe_area` (`id`)
19 ) ENGINE=InnoDB AUTO_INCREMENT=7017 DEFAULT CHARSET=utf8 COMMENT='地区表';

思路:两种
先说好的一种(不管是效率还是扩展性都是更好)

直接上 代码:数据结构说明在代码后面

 1 /**
 2      * 省市县级json数据
 3      *
 4      * @return
 5      */
 6     @LogAndNotice("省市县级json数据")
 7     public List<Map<String, Object>> listArea() {
 8         List<Map<String, Object>> areas =  (List<Map<String, Object>>) redisCacheService.
 9                 getFromCache(BxqkTeachingConstant.CACHE_KEY_AREAS);
10         if (CollectionUtils.isEmpty(areas)) {
11             areas = this.listAreasFromDataBase(new ArrayList<>());
12             redisCacheService.putToCache(BxqkTeachingConstant.CACHE_KEY_AREAS, areas);
13         }
14
15         return areas;
16     }
17
18     /**
19      * 获取地址信息数据
20      *
21      * @param areas
22      * @return
23      */
24     @LogAndNotice("获取地址信息数据")
25     private List<Map<String, Object>> listAreasFromDataBase(List<Map<String, Object>> areas) {
26         List<Map<String, Object>> allList = this.myGeneralDao.
27                 getMapBySQL(" SELECT id, CONCAT(id, ',', type) value, name label, fk_parent_id parent " +
28                             " FROM bxqk_pe_area ORDER BY type, CONVERT (NAME USING gbk) ASC ");
29         if (CollectionUtils.isEmpty(allList)) {
30             throw new ParameterIllegalException();
31         }
32         Map<String, Object> areaMap = new HashMap<>(16);
33         allList.forEach(e -> {
34             String key = String.valueOf(e.get(BxqkTeachingConstant.ADDRESS_ID));
35             String parentKey = String.valueOf(e.get(BxqkTeachingConstant.ADDRESS_PARENT));
36             if (areaMap.containsKey(parentKey)) {
37                 Map<String, Object> value = (Map<String, Object>) areaMap.get(parentKey);
38                 value.putIfAbsent(BxqkTeachingConstant.ADDRESS_CHILDREN, new ArrayList<>());
39                 ((List<Map<String, Object>>)value.get(BxqkTeachingConstant.ADDRESS_CHILDREN)).add(e);
40                 areaMap.put(key, e);
41             } else {
42                 areaMap.put(key, e);
43                 areas.add(e);
44             }
45         });
46
47         return areas;
48     }

1 上述方法中的常量
2 BxqkTeachingConstant.java:
3
4     private String BxqkTeachingConstant.ADDRESS_ID = "id";
5     private String ADDRESS_PARENT = "parent";
6     private String ADDRESS_CHILDREN = "children";
7     private String CACHE_KEY_AREAS = "areas";

完事。数据——>

设计数据结构:

 1 数据结构:
 2     List<Map<String, Object>>    allList    数据库查出的所有数据
 3     List<Map<String, Object>>    areas    最终json数据
 4     Map<String, Object>         areaMap    遍历时存放维持子父间关系的临时map
 5
 6 数据结构关系如下(看懂的看,看不懂直接看代码)——> 不会画动图 =-=
 7
 8 allList:
 9 id        fk_parent_id
10 1         null
11 2         null
12 3         1
13 4         1
14 5         3
15 6         5
16
17 维持关系的areaMap
18 map<area> areaMap: {key:id , value:map}
19     new Map{1, childrens}
20         new Map{3, childrens}
21             new Map{5, childrens}
22         new Map{4, childrens}
23     new Map{2, childrens}
24     new Map{3, childrens}
25         new Map{5, childrens}
26
27     new Map{4, childrens}
28     new Map{5, childrens}
29
30 结果集:
31 list<map>    areas
32     new Map{1, childrens}
33     new Map{3, childrens}
34     new Map{5, childrens}
35     new Map{4, childrens}
36     new Map{2, childrens}

******************************************************************************************************************************************

第二种:(第一种看懂的这个直接pass掉!)

普通方法,现根据类型用3个集合分别存储省市县的信息,对3个list根据外键 fk_parent_id 父子关系遍历即可

代码简单,常量字符串不再列出

 1 /**
 2  * 省市县级联json数据
 3  *
 4  * @return
 5  */
 6 @LogAndNotice("省市县级联json数据")
 7 public List<Map<String, Object>> listArea() {
 8     List<Map<String, Object>> resultFromCache = (List<Map<String, Object>>) redisCacheService.
 9             getFromCache(BxqkTeachingConstant.PARAM_CACHE_PROVINCES);
10     if (CollectionUtils.isNotEmpty(resultFromCache)) {
11         return resultFromCache;
12     }
13     List<Map<String, Object>> result = new ArrayList<>();
14     List<Map<String, Object>> allList = this.myGeneralDao.getMapBySQL(
15             " SELECT id value, name label, fk_parent_id parent, type FROM bxqk_pe_area " +
16             " ORDER BY CONVERT (NAME USING gbk) ASC ");
17     if (CollectionUtils.isNotEmpty(allList)) {
18         List<Map<String, Object>> provinceList = new ArrayList();
19         List<Map<String, Object>> cityList = new ArrayList();
20         List<Map<String, Object>> countyList = new ArrayList();
21         allList.forEach(e -> {
22             Map<String, Object> map = new HashMap<>(16);
23             if (String.valueOf(e.get(BxqkTeachingConstant.PARAM_ADDRESS_TYPE))
24                     .equals(BxqkTeachingConstant.PARAM_PROVINCE_TYPE_CODE)) {
25                 provinceList.add(e);
26             } else if (String.valueOf(e.get(BxqkTeachingConstant.PARAM_ADDRESS_TYPE))
27                     .equals(BxqkTeachingConstant.PARAM_CITY_TYPE_CODE)) {
28                 cityList.add(e);
29             } else if (String.valueOf(e.get(BxqkTeachingConstant.PARAM_ADDRESS_TYPE))
30                     .equals(BxqkTeachingConstant.PARAM_COUNTY_TYPE_CODE)) {
31                 countyList.add(e);
32             }
33         });
34         provinceList.forEach(e ->{
35             Map<String, Object> provinceMap = new LinkedHashMap<>();
36             provinceMap.put(BxqkTeachingConstant.PARAM_ADDRESS_VALUE,
37                     e.get(BxqkTeachingConstant.PARAM_ADDRESS_VALUE) + "," + e.get(BxqkTeachingConstant.PARAM_ADDRESS_TYPE));
38             provinceMap.put(BxqkTeachingConstant.PARAM_ADDRESS_LABEL, e.get(BxqkTeachingConstant.PARAM_ADDRESS_LABEL));
39
40             List<Map<String, Object>> secondList = new ArrayList<>();
41             cityList.forEach(c -> {
42                 if (String.valueOf(e.get(BxqkTeachingConstant.PARAM_ADDRESS_VALUE)).
43                         equals(String.valueOf(c.get(BxqkTeachingConstant.PARAM_ADDRESS_PARENT)))) {
44                     Map<String, Object> cityMap = new LinkedHashMap<>();
45                     cityMap.put(BxqkTeachingConstant.PARAM_ADDRESS_VALUE,
46                             c.get(BxqkTeachingConstant.PARAM_ADDRESS_VALUE) + "," + c.get(BxqkTeachingConstant.PARAM_ADDRESS_TYPE));
47                     cityMap.put(BxqkTeachingConstant.PARAM_ADDRESS_LABEL, c.get(BxqkTeachingConstant.PARAM_ADDRESS_LABEL));
48
49                     List<Map<String, Object>> levelThreeList = new ArrayList<>();
50                     countyList.forEach(t -> {
51                         Map<String, Object> levelThreeMap = new LinkedHashMap<>();
52                         if (String.valueOf(c.get(BxqkTeachingConstant.PARAM_ADDRESS_VALUE)).
53                                 equals(String.valueOf(t.get(BxqkTeachingConstant.PARAM_ADDRESS_PARENT)))) {
54                             levelThreeMap.put(BxqkTeachingConstant.PARAM_ADDRESS_VALUE,
55                                     t.get(BxqkTeachingConstant.PARAM_ADDRESS_VALUE) + "," + t.get(BxqkTeachingConstant.PARAM_ADDRESS_TYPE));
56                             levelThreeMap.put(BxqkTeachingConstant.PARAM_ADDRESS_LABEL, t.get(BxqkTeachingConstant.PARAM_ADDRESS_LABEL));
57                             levelThreeList.add(levelThreeMap);
58                         }
59                     });
60                     if (CollectionUtils.isNotEmpty(levelThreeList)) {
61                         cityMap.put(BxqkTeachingConstant.PARAM_ADDRESS_CHILDREN, levelThreeList);
62                     }
63                     secondList.add(cityMap);
64                 }
65             });
66             provinceMap.put(BxqkTeachingConstant.PARAM_ADDRESS_CHILDREN, secondList);
67             result.add(provinceMap);
68         });
69         redisCacheService.putToCache(BxqkTeachingConstant.PARAM_CACHE_PROVINCES, result);
70         return result;
71     } else {
72         throw new ParameterIllegalException(CommonConstant.PARAM_ERROR);
73     }
74 }

完事,记得都要放缓存呦→

记录点滴生活...

转载于:https://www.cnblogs.com/shuaishuai1993/p/9275041.html

java 数据库中获取省市级json数据相关推荐

  1. 从hbitmap中获取位图数据_如何快速从主流数据库中获取人/小鼠数据?

    点击上方"蓝色字体"关注我们 鹿明 生物 蛋白.代谢组学服务专家 关注我们收获更多 关注 随着生物科技的迅速发展,每天都会有海量的生物学数据产生,如何有效的分析这些"生物 ...

  2. java代码中获取配置文件信息数据

    获取properties文件信息 -- 从properties文件中获取信息 1 创建文件对象 private static Properties config = new Properties(); ...

  3. EF随机从数据库中获取一条数据

    ---DAL--- public virtual Head SearchOneImg(Expression<Func<Head, bool>> where){Specialty ...

  4. 在SQLite数据库中获取新插入数据自增长的ID值

    SQLiteDatabase  db = helper.getWritableDatabase(); db.execSQL("insert into person(name,phone,am ...

  5. (017)java后台开发之客户端通过HTTP获取接口Json数据

    通过前面的文章,我们能了解javaWeb工程的基本知识.然后最激动的东西来了!我们建立了JsonTest工程,部署到了tomcat,本地浏览器访问了我们的JsonTest工程的index.jsp页面. ...

  6. java向mysql写入数据慢_通过java代码往mysql数据库中写入日期相关数据少13个小时...

    通过show variables like '%time_zone%'; 查看时区: CST 时区 名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard ...

  7. c从sqlite3数据库中获取数据,并对数据进行拼接

    c从sqlite3数据库中获取数据,并对数据进行拼接 函数功能 对数据库的操作 创建数据库: 创建USER表: 创建表内数据: 查看表内数据: 查看表结构: 函数实现 函数编译: 函数结果: 函数功能 ...

  8. Android中怎获取json,Android应用中如何解析获取的json数据

    Android应用中如何解析获取的json数据 发布时间:2020-11-24 17:10:08 来源:亿速云 阅读:107 作者:Leah 这篇文章将为大家详细讲解有关Android应用中如何解析获 ...

  9. 解决从json文件中获取不到数据的问题

    解决从json文件中获取不到数据的问题 参考文章: (1)解决从json文件中获取不到数据的问题 (2)https://www.cnblogs.com/yhyanjin/p/7214776.html ...

最新文章

  1. springboot多模块项目,无法找到另一个模块的实体类
  2. Python中文分词 jieba 十五分钟入门与进阶
  3. python如何读取数据并输出为表格_Python实现将数据库一键导出为Excel表格的实例...
  4. 类似jquery的一个demo
  5. 草稿 DataGridView 控件 1129
  6. Centos7开放及查看端口
  7. Win8系统如何在桌面行显示我的电脑
  8. CodeVS 1576 最长严格上升子序列 (DP)
  9. bcd转ascii码 流程图_十进制ASCII与BCD码转换程序清单
  10. python支持xp32位系统吗_关于python在64位机器上打包32位exe(兼容xp系统)解决方法
  11. matlab imagesc 保存,在matlab中保存imagesc的精确图像输出
  12. 三维重建笔记——Linux环境下openMVG的安装
  13. 反向动力学 matlab IK,17动画系统(Mecanim)之IK(反向动力学)动画
  14. 循环神经网络模型及应用,循环神经网络应用举例
  15. 《道德经的人生智慧》读书笔记
  16. gis可达性分析步骤_【极简】城乡规划新技术GIS应用厦大李渊(1)
  17. 图 邻接矩阵幂的含义 离散数学定理14.11
  18. 语音识别之语音特征提取一
  19. 平台经济中国案例研究——网易云平台
  20. 软件开发视频资源分享

热门文章

  1. windows下定时利用bat脚本实现ftp上传和下载
  2. Linux 技巧:让进程在后台可靠运行的几种方法
  3. 支付宝PC即时到账和手机网站支付同步
  4. result的type属性
  5. jquery 动态生成html后click事件不触发原因
  6. OpenGL交互——菜单控制(基础教程)
  7. 贝塞尔曲线(B′ezier)基础
  8. 基于重力补偿的 PD 控制
  9. 汇编语言随笔(15)- 对键盘输入进行处理(int 9 和 int 16h 中断例程)
  10. js复制功能的有效方法总结新