java prepared语句查询返回错误但是如果我打印它并直接在数据库上执行它就可以了

时间:2017-05-12 08:22:54

标签: java mysql prepared-statement

我有以下代码安静,它试图从XML文件创建一个查询并将其添加到批处理中以便我可以执行大批量执行,但它不能为我工作,因为我一直收到错误,所以我试过在没有批处理的情况下执行preparedstatement并继续收到错误说:

  

“您的SQL语法有错误;请查看手册   对应于您的MySQL服务器版本,以便使用正确的语法   在'dept_no,dept_name VALUES('d009','客户服务')'附近   1"

虽然当我调试代码时,我得到的是准备好的语句中的查询是INSERT INTO departments dept_no, dept_name VALUES ('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;
}

1 个答案:

答案 0 :(得分:2)

我们假设您的queryBuilder有一个名为T的表,其中有两列名为AB。然后生成的SQL是:

INSERT INTO T A,  B VALUES (?, ?)

这不是有效的语法,因为列名必须在()

INSERT INTO T (A, B) VALUES (?, ?)

这正是错误消息所说的,当它说问题接近A时,因为(缺少就在那里。不只是&#34;在&#34;附近,而是在那里。

我没有测试size - 1,而是建议编码如下:

StringBuilder query = new StringBuilder();
query.append("INSERT INTO ")
     .append(queryBuilder.getTableName())
     .append(" (");
for (int i = 0; i < queryBuilder.getColumns().size(); i++) {
    if (i != 0)
        query.append(", ");
    query.append(queryBuilder.getColumns().get(i));
}
query.append(") VALUES (");
for (int i = 0; i < queryBuilder.getValues().size(); i++) {
    if (i != 0)
        query.append(", ");
    query.append("?");
}
query.append(")");