繁体   English   中英

java PreparedStatement Arraylist SQL

[英]java PreparedStatement Arraylist SQL

无法从ArrayList向我的数据库插入新值; 我想将所有ArrayList添加到DB列列表,标题,关于来自ArrayLists的值.satListId(),getTitleId(),pars.getAboutAr()。

String query = "insert into test (list, title, about)" + "VALUES (?, ?, ?)";

    try {
        pars.htmlParse("hello");
        PreparedStatement preparedStmt = db.getConnection().prepareStatement(query);
        for (int i = 0; i < pars.getListId().size(); i++) {
            preparedStmt.setString(1, pars.getListId().get(i));
            preparedStmt.executeUpdate();
        }
        for (int i = 0; i < pars.getTitleId().size(); i++) {
            preparedStmt.setString(2, pars.getTitleId().get(i));
            preparedStmt.executeUpdate();
        }
        for (int i = 0; i < pars.getAboutAr().size(); i++) {
            preparedStmt.setString(3, pars.getAboutAr().get(i));
            preparedStmt.executeUpdate();
        }
        preparedStmt.execute();


        } catch (IOException e1) {
        e1.printStackTrace();

在调用executeUpdate之前,您必须设置所有三列。

你在做:

        preparedStmt.setString(1, pars.getListId().get(i));
        preparedStmt.executeUpdate();

因此,您只需在executeUpdate准备语句中设置第一个参数,然后调用executeUpdate 但你需要拥有这三个。

你应该有一个循环,将所有三个一起插入:

    for (int i = 0; i < pars.getListId().size(); i++) {
        preparedStmt.setString(1, pars.getListId().get(i));
        preparedStmt.setString(2, pars.getTitleId().get(i));
        preparedStmt.setString(3, pars.getAboutAr().get(i));
        preparedStmt.executeUpdate();
    }

这会在执行之前设置语句中的所有三列。 因此,您将获得一个包含所有值的正确插入语句。

这里的一个问题是,例如, pars.getListId()有5个项,而pars.getTitleId()pars.getAboutAr()有4个项。 然后,当你运行上面的循环时,当i到达值4你会得到一个异常,因为pars.getTitleId()没有值4(因为它只有4个项目)。

这可以有几种解决方案。

  1. 如果您知道解析的结果总是等长列表,那么这不是问题。
  2. 您只能插入最短列表中的值。 您可以进行如下计算:

     int minSize = Collections.min( Arrays.asList( pars.getListId().size(), pars.getTitleId().size(), pars.getAboutAr().size() ) ); 

    然后使用

     for (int i = 0; i < minSize; i++) { preparedStmt.setString(1, pars.getListId().get(i)); preparedStmt.setString(2, pars.getTitleId().get(i)); preparedStmt.setString(3, pars.getAboutAr().get(i)); preparedStmt.executeUpdate(); } 

    然后它将为您提供与最短列表一样多的行。

  3. 您可以使用最长的列表(在上面的计算中执行max而不是min )并为缺失值设置空值(即,检查列表是否比i需要的更短。如果是,请使用setNull而不是setString

  4. 就个人而言,我不会建pars你有办法,有三个不同的列表。 相反,我会创建一个类,可能名为Par或任何有意义的类,它有idtitleabout字段。 然后我会在我的pars创建一个Par对象列表而不是三个单独的列表。 然后,您将不会遇到不同长度的问题,数据结构将更像您在数据库中的内容。

在executeUpdate()之前,您需要修改代码,每个代码都有一个参数1,2和3。

我假设你的列表有相同数量的条目(否则会破坏)

    for (int i = 0; i < pars.getListId().size(); i++) {
        preparedStmt.setString(1, pars.getListId().get(i));
        preparedStmt.setString(2, pars.getTitleId().get(i));
        preparedStmt.setString(3, pars.getAboutAr().get(i));
        preparedStmt.executeUpdate();
    }

现在每个插页都有3组。

而不是尝试设置每个参数然后执行更新,这使得查询处于无效状态(因为并非所有参数都已设置),您应该为每个元素设置每个参数,然后执行更新。

例如,更好的解决方案是使用批量更新过程

String query = "insert into test (list, title, about)" + "VALUES (?, ?, ?)";
try (PreparedStatement ps = con.prepareStatement(query)) {
    pars.htmlParse("hello");
    for (int index = 0; index < pars.getListId().size(); index++) {
        ps.setString(1, pars.getListId().get(index));
        ps.setString(2, pars.getTitleId().get(index));
        ps.setString(3, pars.getAboutAr().get(index));
        ps.addBatch();
    }
    ps.executeBatch();
} catch (SQLException exp) {
    exp.printStackTrace();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM