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 }

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

记录点滴生活...

猜你喜欢

转载自www.cnblogs.com/shuaishuai1993/p/9275041.html