中国省市区联动json数据导入Mysql

前言

开发工作中,总免不了一些地址选择,省市联动的下拉框等等开发工作
那么为了方便的获取中国的省市区数据,我编写使用java将这个json转存到MySql的程序。
可以给Code加上主键索引。
一定要注意直辖市
一定要注意直辖市
一定要注意直辖市
中国省市区联动json数据导入Mysql_第1张图片
直辖市的第一个城市的Code是重复的,不过我改成了110100.
尾数为4个0的一定是省。

准备工作

数据文件

2019年11月中华人民共和国县以上行政区划代码.json这个文件是我修复过BUG的,包括上面的直辖市代码重复
强烈推荐,只要1个金币支持一下

另一个免费下载地址
github下载,免费但是需要整理,里面的数据有点问题(最后面的code,name错乱)

获取数据的来源

什么地方可以获取最权威的省市县数据?当然是官网
中华人民共和国民政部

导入数据用到了阿里的FastJson

        <fastjson.version>1.2.45</fastjson.version>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${
     fastjson.version}</version>
        </dependency>

编写实体类

@Data
class Area {
     
    private String code;
    private String name;
}

@Data
class City {
     
    private String code;
    private String name;
    private List<Area> areaList;
}
   
@Data
class Province {
     
    private String code;
    private String name;
    private List<City> cityList;
}

解析JSON文件,并使用JDBC存入数据库

package cn.lanhi.city;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.Charsets;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class OHHHHHHHH{
     
    public static void main(String[] args) throws IOException, ClassNotFoundException, SQLException {
     
        //文件放到桌面啦
        String file = "C:\\Users\\snx\\Desktop\\2019年11月中华人民共和国县以上行政区划代码.json";
        InputStream inputStream = new FileInputStream(new File(file));
        byte[] bytes = new byte[inputStream.available()];
        StringBuffer buffer = new StringBuffer();
        //读取文件
        inputStream.read(bytes);
        buffer.append(new String(bytes, Charsets.UTF_8));
        inputStream.close();
        //解析JSON文件
        JSONArray all = JSONArray.parseArray(buffer.toString());
        List<Province> provinces = new ArrayList<>(all.size());
        for (int i = 0; i < all.size(); i++) {
     
            JSONObject _province = all.getJSONObject(i);
            //省
            Province province = new Province();
            province.setName(_province.getString("name"));
            province.setCode(_province.getString("code"));
            //市
            JSONArray _cityList = _province.getJSONArray("cityList");
            List<City> cityList = new ArrayList<>(_cityList.size());
            for (int j = 0; j < _cityList.size(); j++) {
     
                JSONObject _city = _cityList.getJSONObject(j);
                City city = new City();
                city.setCode(_city.getString("code"));
                city.setName(_city.getString("name"));
                //区
                JSONArray _areaList = _city.getJSONArray("areaList");
                List<Area> areaList = new ArrayList<>(_areaList.size());
                for (int k = 0; k < _areaList.size(); k++) {
     
                    JSONObject _area = _areaList.getJSONObject(k);
                    Area area = new Area();
                    area.setCode(_area.getString("code"));
                    area.setName(_area.getString("name"));
                    areaList.add(area);
                }
                city.setAreaList(areaList);
                cityList.add(city);
            }
            province.setCityList(cityList);
            //到这里数据解析完成,全部存入provinces
            provinces.add(province);
        }
        String url = "jdbc:mysql://localhost:3306/DB?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai";
        String userName = "yourName";
        String pwd = "yourPassword";
        String driver = "com.mysql.cj.jdbc.Driver";
//        String driver = "com.mysql..jdbc.Driver";//根据你个人情况
        //接下来是存入数据库
        Class.forName(driver);
        Connection connection = DriverManager.getConnection(url, userName, pwd);
        PreparedStatement ps = connection.prepareStatement("insert into city values (?,?,?,?)");
        for (int i = 0; i < provinces.size(); i++) {
     
            Province p = provinces.get(i);
            ps.setString(1, p.getCode());
            ps.setString(2, p.getName());
            ps.setInt(3, p.getLevel());
            ps.setString(4, "0");
            ps.addBatch();
            List<City> cityList = p.getCityList();
            for (int j = 0; j < cityList.size(); j++) {
     
                City c = cityList.get(j);
                ps.setString(1, c.getCode());
                ps.setString(2, c.getName());
                ps.setInt(3, c.getLevel());
                ps.setString(4, p.getCode());
                ps.addBatch();
                List<Area> areaList = c.getAreaList();
                areaList.forEach(a -> {
     
                    try {
     
                        ps.setString(1, a.getCode());
                        ps.setString(2, a.getName());
                        ps.setInt(3, a.getLevel());
                        ps.setString(4, c.getCode());
                        ps.addBatch();
                    } catch (SQLException e) {
     
                        e.printStackTrace();
                    }
                });
            }
        }
        System.out.println(ps.executeBatch());
        ps.close();
        connection.close();
    }
}

数据库设计

CREATE TABLE `city` (
  `code` varchar(20) NOT NULL DEFAULT '' COMMENT '节点代码',
  `name` varchar(100) DEFAULT '' COMMENT '节点名称',
  `type` tinyint(2) DEFAULT NULL COMMENT '等级(1省,2市,3区)',
  `pcode` varchar(20) DEFAULT '' COMMENT '父节点id',
  PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

你可能感兴趣的:(程序,java,mysql,jdbc,sql)