java prepared语句查询返回一个错误,但如果我打印它并直接在数据库上执行,它就会工作

java prepared语句查询返回一个错误,但如果我打印它并直接在数据库上执行,它就会工作,java,mysql,prepared-statement,Java,Mysql,Prepared Statement,我有下面的代码,它试图从XML文件创建查询并将其添加到批处理中,这样我就可以执行大批量执行,但它对我不起作用,因为我一直收到一个错误,因此我尝试在不进行批处理的情况下执行preparedstatement,并一直收到一个错误,即: “您的SQL语法有错误;请检查以下手册: 对应于您的MySQL服务器版本,以便使用正确的语法 第行“部门编号、部门名称值('d009’、'Customer Service')”附近 1“ 虽然调试代码时,我发现准备好的语句中的查询是插入到departments dep

我有下面的代码,它试图从XML文件创建查询并将其添加到批处理中,这样我就可以执行大批量执行,但它对我不起作用,因为我一直收到一个错误,因此我尝试在不进行批处理的情况下执行preparedstatement,并一直收到一个错误,即:

“您的SQL语法有错误;请检查以下手册: 对应于您的MySQL服务器版本,以便使用正确的语法 第行“部门编号、部门名称值('d009’、'Customer Service')”附近 1“

虽然调试代码时,我发现准备好的语句中的查询是
插入到departments dept\u no,dept\u name value('d009','Customer Service')
我不知道发生了什么事,是否有人能提出建议并帮助我将其作为一个大批量执行

以下是我的方法:

public void invokePreparedStatement(QueryBuilder queryBuilder) {
    queryRunner = new QueryRunner();

    StringBuilder query = new StringBuilder();
    query.append("INSERT INTO " + queryBuilder.getTableName());
    QName columns;
    String values;

    for (int i = 0; i < queryBuilder.getColumns().size(); i++) {
        columns = (queryBuilder.getColumns().get(i));
        query.append(" " + columns.toString());
        if (i != queryBuilder.getColumns().size() - 1)
            query.append(", ");
        else
            query.append(" VALUES (");
    }

    for (int i = 0; i < queryBuilder.getValues().size(); i++) {
        query.append("?");
        if (i != queryBuilder.getValues().size() - 1)
            query.append(", ");
        else
            query.append(")");
    }

    try {
        PreparedStatement preparedStatement = connection.prepareStatement(query.toString());
        StringBuilder s = new StringBuilder();
        preparedStatement = buildQuery(queryBuilder, preparedStatement);
        preparedStatement.execute();
        connection.commit();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public PreparedStatement buildQuery(QueryBuilder queryBuilder, PreparedStatement ps) throws SQLException {
    StringBuilder query = new StringBuilder("INSERT INTO ");
    query.append(queryBuilder.getTableName() + " (");
    QName columns;
    String values;
    int counter;
    for (int i = 0; i < queryBuilder.getColumns().size(); i++) {
        getCoulmnAndValue(queryBuilder, query, i);
        if (i != queryBuilder.getColumns().size() - 1)
            query.append(", ");
        else
            query.append(") VALUES (");
    }

    for (int i = 0; i < queryBuilder.getValues().size(); i++) {
        values = (queryBuilder.getValues().get(i));
        query.append(values);
        if (i != queryBuilder.getValues().size() - 1)
            query.append(", ");
        else
            query.append(")");
        counter = i + 1;
        ps.setObject(counter, values);
    }

    return ps;
}
public void invokePreparedStatement(QueryBuilder QueryBuilder){
queryRunner=新的queryRunner();
StringBuilder查询=新建StringBuilder();
append(“插入到”+queryBuilder.getTableName());
QName列;
字符串值;
对于(int i=0;i
假设您的
queryBuilder
有一个名为
T
的表,有两列名为
A
B
。生成的SQL是:

插入到T A,B值(?,)
这是无效的语法,因为列名必须位于
()

插入T(A,B)值(?,)
这正是错误消息所说的,当它说问题在
A
附近时,因为A
就在那里缺失了。不仅是“附近”,而且就在那里

与其测试
大小-1
,我建议按如下方式编码:

StringBuilder查询=新建StringBuilder();
query.append(“插入到”)
.append(queryBuilder.getTableName())
.附加(“(”);
对于(int i=0;i
假设您的
queryBuilder
有一个名为
T
的表,其中有两列名为
A
B
。生成的SQL是:

插入到T A,B值(?,)
这是无效的语法,因为列名必须位于
()

插入T(A,B)值(?,)
这正是错误消息所说的,当它说问题在
A
附近时,因为A
就在那里缺失了。不仅是“附近”,而且就在那里

与其测试
大小-1
,我建议按如下方式编码:

StringBuilder查询=新建StringBuilder();
query.append(“插入到”)
.append(queryBuilder.getTableName())
.附加(“(”);
对于(int i=0;i
在哪里绑定参数?在哪里/何时设置位置参数?我没有看到任何
setXXX
调用,例如
setInteger
setString
etc@javadba您可以在第二个for循环末尾的buildQuery方法中找到,我怀疑这一行,但想不出更好的方法以动态方式设置定位参数的方法,因为每次调用查询时可能会有不同数量的参数在哪里绑定参数?您实际在哪里/何时设置定位参数?我没有看到任何
setXXX
调用,例如
setInteger
setString
etc@java你可以吗