之前碰到过一个问题,如果大批量数据要插入到数据库怎么做?今天记录一下。

1.想法

我的想法是首先拿到需要插入的数据,最好是json数据或者是json格式的数组,通过筛选出必要的数据装载到一个集合数组中,然后批量插入到数据库即可。我觉得有两个地方是难点,第一个,json格式嵌套的很深,那么取值的工作会很艰难。第二个,对批量插入数据的这种方式是否熟悉。

2.第一步,拿到数据,并放到resource目录下。

[
{
    "code": "110100",
    "name": "市辖区",
    "parent_code": "110000"
},
{
    "code": "120100",
    "name": "市辖区",
    "parent_code": "120000"
},
{
    "code": "130100",
    "name": "石家庄市",
    "parent_code": "130000"
},
{
    "code": "130200",
    "name": "唐山市",
    "parent_code": "130000"
}]

数据的格式大概就是这样,嵌套的并不深,稍微循环一下就行。

3.第二步,拿到这个json文件并取值。

  public static void main(String[] args) throws  Exception {
        File jsonfile = ResourceUtils.getFile("classpath:city.json");  //通过Java自带的读取工具对文件目录下的文件进行读取
        String jsonsting  = FileUtils.readFileToString(jsonfile);      //读取到的文件转换成为String类型
        JSONArray array = JSONArray.parseArray(jsonsting);             //根据原本的类型转换为json数组
        Map<String,Object> maps = new TreeMap<>();                     //采用treemap的原因是想让数据有序,免得数据库里面的数据杂乱无章
        for (int i=0;i<array.size();i++){                              //遍历循环,根据不同的json文件采用不同的方式
            JSONObject jsons = JSONObject.parseObject(array.get(i).toString());     //遍历取
            maps.put(jsons.getString("code"),jsons.getString("name"));             //遍历存
        }
        //int counts = commonCityMapper.insertBatch(maps);
        System.out.println(maps);
        //System.out.println(list.get(0).get("130200"));
    }

感觉这个注释已经写得很仔细了,不懂的可以私信我。不要认为解析json文件很难,还要写工具类什么的,其实你只需要对Java这门语言多深入了解一点就会发现这些都是常用的东西。

4.将需要的数据遍历放到map数组里面之后就需要去存到数据库了

int insertBatch(@Param("mapData") Map<String, Object> mapData);

首先是mappper.java文件中的定义

<insert id="insertBatch" parameterType="map">
    insert into api_common_city (city_name, city_code)
    values
    <foreach item="value" index="key" collection="mapData.entrySet()" open="(" separator="),(" close=")">
      #{key}, #{value}
    </foreach>

  </insert>

这里是采用mybaits中的foreach形式进行遍历存储。首先我通过mapper.java传入一个map数组进来。collection通过遍历这个数组拿到值,将值value赋给item,将key赋给index,一个是存放数据,一个是标识起始位置,map数组每次取出一个key和一个value,所以不用担心会弄混。然后将key和value当做数据配合insert语句存储即可,速度非常快。

5.总结

还是要学好基础,如果不懂map的遍历,那么连mybatis里面的collection中的方法都不知道;如果对Java基础不了解,你连解析文件的工具类都要自己写;如果不动手,永远不知道在此之中可以学到很多知识。我们这一行,注定要多动手,多学习。

GitHub 加速计划 / js / json
41.72 K
6.61 K
下载
适用于现代 C++ 的 JSON。
最近提交(Master分支:1 个月前 )
960b763e 4 个月前
8c391e04 6 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐