java 数据库中获取省市级json数据
需求:
根据数据库表,获取省市县的级连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数据相关推荐
- 从hbitmap中获取位图数据_如何快速从主流数据库中获取人/小鼠数据?
点击上方"蓝色字体"关注我们 鹿明 生物 蛋白.代谢组学服务专家 关注我们收获更多 关注 随着生物科技的迅速发展,每天都会有海量的生物学数据产生,如何有效的分析这些"生物 ...
- java代码中获取配置文件信息数据
获取properties文件信息 -- 从properties文件中获取信息 1 创建文件对象 private static Properties config = new Properties(); ...
- EF随机从数据库中获取一条数据
---DAL--- public virtual Head SearchOneImg(Expression<Func<Head, bool>> where){Specialty ...
- 在SQLite数据库中获取新插入数据自增长的ID值
SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("insert into person(name,phone,am ...
- (017)java后台开发之客户端通过HTTP获取接口Json数据
通过前面的文章,我们能了解javaWeb工程的基本知识.然后最激动的东西来了!我们建立了JsonTest工程,部署到了tomcat,本地浏览器访问了我们的JsonTest工程的index.jsp页面. ...
- java向mysql写入数据慢_通过java代码往mysql数据库中写入日期相关数据少13个小时...
通过show variables like '%time_zone%'; 查看时区: CST 时区 名为 CST 的时区是一个很混乱的时区,有四种含义: 美国中部时间 Central Standard ...
- c从sqlite3数据库中获取数据,并对数据进行拼接
c从sqlite3数据库中获取数据,并对数据进行拼接 函数功能 对数据库的操作 创建数据库: 创建USER表: 创建表内数据: 查看表内数据: 查看表结构: 函数实现 函数编译: 函数结果: 函数功能 ...
- Android中怎获取json,Android应用中如何解析获取的json数据
Android应用中如何解析获取的json数据 发布时间:2020-11-24 17:10:08 来源:亿速云 阅读:107 作者:Leah 这篇文章将为大家详细讲解有关Android应用中如何解析获 ...
- 解决从json文件中获取不到数据的问题
解决从json文件中获取不到数据的问题 参考文章: (1)解决从json文件中获取不到数据的问题 (2)https://www.cnblogs.com/yhyanjin/p/7214776.html ...
最新文章
- springboot多模块项目,无法找到另一个模块的实体类
- Python中文分词 jieba 十五分钟入门与进阶
- python如何读取数据并输出为表格_Python实现将数据库一键导出为Excel表格的实例...
- 类似jquery的一个demo
- 草稿 DataGridView 控件 1129
- Centos7开放及查看端口
- Win8系统如何在桌面行显示我的电脑
- CodeVS 1576 最长严格上升子序列 (DP)
- bcd转ascii码 流程图_十进制ASCII与BCD码转换程序清单
- python支持xp32位系统吗_关于python在64位机器上打包32位exe(兼容xp系统)解决方法
- matlab imagesc 保存,在matlab中保存imagesc的精确图像输出
- 三维重建笔记——Linux环境下openMVG的安装
- 反向动力学 matlab IK,17动画系统(Mecanim)之IK(反向动力学)动画
- 循环神经网络模型及应用,循环神经网络应用举例
- 《道德经的人生智慧》读书笔记
- gis可达性分析步骤_【极简】城乡规划新技术GIS应用厦大李渊(1)
- 图 邻接矩阵幂的含义 离散数学定理14.11
- 语音识别之语音特征提取一
- 平台经济中国案例研究——网易云平台
- 软件开发视频资源分享