无法从ArrayList向我的数据库插入新值;我想从ArrayLists pars.getListId(),getTitleId(),pars.getAboutAr()中将所有ArrayList添加到DB列 list,title,about 值。
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();
答案 0 :(得分:1)
在调用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
个对象列表,而不是三个单独的列表。然后你就不会遇到不同长度的问题,数据结构将更像你在数据库中所拥有的。答案 1 :(得分:0)
在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组。
答案 2 :(得分:0)
您应该为每个元素设置每个参数,然后执行更新,而不是尝试设置每个参数然后执行更新,这会使查询处于无效状态(因为并非所有参数都已设置)。
然后更好的解决方案是使用批量更新流程,例如
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();
}