zoukankan      html  css  js  c++  java
  • 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 }

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

    记录点滴生活...

  • 相关阅读:
    【尺取法】
    [USACO12MAR]花盆Flowerpot [单调队列]
    数据库笔记
    NYOJ 91 阶乘之和(贪心)
    NYOJ 71 独木舟上的旅行(贪心)
    水池数目(DFS)
    poj 1164城堡问题(DFS)
    NYOJ 12 喷水装置(二)( 贪心)
    NYOJ 6(贪心)
    NYOJ 45( 分治,大数)
  • 原文地址:https://www.cnblogs.com/shuaishuai1993/p/9275041.html
Copyright © 2011-2022 走看看