将JSON嵌套数组插入MySQL

时间:2017-05-29 15:12:57

标签: java mysql json jdbc

我面临的问题如下。我从用户那里获得JSON输入,其中包含多个嵌套数组并存储到MySQL数据库中。问题就像我在下面的JSON输入中使用device_id 2,3和4的数据但是在使用POST方法在POSTMan中执行JSON后,我只能存储device_id的数据2,3和4无法保存到数据库。我尝试了其他数量的数据,它也是一样的。

JSON输入:

{
    "app_id":"1",
    "token":"1",
    "device":
    [
        {
            "device_id":"2",
            "setting_id":"2",
            "batch_id":"2",
            "time":"2017-02-07 16:00:00",
            "power":"2"
        },
        {
            "device_id":"3",
            "setting_id":"3",
            "batch_id":"3",
            "time":"2017-02-07 15:00:00",
            "power":"3"
        },
        {
            "device_id":"4",
            "setting_id":"4",
            "batch_id":"4",
            "time":"2017-02-07 14:00:00",
            "power":"4"
        }
    ]
}

数据库代码:

public void setSPowerCons(String app_id, String token, ArrayList<PowerConsA> device){
    Connection conn = null;
    PreparedStatement prst = null;

    try{
        //Register JDBC driver
        Class.forName(JDBC_DRIVER);
        //Open a connection
        conn = DriverManager.getConnection(DB_URL);
        String SQL = "INSERT INTO powerConsumption"
                + "(app_id, token, device_id, setting_id, batch_id, time, power)" 
        + "VALUES(?, ?, ?, ?, ?, ?, ?)";
        prst = conn.prepareStatement(SQL);
        //Bind VALUES into parameters
        int j=0;
        prst.setString(1, app_id);
        prst.setString(2, token);
        for(PowerConsA powerconsa : device){
            for(int i=0; i<device.size()-1; i++){
                prst.setString(3, device.get(i).getDevice_id());
                prst.setString(4, device.get(i).getSetting_id());
                prst.setString(5, device.get(i).getBatch_id());
                prst.setString(6, device.get(i).getTime());
                prst.setString(7, device.get(i).getPower());
                prst.addBatch();
            }   
            if(j%1000==0||j==device.size()){
                prst.executeBatch();
            }
            j++;
        }
        prst.close();
        conn.close();
    }
    catch(Exception e){
        e.printStackTrace();
    }
    finally{
        try{
            if(prst != null){
                prst.close();
            }
        }
        catch(SQLException sqle){
            sqle.printStackTrace();
        }
        try{
            if(conn != null){
                conn.close();
            }
        }
        catch(SQLException sqle1){
            sqle1.printStackTrace();
        }
    }
}

数据库: Database

感谢所有帮助解决这个问题的人,并帮助指出我的错误。

1 个答案:

答案 0 :(得分:1)

两件事:

  1. 您的循环变量计算得不够:

    for(int i = 0; i

  2. 应该是

      for(int i=0; i<device.size(); i++){
    

    被召唤3次。

    1. 我认为您执行批处理的计数器已关闭:
    2. 这就是你所拥有的:

              if(j%1000==0||j==device.size()){
                  prst.executeBatch();
              }
              j++;
      

      这将...

      • 执行j == 0
      • 它将在j == 1
      • 上执行
      • 它将在j == 2
      • 上执行
      • 它将从不调用j == 3(因为循环已经退出)

      将其更改为:

              ++j;
              if(j%1000==0||j==device.size()){
                  prst.executeBatch();
              }
      

      然后它应该工作