【问题标题】:Insert JSON Nested Arrays Into MySQL将 JSON 嵌套数组插入 MySQL
【发布时间】:2017-10-29 22:54:01
【问题描述】:

我面临以下问题。我从用户那里获得 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();
        }
    }
}

数据库:

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

【问题讨论】:

  • 应该是for(int i=0; i&lt;device.size(); i++) 如果device.size()=3,这将运行循环3次。对于相同的情况,您的循环仅运行代码 2 次。
  • 嗨。 @Riya您的评论确实有助于解决我的问题。谢谢。

标签: java mysql json jdbc


【解决方案1】:

两件事:

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

    for(int i=0; i

应该是

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

被调用 3 次。

  1. 我认为您执行批处理的计数器已关闭:

这就是你所拥有的:

        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();
        }

然后它应该可以工作

【讨论】:

  • 嗨。 @Jan 答案中的第一件事足以解决我的问题。我在答案中尝试了第二件事,它一次尝试更新我表上的重复数据。请参阅附图以获取更多信息。 Picture
猜你喜欢
  • 2016-04-18
  • 1970-01-01
  • 2011-12-05
  • 2018-06-19
  • 2018-12-29
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多