无法从ArrayList向我的数据库插入新值;我想将所有ArrayList添加到DB列列表,标题,关于ArrayLists pars.getListId(),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
即可。但是您需要同时具备这三个条件。您应该有一个将所有三个插入在一起的循环:
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个项目)。这可以有几种解决方案。
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();
}
然后它将为您提供与最短列表一样多的行。
max
代替min
),并为缺失值设置空值(即,检查列表是否比i
要求的短。如果是,请使用setNull
而不是setString
。pars
。相反,我将创建一个类,可能名为Par
或任何有意义的类,该类具有id
,title
和about
字段。然后,我将在Par
中创建一个pars
对象的列表,而不是三个单独的列表。这样,您就不会遇到长度不同的问题,并且数据结构将更像数据库中的数据结构。