java PreparedStatement Arraylist SQL
无法从ArrayList向my DB插入新值;我想将所有ArrayList添加到DB列列表、标题、ArrayList pars.getListId()、getTitleId()、pars.getAboutAr()中的about值中java PreparedStatement Arraylist SQL,java,sql,jdbc,arraylist,Java,Sql,Jdbc,Arraylist,无法从ArrayList向my DB插入新值;我想将所有ArrayList添加到DB列列表、标题、ArrayList pars.getListId()、getTitleId()、pars.getAboutAr()中的about值中 String query=“插入测试(列表、标题、关于)”+“值(?,?)”; 试一试{ htmlParse(“你好”); PreparedStatement preparedStmt=db.getConnection().prepareStatement(查询);
String query=“插入测试(列表、标题、关于)”+“值(?,?)”;
试一试{
htmlParse(“你好”);
PreparedStatement preparedStmt=db.getConnection().prepareStatement(查询);
for(int i=0;i
在执行update()之前,您需要修改代码,使每个代码都有一个参数1、2和3
我假设您的列表有相同数量的条目(否则将中断)
for(int i=0;i
现在,每个插入都设置了所有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();
}
String query=“插入测试(列表、标题、关于)”+“值(?,?)”;
try(PreparedStatement ps=con.PreparedStatement(查询)){
htmlParse(“你好”);
for(int index=0;index
在调用executeUpdate
之前,您必须设置所有三列
你正在做:
preparedStmt.setString(1, pars.getListId().get(i));
preparedStmt.executeUpdate();
因此,您只需在prepared语句中设置第一个参数,然后调用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();
}
然后使用
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();
}
for(int i=0;i
然后,它将为您提供尽可能多的行作为最短的列表
max
而不是min
),并为缺少的值设置空值(即,检查列表是否比i
要求的短。如果短,请使用setNull
而不是setString
)Par
。相反,我会创建一个类,可能命名为Par
或任何有意义的类,它有id
、title
和about
字段。然后我会在Par
中创建一个Par
对象的列表而不是三个单独的列表。这样,您就不会有不同长度的问题,并且数据结构将更像数据库中的数据结构请发布您得到的stacktrace。因此您的
PAR
有三个单独的列表?而不仅仅是一个数组列表?问题是您必须在executeUpdate
之前设置同一行的所有列,但是如果您有三个单独的列表,如果它们的长度不相同,您可能会遇到问题。它有3个ArrayList;s。现在我理解了还有,它们有不同的长度。但这并不能解决我的问题。你有一些错误吗?线程“main”java.sql.SQLException中的异常:没有为com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)中的参数2指定值com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2176)com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1993)com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1937)
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();
}
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();
}