java PreparedStatement Arraylist SQL

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(查询);

无法从ArrayList向my DB插入新值;我想将所有ArrayList添加到DB列列表、标题、ArrayList pars.getListId()、getTitleId()、pars.getAboutAr()中的about值中

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